Próbuję napisać skrypt, w którym chcę sprawdzić, czy którykolwiek z parametrów przekazanych do skryptu bash jest zgodny z ciągiem. Mam teraz konfigurację
if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]
ale może istnieć duża liczba parametrów, więc zastanawiałem się, czy istnieje lepszy sposób, aby to zrobić?
Dzięki
EDYCJA: Wypróbowałem ten fragment kodu i wywołałem skrypt z opcją -disableVenusBld, ale nadal wypisuje „Uruchamianie kompilacji”. czy robię coś źle? Z góry dziękuję!
while [ $# -ne 0 ]
do
arg="$1"
case "$arg" in
-disableVenusBld)
disableVenusBld=true
;;
-disableCopperBld)
disableCopperBld=true
;;
-disableTest)
disableTest=true
;;
-disableUpdate)
disableUpdate=true
;;
*)
nothing="true"
;;
esac
shift
done
if [ "$disableVenusBld" != true ]; then
echo "Starting build"
fi
linux
unix
bash
shell-script
iman453
źródło
źródło
#! /bin/sh -
na górę tego, co tam umieściłeś, spowodowałem, że skrypt jest wykonywalny, a następnie./t.sh
wypisuje „Uruchamianie kompilacji”, ale./t.sh -disableVenusBld
nic nie drukuje.Odpowiedzi:
Wygląda na to, że wykonujesz obsługę opcji w skrypcie powłoki. Oto idiom tego:
(Istnieje kilka konwencji dotyczących wcięcia
;;
, a niektóre powłoki umożliwiają podanie opcji as(--opt1)
, aby pomóc w dopasowywaniu nawiasów, ale jest to podstawowy pomysł)źródło
shift
Oświadczenie jest używany, gdy liczba argumentów do polecenia nie jest znana z góry, na przykład, gdy użytkownicy mogą dać jak najwięcej argumentów, jak im się podoba. W takich przypadkach argumenty są przetwarzane wwhile
pętli z warunkiem testu wynoszącym$#
. Ten warunek jest spełniony, o ile liczba argumentów jest większa od zera.$1
Zmienna ishift
proces oświadczenie każdy argument. Liczba argumentów jest zmniejszana za każdym razem, gdyshift
jest wykonywana, i ostatecznie staje się zerowa, po czymwhile
pętla wychodzi. źródłoecho $1 | sed
przetwarzaniem wartości argumentów .To zadziałało dla mnie. Robi dokładnie to, o co prosiłeś i nic więcej (bez przetwarzania opcji). Czy to dobrze, czy źle to ćwiczenie na plakat :)
Wykorzystuje to specjalną obsługę
$*
suportów… i super-test[[
…]]
wsporników.źródło
$*
na$@
, ponieważ testowany ciąg może zawierać spacje i dodać link do dokumentacji bash na ten temat.bash -c 'echo args=$*; [[ "$@" == "bar" ]] && echo YES || echo NO' -- foo bar
your string
. Myślę, że musisz zrobić to, co sugeruje ta odpowiedź . tj .:bash -c 'echo args=$*; for i in "$@" ; do [[ $i == "bar" ]] && echo "Is set!" && break ; done' -- bar foo
działałoby.create a new certificate
„Twój ciąg”cat
, to zgłosi dopasowanie, ponieważcertificate
zawieracat
.Co powiesz na przeszukiwanie (za pomocą symboli wieloznacznych) całej przestrzeni parametrów:
Edycja: Ok, ok, więc to nie była popularna odpowiedź. Co powiesz na ten, jest idealny !:
Edycja2: Ok, ok, może to nie jest idealne ... Pomyśl, że to działa tylko wtedy, gdy -param jest na początku listy i będzie pasować do -paramXZY lub -paramABC. Nadal uważam, że oryginalny problem można bardzo ładnie rozwiązać za pomocą manipulacji ciągiem bash, ale nie całkiem go tutaj złamałem ... -Czy możesz?
źródło
${@#
)?$@
jest to specjalna zmienna, która przechowuje wszystkie argumenty wiersza poleceń? Właśnie użyłem manipulacji ciągiem Bash na tej zmiennej, aby usunąć podciąg „-disableVenusBld”, a następnie porównuję go do oryginału$@
. Więc jeśli$@
równa się,-foo -bar
to${@#-disableVenusBld}
nadal byłbym-foo -bar
, więc widzę, że flaga, której szukam, nie jest obecna. Jeśli jednak$@
jest równy,-foo -disableVenusBld -bar
to${@#-disableVenusBld}
nie byłby-foo -bar
równy$@
, mówiąc mi, że flaga, której szukam, jest obecna! Cool eh!Jeśli chcesz przetestować tylko parametry zaczynające się od
$3
, wykonaj wyszukiwanie w funkcji:Ale zastanawiam się, dlaczego starasz się to zrobić, to nie jest powszechna potrzeba. Zazwyczaj opcje są przetwarzane w kolejności, jak w odpowiedzi Dennisa na poprzednie pytanie .
źródło