chaîne de formatage dans bash
J'ai le code suivant qui fonctionne dans un script shell,
foo=`seq 1 1 100`
for i in $foo; do
echo "input$i\_now"
done
Voici ma question: Sous certaines conditions, la sortie des impressions input1_now
alors que othertimes il imprime input1\_now
. Je suis sûr que quelque chose est différent, mais je ne peux pas comprendre ce qu'il fait imprimer un sens ou dans l'autre. Si mon code est
for i in $foo; do
echo "input$i_now"
done
Je reçois toujours input
avec le reste de la ligne étant omis.
Je sais que je peux utiliser input${i}_now
au lieu et s'imprimer correctement à chaque fois, mais je suis surtout intéressé à comprendre pourquoi la sortie est différente en apparence les mêmes conditions.
Mise à JOUR:
Dans l'exemple suivant, la première partie correctement formats variables et de texte tel que le \_
est remplacé comme _
. Cependant, la dernière partie m'a obligé à la place des variables dans les accolades, afin de les avoir mis en forme correctement.
echo "Enter Simulation #: "
read sim
g.mapset results
for i in `seq 1 1 100`; do
file=sim$sim\_run$i\_sum
g.copy $file\@expSim$sim\_$i,$file
file=sim$sim\_run$i\_average
g.copy $file\@expSim$sim\_$i,$file
for year in `seq 2004 1 2006`; do
file=sim$sim\_$year\_run$i\_sum
g.copy $file\@expSim$sim\_$i,$file
file=sim$sim\_$year\_run$i\_average
g.copy $file\@expSim$sim\_$i,$file
done
years="2004 2005 2006"
times=`seq -w 1 16 365`
runs=`seq 1 1 100`
for year in $years; do
for ptime in $times; do
for i in $runs; do
if [ $i -eq 1 ]; then
g.copy vect=sim${sim}_pts_${year}_${ptime}_run${i}@expSim${sim}_${i},sim${sim}_pts_${year}_${ptime}
fi
if [ $i -gt 1 ]; then
v.patch input=sim${sim}_pts_${year}_${ptime}_run${i}@expSim${sim}_${i} output=sim${sim}_pts_${year}_${ptime} -e -a --o
fi
done
done
done
- Il imprime
inputx\_now
cohérente pour moi.
Vous devez vous connecter pour publier un commentaire.
Est
_
censé être un espace réservé qui est parfois un caractère différent?Dans
bash
,"input$i\_now"
avec une réelle_
produira toujoursinput1\_now
. À l'intérieur des guillemets,bash
ne supprime une\
lorsqu'il est suivi d'un$
, un`
, un"
, un\
, ou un saut de ligne. Voir Des “Guillemets” dans le Bash Manuel de Référence. C'est la norme POSIX comportement; voir “Guillemets” dans Shell de Commande de la Langue.Mise à JOUR
Si vous écrivez
"input$i_now"
,bash
sera juste l'impressioninput
. Il ne s'imprime pasinput1
ouinput1_now
. Il le fait parce que_
est un paramètre valide nom de personnage, doncbash
pense que vous demandez pour la valeur de lai_now
paramètre. Sauf si vous avezi_now
à une chaîne non vide,bash
permettra d'élargir$i_now
à la chaîne vide, transformant ainsi"input$i_now"
eninput
.Mise à JOUR 2
Maintenant que vous avez posté de code réel, nous pouvons voir ce qui se passe.
Tout d'abord, dans le code que vous avez posté, vous n'avez jamais utilisé des guillemets autour d'un paramètre d'expansion. Cela fait une différence.
À l'extérieur des guillemets, un
\
est toujours supprimée. Voir “Citation de Suppression de” dans le Bash Manuel de Référence. Doncinput$i\_now
(avec pas environnant les guillemets) s'input1_now
.Cependant, comme je l'ai expliqué dans ma première mise à jour,
_
est un paramètre de nom de personnage. Voir “Nom” Shell de Commande de la Langue. Alors, quandbash
voitinput$i_now
, il fauti_now
comme le nom du paramètre.Que vous soyez ou non à l'aide de guillemets, vous doit séparer le nom du paramètre à partir de la suite de caractères, si
bash
serait autrement traiter les caractères suivants dans le cadre du nom du paramètre. Vous pouvez le faire en mettant\
après le nom du paramètre, ou vous pouvez le faire en mettant le nom du paramètre dans{...}
.Il est plus sûr de toujours utiliser
{...}
, parce que (comme vous l'avez découvert?)\
est traitée différemment selon qu'il est à l'intérieur des guillemets. Si vous revenez en arrière et ajouter des guillemets plus tard, et vous avez utilisé\
, vous aurez besoin de changer la\
à{...}
de toute façon.Mise à JOUR 3
Voici une démonstration des effets de
\
,{...}
, et double-citant. Tout d'abord, nous avons mis en place certaines variables:Voici ce qui se passe avec ne citant que ce soit:
Voici ce qui se passe si on utilise simplement
{...}
sans les guillemets:Si l'on ajoute les guillemets, ils n'ont aucun effet:
Voici ce qui se passe si on utilise simplement
\
:Avis que chaque
\
a été supprimé. La coquille supprime un\
si il n'est pas cité.Si l'on ajoute les guillemets, ils empêchent la coque de la suppression de chaque
\
:_
est toujours un réel_
_
quand précédé par$i
dans le cas deinput$i_now
input1_now
au lieu deinput1\_now
. Droit maintenant, votre question est fondamentalement “Mon ordinateur actes drôle parfois. Pourquoi? Je ne peux pas fournir plus de détails.”input$i_now
il sera de sortieinput1
et ignorer le reste de la ligne.input1
plutôt justeinput
. Mais je suis toujours pas à comprendre pourquoiinput$i\_now
imprimeinput1_now
parfois et d'autres foisinput1\_now
. Il semble incohérent. Je suis sûr que je suis en train de faire quelque chose de différent, mais je ne peux pas le voir.Vous devez expliquer à bash que vous voulez l' $variable i:
La différence:
input$i\_now