Portál AbcLinuxu, 6. května 2025 08:58
Chtěl jsem si ušetřit práci zpracováním seznamu předaného smyčce a narazil na zajímavý problém. Nějak prapodivně mi funguje echo ve smyčce.
Asi nejlépe to bude demonstrovat na příkladu:
user@stroj:~$ cat osoby.txt ja ty on ona ono user@stroj:~$ for i in $(<osoby.txt); do echo "aa$i" ; done aaja aaty aaon aaona aaono user@stroj:~$ for i in $(<osoby.txt); do echo "$iaa" ; done user@stroj:~$ for i in $(<osoby.txt); do echo "$i aa" ; done aa aa aa aaa aaoNějak se nemůžu zbavit dojmu, že by správně měl výsledek druhé smyčky vypadat takto:
user@stroj:~$ for i in $(<osoby.txt); do echo "$iaa" ; done jaaa tyaa onaa onaaa onoaa user@stroj:~$ for i in $(<osoby.txt); do echo "$i aa" ; done ja aa ty aa on aa ona aaa ono aaProtože když udělám spojení proměnné s řetězcem přímo, tak to vypadá takto..
user@stroj:~$ osoba="nekdo" user@stroj:~$ echo "$osoba jiny" nekdo jinyJe to normální? Nebo dělám někde něco blbě? Nebo mi už hrabe?
Tiskni
Sdílej:
"$iaa" je evidentne blbe - promenou iaa tam nemas. Kdyztak "${i}aa". Nevim, proc ti nefunguje "$i aa", to by melo byt v poradku. Mozna zkus nahradit vyraz v for cyklu na `cat soubor` (a nebo jeste lepe pouzit 'while read i'), zda neni problem v tom.
Nevim, proc ti nefunguje "$i aa"
, to by melo byt v poradku.
To je opravdu v pořádku:
mike@unicorn:~/tmp> for i in $(<osoby.txt); do echo "$i aa" ; done ja aa ty aa on aa ona aa ono aa
Problém tazatele bude nejspíš v něčem jiném, co v této ukázce není vidět.
"$i aa"
byl ve skutečnosti CR.
echo "$iaa"
by mělo být takto: echo "${i}aa"
, ne?
Proč záhadného? Záhadné by bylo, kdyby k ní nedošlo. Vyskytne-li se za dolarem písmeno* nebo podtržítko, pak se všechno, co následuje až k prvnímu znaku, který není písmeno*, číslice nebo podtržítko, považuje za název proměnné a výsledkem expanze je hodnota této proměnné. Neexistuje-li, výsledkem expanze je prázdný řetězec.
* anglické abecedy
No v tom pripade skript vlastne perfektne fungoval.
$iaa
, jestli je to promenna $i a text aa, nebo promenna $ia a text "a" nebo promenna "$iaa". Proto se pouzivaji zapisy "${promenna}text", kterym se jasne vymezi, co je promenna.
A ten problem s tim "$i aa" je takovej docela chytacek:) uz jsem se s tim taky setkal:) Je to problem mezi svetem Windows a Unix. Tipuju, ze jsi ten soubor vytvoril na woknech a pak jsi to bez konverze zkousel na linuxu. Cili radky obsahuji:
ja[CR][LF] ty[CR][LF] on[CR][LF] ona[CR][LF] ono[CR][LF]Bash potom do promenny $i nacpe napr. "ja[CR]" a [LF] odmaze a kdyz to pak tisknes, tak se vytiskne $i jako "ja[CR]" a [CR] je carriage return (posun kurzoru na zacatek radky), takze zbytek textu " aa" se napise zase od zacatku radky, proto prepise ten text z promenny $i:) Hezkej chytak, co?:)
Jen tak pro zajímavost, to tvrzení "Tohle plati u vsech jazyku" je přecejenom trochu moc silné.
Existují i jazyky a skripty, kde to funguje jinak. Oba níže uvedené příkazy pro vypsání hodnoty vypíší shodný řetězec. Jaký GNU program čte tuto syntaxi ponechávám na laskavém čtenáři.
a=testa
$(warning testa="$atest")
$(warning testa="$(a)test")
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.