Portál AbcLinuxu, 11. května 2025 04:38
for arr in "${ARR[@]}"; do echo $arr; done | sort for arr in "${ARR[@]}"; do echo $arr; doneChybí tam něco? Nějaké nápady? Zkoušel jsem to i takto, no výsledek je nefunkční.
ARR=($(sort "${ARR[@]}"))
Řešení dotazu:
Asi by to chtělo blíž popsat, co přesně je v tom poli ARR
. Mně třeba tohle funguje a třídí/netřídí, přesně jak bych čekal:
ARR=(c b a) for arr in "${ARR[@]}"; do echo "$arr"; done | sort for arr in "${ARR[@]}"; do echo "$arr"; done
Takže odhaduju, že problém s tříděním se může týkat buď (a) něčeho neobvyklého, co máš v poli ARR, nebo (b) nastavení locale
, které způsobuje překvapivé pořadí při třídění.
Jo a to druhé, co uvádíš, mi taky funguje (když tedy správě ošetřím, že sort potřebuje mít na vstupu oddělovače řádků):
ARR=(c b a) echo "Před tříděním: ${ARR[*]}" ARR=($(for arr in "${ARR[@]}"; do echo "$arr"; done | sort)) echo "Po třídění: ${ARR[*]}"
ARR=('c d' 'b c' 'a b') echo 'Před tříděním:' for idx in "${!ARR[@]}"; do echo "${idx}: ${ARR[idx]}"; done readarray -t ARR < <(for arr in "${ARR[@]}"; do echo "$arr"; done | sort) echo 'Po třídění:' for idx in "${!ARR[@]}"; do echo "${idx}: ${ARR[idx]}"; done
printf '%s\n' "${ARR[@]}" printf '%s\n' "${ARR[@]}" | sort
Jo, to je mnohem lepší! Toho jsem si doteď nikdy nevšiml, že printf
v Bashi interpretuje formátovací řetězec znova od začátku, když najde další argumenty.
ARR=(c b a 9 8 7 6 5 4 1 2 10 100 200) echo "Před tříděním: ${ARR[*]}" ARR=($(for arr in "${ARR[@]}"; do echo "$arr"; done | sort)) echo "Po třídění: ${ARR[*]}"
Před tříděním: c b a 9 8 7 6 5 4 1 2 10 100 200 Po třídění: 1 10 100 2 200 4 5 6 7 8 9 a b c
sort -n
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.