Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Michal Švarc 27. 10. 2021, 02:28:21

Název: Práce s proměnnými v Bashi
Přispěvatel: Michal Švarc 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
Název: Re:pár dotazů k bashshellu
Přispěvatel: Michal Švarc 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á
Název: Re:Práce s proměnnými v Bashi
Přispěvatel: M Z 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
Název: Re:Práce s proměnnými v Bashi
Přispěvatel: Michal Švarc 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 (https://osy.pages.fel.cvut.cz/docs/cviceni/lab2/bash/), 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.
Název: Re:Práce s proměnnými v Bashi
Přispěvatel: Bugsa 29. 10. 2021, 09:05:50
[[ vypne expanzi proměnných ve stringu
Název: Re:Práce s proměnnými v Bashi
Přispěvatel: Petr Zíka 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!