Vraag Hoe echo "$ x_ $ y" in bash-script?


Het is erg interessant dat als je van plan bent om als "0_1" te tonen met bash de code gebruikt

x=0
y=1
echo "$x_$y"

dan wordt het alleen weergegeven

1

Ik heb geprobeerd echo "$x\_$y" en het werkt niet.

Dus mijn vraag is hoe de vorm $ x_ $ y te echoën? Ik ga het gebruiken op een bestandsnaamstring.


13
2018-01-18 01:08


oorsprong


antwoorden:


Omdat variabele namen mogen onderstrepingstekens bevatten, de opdracht:

echo "$x_$y"

probeert te echoën ${x_} (wat waarschijnlijk leeg is in jouw geval) gevolgd door ${y}. De reden hiervoor is omdat parameteruitbreiding een hebzuchtige bewerking is - het zal zoveel mogelijk legale tekens bevatten na de $ om een ​​variabele naam te vormen.

Het relevante deel van de bash manpage staten:

De $ karakter introduceert parameteruitbreiding, opdrachtvervanging of rekenkundige uitbreiding.

De parameternaam of het symbool dat moet worden uitgebreid, mag tussen accolades worden geplaatst, maar deze zijn optioneel dienen om de uit te breiden variabele te beschermen tegen tekens die er onmiddellijk op volgen en die kunnen worden geïnterpreteerd als onderdeel van de naam.

Wanneer beugels worden gebruikt, is de overeenkomende eindbeugel de eerste } niet ontsnapt door een backslash of binnen een geciteerde tekenreeks, en niet binnen een ingesloten rekenkundige uitbreiding, opdrachtvervanging of parameteruitbreiding.

Daarom is de oplossing ervoor te zorgen dat de _ is niet behandeld als onderdeel van de eerste variabele, die kan worden gedaan met:

echo "${x}_${y}"

Ik ben geneigd om te doen alle mijn bashvariabelen zoals deze, zelfs standalone zoals:

echo "${x}"

omdat het explicieter is en ik in het verleden zo vaak ben gebeten :-)


23
2018-01-18 01:24



Op deze manier:

$ echo "${x}_${y}"
0_1

11
2018-01-18 01:09



verpak het in accolades:

echo "${x}_${y}"


8
2018-01-18 01:09



Gewoon om tegen de trend in te gaan, je kunt dit ook doen:

echo $x'_'$y

Je kunt geciteerde en niet-geciteerde delen naast elkaar plaatsen zonder tussenruimte. En sindsdien ' is geen juridisch karakter voor een variabele naam, bash zal alleen worden vervangen $x. :)


5
2018-01-18 01:38