Portál AbcLinuxu, 5. května 2025 13:12
DMN=("aaa|dasdsaa|ddasddd" "bbb|dasdsaa|ddasddd" "ccc|dasdsaa|ddasddd") for echo ??? // výsledek aaa echo ??? // výsledek dasdsaa echo ??? // výsledek ddasddd done
Pokud by to nebylo v poli, ale v souboru nebo jako výstup nějakého příkazu, bylo by to o dost jednodušší. Skutečně tam musí figurovat to pole?Tak nemusí tam figurovat pole, ale pokud to bude v souboru, tak jsem myslel, že to bude ještě složitější, navíc si to ani nedokážu moc představit jak to mysliš.
cut -d\| -f 1 <data.txtNebo druhý sloupeček výstupu z jiného programu:
program | cut -d\| -f 2Formátovaný výstup:
program | awk -F'|' '{printf "A: %s\nB: %s\nC: %s\n\n",$1,$2,$3}'
A: aaa B: dasdsaa C: ddasddd A: bbb B: dasdsaa C: ddasddd A: ccc B: dasdsaa C: ddasdddapod. Možností je mnoho, ale ve chvíli, kdy to někdo nacpe do pole, je jich o něco méně a jsou s tím občas problémy.
DMN=("aaa|dasdsaa|ddasddd" "bbb|dasdsaa|ddasddd" "ccc|dasdsaa|ddasddd") i=0 for i in ${!DMN[*]} do IFS="|" ARRAY=${DMN[$i]} echo ${ARRAY[0]} echo ${ARRAY[1]} echo ${ARRAY[2]} done
ARRAY=${DMN[$i]}má být
ARRAY=(${DMN[$i]})Tady to je dvojím způsobem (druhý je spíš na zamyšlení „co to dělá“):
#!/bin/bash DMN=("aaa|dasdsaa|ddasddd" "bbb|dasdsaa|ddasddd" "ccc|dasdsaa|ddasddd") for (( i=0; i < ${#DMN[@]}; i++ )); do echo "${DMN[$i]}" done OLDIFS=$IFS IFS='|' for (( i=0; i < ${#DMN[@]}; i++ )); do var=(${DMN[$i]}) for (( j=0; j < ${#var[@]}; j++ )); do echo "${var[$j]}" done done IFS=$OLDIFS for (( i=0; i < ${#DMN[@]}; i++ )); do var=${DMN[$i]} while [ 1 ]; do varout=${var%%|*} var=${var#*|} echo "${varout}" if [[ "$var" != *\|* ]]; then echo "${var}" break fi done done
#!/bin/bash a=(foo bar) b=(bar foo) c=(a b) eval echo \${${c[0]}[0]} \${${c[1]}[0]}
eval
je sice v mnoha jazycích, ale vždy je u ní uvedeno, že se jedná o funkci pomalou a potenciálně nebezpečnou. Je lépe se jejímu použití vyhnout a zpravidla to jde. Jen je nutné se na problém podívat z jiného úhlu.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.