/ / Unix Bash Jeśli instrukcja else nie działa [closed] - bash, shell, unix, cmd

Unix Bash Jeśli instrukcja else nie działa [closed] - bash, shell, unix, cmd

Jestem w stanie uzyskać odpowiedź w wierszu polecenia, jeśli po prostu użyć warunku IF sam. Ale jeśli dodasz elif, wiersz polecenia jest nadal otwarty i nie kończy się ...

Kod użyłem ...

-bash-3.00$ if [ "1" == "1" && "$cont" == "1" ]; then
> echo "I am if"
> elif [ "$cont" == "1"" ]; then
> echo "I am else"
> fi
>
>

Oczekiwany wynik : Powinno to zakończyć się i powrócić echo;

Odpowiedzi:

3 dla odpowiedzi № 1

Możesz zmienić && do -a:

$ cont=1
$ if [ "1" = "1" -a "$cont" = "1" ]; then echo "ha"; fi
ha

Lub użyj dwóch oddzielnych [ polecenia:

$ if [ "1" = "1" ] && [ "$cont" = "1" ]; then echo "ha"; fi

Lub użyj podwójnych nawiasów:

$ if [[ "1" == "1" && "$cont" == "1" ]]; then echo "ha"; fi
ha

Zwróć też uwagę na " zbyt wiele masz w swoim elifie, jak RedX komentarze.


2 dla odpowiedzi nr 2

elif [ "$cont" == "1"" ]; then nie jest ważny, cytaty zawsze muszą być parami:

elif [ "$cont" == "1" ]; then

to daje:

if [ "1" == "1" && "$cont" == "1" ]; then
echo "I am if"
elif [ "$cont" == "1" ]; then
echo "I am else"
fi

który zawodzi bash: [: missing "]"

Powodem jest pierwsza linia. Używasz singla [ co oznacza, że ​​BASH widzi:

if [ "1" == "1"
pipe (&&)
"$cont" == "1" ]; then

Próbować

if [[ "1" == "1" && "$cont" == "1" ]]; then
echo "I am if"
elif [[ "$cont" == "1" ]]; then
echo "I am else"
fi

Pojedynczy [ są stare pluskwafunkcja z czasów powłoki Bourne'a. Wytwarzają wszelkiego rodzaju problemy, które zostały rozwiązane za pomocą [[...]] składnia.

Jeśli nie wiesz, co robisz, unikaj singli [ i składnia zwrotna (use $(cmd...) zamiast).

Wskazówka: Aby debugować takie rzeczy, użyj set -x aby powłoka drukowała każde polecenie, tak jak je widzi.