Portál AbcLinuxu, 4. května 2025 17:33

Dotaz: bash pole - ako pridat polozku do pola z while cyklu?

24.10.2022 11:18 gsnak | skóre: 22 | blog: gsnak
bash pole - ako pridat polozku do pola z while cyklu?
Přečteno: 347×
Odpovědět | Admin
Chcem v bash-i pridat hodnotu do pola, ale pretoze som vo while "podprograme" tak to nefunguje:
myArray=("cat" "dog" "mouse" "frog")
A=("a" "b" "c")
A+=("d")
ls *.mp3 | sort -R | while read i; do
    A+=( "$i" );
    echo $i
done
for i in ${A[@]}; do
    echo "--- $i"
done
Vypise to len a b c d, nic z toho while cyklu.
Čo Rys, to vrah!

Řešení dotazu:


Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

24.10.2022 11:54 X
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nefunguje to, protoze roura vytvari subshell:
for i in $(ls *.mp3 | sort -R); do
        A+=("$i")
done
24.10.2022 12:50 gsnak | skóre: 22 | blog: gsnak
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
Toto nefunguje spravne ak subory obsahuju medzery
Čo Rys, to vrah!
24.10.2022 13:06 X
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
Muzes upravit IFS a nebo lepe odstranit mezery.
24.10.2022 12:51 gsnak | skóre: 22 | blog: gsnak
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
lebo for to cita po slovach nie po riadkoch, a ked pouzijem while tak to zase vytvara subshell
Čo Rys, to vrah!
24.10.2022 13:55 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
a není řešením ls -l ?
24.10.2022 14:33 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
nebo ls -1 ... pardon

ale mně to funguje s for smyčkou..

jeden soubor to ale rozepisuje po slovech, a nevím proč má kolem názvu jednoduché uvozovky, takže universální to není..

jinak je snadnější cesta files_in_dirs=(dir/* other_dir/*), ale to mi taky nefunguje na tom jednom souboru, taky to láme jéno na slova..

M

Řešení 1× (gsnak (tazatel))
k3dAR avatar 24.10.2022 13:57 k3dAR | skóre: 63
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
1. nedavej while za pipe, ale dodej mu to primo, jednak nastavi do promene, druhak poresi mezery
2. u for smycky dej pole do uvozovek tim to nerozseka podle mezer, ale podle hodnot pole
myArray=("cat" "dog" "mouse" "frog")
A=("a" "b" "c")
A+=("d")

while read i; do
    A+=( "$i" );
    echo $i
done < <(ls *.mp3 | sort -R)

for i in "${A[@]}"; do
    echo "--- $i"
done
porad nemam telo, ale uz mam hlavu... nobody
24.10.2022 14:38 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
Tohle funguje i s tím jedním souborem co má kolem názvu apostofy ... M
24.10.2022 18:16 gsnak | skóre: 22 | blog: gsnak
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
Nakoniec som pouzil toto:
#!/bin/bash
clear
A=()
while read i; do
    A+=( "$i" );
done < <(ls *.mp3 | sort -R)
for i in "${A[@]}"; do
    echo "$i"
    mplayer -really-quiet "$i" 2>/dev/null
done
Čo Rys, to vrah!
Řešení 1× (Gréta)
24.10.2022 15:17 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
Odpovědět | | Sbalit | Link | Blokovat | Admin

while není „podprogram“. (Existuje taky „nadprogram“?) Problém není while, nýbrž dýmka. Bez dýmky se dá z while přistupovat k proměnným.

Mimochodem: Nikdy neparsuj výstup z ls.

mp3s=()
while IFS= read -r mp3; do
  mp3s+=("$mp3")
done < <(for mp3 in *.mp3; do
           printf '%s\n' "$mp3"
         done | shuf)
for i in "${!mp3s[@]}"; do
  printf '%u --- %s\n' "$i" "${mp3s[i]}"
done
24.10.2022 18:05 gsnak | skóre: 22 | blog: gsnak
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
./a.sh: line 4: syntax error near unexpected token `('
./a.sh: line 4: `done << (for mp3 in *.mp3; do'
GNU bash, version 5.1.16(1)
Čo Rys, to vrah!
24.10.2022 18:43 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?

Kde přesně jsem napsal „<< (“? Nikde to v mém kódu nevidím.

Doporučuji Copy&Paste; pomáhá to.

xkucf03 avatar 24.10.2022 20:11 xkucf03 | skóre: 49 | blog: xkucf03
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
Odpovědět | | Sbalit | Link | Blokovat | Admin

Pokud nemáš k dipozici lepší formát, tak bych ty prvky oddělil nulovým bajtem:

while read -d '' i; do A+=("$i"); done < <(find -maxdepth 1 -type f -name '*.mp3' -print0 | sort -zR)

Protože v názvu souboru může být víceméně libovolná změť bajtů kromě nulového bajtu (mj. aby to mohl být céčkovský řetězec) a lomítka (protože to je oddělovač v cestě k souboru). Tzn. kromě mezer, uvozovek a apostrofů tam můžou být i znaky konce řádku. Což dokáže zavařit např. i bash-completion:

$ touch "ko                         
kos"
$ ls -1
'ko'$'\n''kos'
$ rm ko<TAB>
ko   kos  
Mám rád, když se lidé přou, znamená to, že vědí, co dělají, a že mají směr. Frantovo.cz, SQL-DK, Relational pipes
24.10.2022 23:42 tom
Rozbalit Rozbalit vše Re: bash pole - ako pridat polozku do pola z while cyklu?
Pouzitim escape sekvenci v nazvu souboru jde docilit mnohem zabavnejsiho chovani ruznych programu nez s obycejnym \n

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.