Práce s proměnnými v Bashi

Práce s proměnnými v Bashi
« kdy: 27. 10. 2021, 02:28:21 »
dělám si bashshellový scriptík ke spouštění programu a setkal jsem se s pár věcmi které jsem zatím buď nepochopil, nebo mi alespoň dlouho trvalo, než jsem přišel na to že v tom je chyba

mohl by mě někdo nakopnout, proč to tak je? předem děkuji.

1)
Kód: [Vybrat]
if [ ${adresare[$vyberTyp]} = 'orig' ] || [ ${adresare[$vyberTyp]} = 'veliké' ] # nefunguje dle očekávání s "orig" (uvozovky)
2)
ve ${vstupsoub} je funkční cesta k texťáku

funkční kód:
Kód: [Vybrat]
youtube-dl -ico "${vystupadr}/%(title)s [%(resolution)s] %(id)s.%(ext)s" -a "${vstupsoub}" --all-subs
nefunkční kód:
Kód: [Vybrat]
prikazZaklad="-ic";
prikazVystup="-o \"${vystupadr}/%(title)s [%(resolution)s]_%(id)s.%(ext)s\"";
prikazVstup="-a \"${vstupsoub}\"";

echo -e "\033[;36myoutube-dl\033[0m $prikazZaklad $prikazVystup $prikazVstup --all-subs";
youtube-dl $prikazZaklad $prikazVystup $prikazVstup --all-subs
pro začátek prý nelze načíst soubor z $prikazVstup, ale i poté se zdá že se tomu nelíbí ani ostatní hodnoty, přestože to co se vypíše z echa po ctrl-c ctrl-v normálně funguje
« Poslední změna: 27. 10. 2021, 11:13:38 od Petr Krčmář »


Re:pár dotazů k bashshellu
« Odpověď #1 kdy: 27. 10. 2021, 02:52:30 »
hmm,
druhý dotaz byl ve skutečnosti
Kód: [Vybrat]
if [ ${adresare[$vyberTyp]} = 'ensub' ] || [ ${adresare[$vyberTyp]} = 'titulky' ]
  then
youtube-dl -ico "${vystupadr}/%(title)s [%(resolution)s] %(id)s.%(ext)s" -a "${vstupsoub}" --all-subs
  else
youtube-dl -ic -f 'bestvideo+bestaudio' --merge-output-format mkv -o "${vystupadr}/%(title)s [%(resolution)s]_%(id)s.%(ext)s" -a "${vstupsoub}" --all-subs --embed-subs
  fi

jako funkční
Kód: [Vybrat]
#prikaz a volby
prikazZaklad="-ic";
prikazVystup="-o \"${vystupadr}/%(title)s [%(resolution)s]_%(id)s.%(ext)s\"";
prikazVstup="-a \"${vstupsoub}\"";
prikazFormat="-f 'bestvideo+bestaudio' --merge-output-format mkv";


if [ ${adresare[$vyberTyp]} = 'ensub' ] || [ ${adresare[$vyberTyp]} = 'titulky' ]
  then
echo -e "\033[;36myoutube-dl\033[0m $prikazZaklad $prikazVystup $prikazVstup --all-subs\n";
youtube-dl $prikazZaklad $prikazVystup $prikazVstup --all-subs
  else
echo -e "\033[;36myoutube-dl\033[0m $prikazZaklad $prikazFormat $prikazVystup $prikazVstup --all-subs --embed-subs\n";
youtube-dl $prikazZaklad $prikazFormat $prikazVystup $prikazVstup --all-subs --embed-subs
fi
jako nefunkční

a překvapivě stačilo odebrat všechny vnitřní uvozovky, takže s
Kód: [Vybrat]
#prikaz a volby
prikazZaklad="-ic";
prikazVystup="-o ${vystupadr}/%(title)s [%(resolution)s]_%(id)s.%(ext)s";
prikazVstup="-a ${vstupsoub}";
prikazFormat="-f bestvideo+bestaudio --merge-output-format mkv";
to všechno funguje (až na to že v echu už není jinak funkční příkaz, protože z něj všechny uvozovky zmizely),
přesto by mě zajímalo, v čem má chyba vlastně spočívá
« Poslední změna: 27. 10. 2021, 02:58:48 od Michal Švarc »

M Z

Re:Práce s proměnnými v Bashi
« Odpověď #2 kdy: 27. 10. 2021, 13:52:16 »
Zacal bych s tou podminkou, pokud to neni nejaky obstarozni unix:
Kód: [Vybrat]
if [[ "${adresare[$vyberTyp]}" == "ensub"  ||  "${adresare[$vyberTyp]}" = "titulky" ]]; then
 .....
else
 .....
fi

Re:Práce s proměnnými v Bashi
« Odpověď #3 kdy: 28. 10. 2021, 20:28:39 »
Zacal bych s tou podminkou, pokud to neni nejaky obstarozni unix:
...
Díky za tip, jak by to také mohlo fungovat. V záměně z
Kód: [Vybrat]
if [ ${adresare[$vyberTyp]} = 'orig' ] || [ ${adresare[$vyberTyp]} = 'veliké' ] na
Kód: [Vybrat]
if [[ ${adresare[$vyberTyp]} = 'orig' || ${adresare[$vyberTyp]} = 'veliké' ]] nevidím žádnou výhodu, ale určitě zkusím, zda to funguje.

Co se té podmínky týká, po přečtení tohoto článku, bych řekl že asi půjde o to, co se stane když ${adresare[$vyberTyp]} je prázdné, což by s tvými uvozovkami podle všeho fungovalo.

Co se mého druhého dotazu týká, řekl bych že mé "řešení", ve skutečnosti řešením není a funguje jen proto že ty parametry co byly původně v uvozovkách neobsahují mezery a tudíž nepůsobí chybu.

Tudíž problém asi je v tom, že způsob jakým jsem se pokoušel přidat uvozovky, je nepřidá v takovém tvaru, aby je program kterému se to předává zkousnul.
Přičemž netuším, jak je mám přidat, aby ten kus kódu fungoval.

Bugsa

  • ***
  • 126
    • Zobrazit profil
    • E-mail
Re:Práce s proměnnými v Bashi
« Odpověď #4 kdy: 29. 10. 2021, 09:05:50 »
[[ vypne expanzi proměnných ve stringu


Re:Práce s proměnnými v Bashi
« Odpověď #5 kdy: 29. 10. 2021, 22:06:18 »
Kdysi dávno jsem potřeboval napsat trochu složitější bash skript (vícero promenných, ssh volání, filtrování, parsování). Vzal jsem to jako výzvu, ve volném čase jsem s tím bojoval asi měsíc. Pak jsem si řekl, že je život příliš krátký, za půl hodiny to přepsal a odladil v perlu. Tam se proměnné chovají předvídatelně a uchopitelně, pole fungují jako pole, regex je lahůdka, je to čitelné a odladitené. Pane Satrapo, tímto Vám děkuji za Vaši knihu!