/ / Pękanie wiersza komend Bash zawierające białe spacje - bash, shell, unix, scripting, scripting-language

Parsowanie wiersza komend Bash zawierającego białe spacje - bash, shell, unix, scripting, scripting-language

Mam parsować argument wiersza poleceń w skrypcie powłoki w następujący sposób:

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

Potrzebuję sparsować argumenty "a", tj. "Cześć świat ...", które są oddzielone białymi znakami w tablicy.

tj. tablica a_input () powinna zawierać "hello", "world", "good" i "bye".

Podobnie jest z argumentami "b".

Próbowałem go w następujący sposób:

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

Ale powyższa metoda jest prymitywna. Wszelkie inne prace wokół. Nie mogę użyć getopts.

Odpowiedzi:

1 dla odpowiedzi № 1

Najprostszym rozwiązaniem jest przekonanie użytkowników, aby poprawnie cytowali argumenty.

Blokowanie, które można ręcznie przechodzić, dopóki nie dojdziesz do końca argumentów lub nie wykonasz następnego --argument (ale oznacza to, że nie można dodać słowa, które zaczyna się od -- w twojej wartości argumentu ... chyba że wykonasz również test opcji na tych, w których ograniczasz nieco mniej -- słowa).


0 dla odpowiedzi nr 2

Dodanie do odpowiedzi Etan Reisners, która jest absolutnie poprawna:

Osobiście uważam, że bash jest trochę uciążliwy, kiedyprzetwarzanie tablic / łańcuchów staje się bardziej złożone, a jeśli naprawdę masz dziwne wymagania, że ​​wywołujący nie powinien być wymagany do używania cudzysłowów, chciałbym napisać skrypt pośredni w, powiedzmy, Ruby lub Perlu, który po prostu zbiera parametry w Właściwy sposób, owijając cytaty wokół nich i przekazuje je skryptowi, który pierwotnie miał zostać nazwany - nawet jeśli kosztuje to dodatkowy proces.

Na przykład Ruby One-Liner, taki jak

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

zrobiłbym to oczyszczając, a następnie przywołując twój scenariusz.