Právě jsem narazil na několik odpovědí, jako je analýza textového souboru s oddělovači…, které používají konstrukci:
while IFS=, read xx yy zz;do
echo $xx $yy $zz
done < input_file
kde IFS
proměnná je nastavena před read
příkaz.
Četl jsem odkaz na bash, ale nemohu přijít na to, proč je to legální.
Zkusil jsem
$ x="once upon" y="a time" echo $x $y
z příkazového řádku bash, ale nic se neozvalo. Může mi někdo ukázat, kde je tato syntaxe definována v odkazu, který umožňuje nastavit proměnnou IFS tímto způsobem? Je to speciální případ nebo mohu udělat něco podobného s jinými proměnnými?
Přijatá odpověď:
Relevantní informace lze nalézt na manuálové stránce poskytnuté správcem BASH (naposledy zkontrolována v srpnu 2020). Část Shell Grammar, Stavy jednoduchých příkazů (zvýraznění přidáno):
Jednoduchý příkaz je sekvence volitelných přiřazení proměnných následují slova a přesměrování oddělená prázdnými znaky a ukončena kontrolním operátorem. První slovo určuje příkaz, který se má provést, a je předán jako argument nula. Zbývající slova jsou předána jako argumenty vyvolanému příkazu.
Můžete tedy předat jakoukoli proměnnou, kterou chcete. Vaše echo
příklad nefunguje, protože proměnné jsou předány příkazu, nejsou nastaveny v shellu. Shell expanduje $x
a $y
před vyvolání příkazu. Funguje to například:
$ x="once upon" y="a time" bash -c 'echo $x $y'
once upon a time