/ / Bash analyzovanie príkazového riadku obsahujúce medzery - bash, shell, unix, skriptovanie, skriptovací jazyk

Bash analyzovanie príkazového riadku obsahujúce medzery - bash, shell, unix, skriptovanie, skriptovací jazyk

Mám analyzovať argument príkazového riadku v shellovom skripte takto:

cmd --a=hello world good bye --b=this is bash script

Potrebujem analyzovať argumenty "a" napríklad "ahoj svet ...", ktoré sú oddelené medzerou do poľa.

tj pole a_input () by mala obsahovať "hello", "world", "good" a "bye".

Podobne aj pre argumenty "b".

Snažil som sa to takto:

--a=*)
a_input={1:4}
a_input=$@
for var in $a_input
#keep parsing until next --b or other argument is seen
done

Ale vyššie uvedená metóda je hrubá. Akékoľvek iné práce okolo. Nemôžem použiť getopty.

odpovede:

1 pre odpoveď č. 1

Najjednoduchším riešením je prinútiť používateľov, aby správne citovali argumenty.

Zablokovanie toho, že môžete manuálne smyčať, až kým nedosiahnete koniec argumentov alebo stlačíte nasledujúci --argument (ale to znamená, že nemôžete obsahovať slovo, ktoré začína -- vo vašej argumentovej hodnote ... pokiaľ nevykonáte aj platnú možnosť testovania na tých, v ktorých obmedzíte o niečo menej -- Slová).


0 pre odpoveď č. 2

Pridanie k odpovedi spoločnosti Etan Reisners, čo je absolútne správne:

Ja osobne nájdem bash trochu ťažkopádny, kedyspracovanie array / string je zložitejšie a ak máte naozaj podivnú požiadavku, aby volajúci nebol povinný používať úvodzovky, napísal by som tu sprostredkujúci skript, napríklad Ruby alebo Perl, ktorý práve zhromažďuje parametre v správny spôsob, obklopuje okolo nich obálky a odovzdáva ich do scenára, ktorý sa mal pôvodne nazývať - ​​aj keď to stojí ďalší proces.

Napríklad Ruby One-Liner ako napr

system("your_bash_script here.sh "".(ARGV.join(" ").split(" --").select {|s| s.size>0 }.join("" "")).""")

by to urobilo dezinfekciu a potom sa obráťte na svoj skript.