Korzystam z poniższego skryptu, aby przejść dwa dni wstecz, gdy skrypt uruchamia się o dwa dni w roku, a także sprawdzam pierwszy i drugi dzień każdego miesiąca i cofam się o dwa dni wstecz.
if [$month="01"] && [$day="01"];
then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"];
then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [ $day = "01" ];
then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
if [ $day = "02" ];
then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
date="$month/$yes_day/$year"
fulldate="$year$month$yes_day"
fi
fi
fi
fi
Ale mój zły otrzymuję poniższy komunikat o błędzie
Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
bash
shell
shell-script
test
whitespace
Kumar1
źródło
źródło
[
. Dodatkowo spójrz naelif
oświadczenie; pomoże ci to posprzątać. Również średniki po instrukcjach if nie są konieczne, ale również nie są niepoprawne, po prostu dziwne.if [ ... ]; then
), więc nie jest to takie niezwykłe.Odpowiedzi:
[
nie jest metaznakiem ani operatorem sterującym (nawet słowem zastrzeżonym; to samo dla]
), dlatego potrzebuje wokół niego spacji. W przeciwnym razie powłoka „widzi” polecenie[01=01]
zamiast polecenia[
z oddzielnych parametrów01
,=
,01
i]
. Każdy operator i operand musi być osobnym argumentem dla[
polecenia, więc białe znaki są konieczne również wokół operatorów.[$month="01"]
to wzór wieloznaczny pasujący do dowolnego ze znaków w$month
lub"01
. Jeśli nic nie pasuje, zostaje sam.Jeśli po nawiasie zamykającym jest średnik, nie potrzebujesz przed nim spacji, ponieważ średnik jest zawsze częścią oddzielnego tokena.
To samo dotyczy składni podwójnych nawiasów bash (oraz ksh i zsh).
Więcej niż jeden warunek
Istnieją dwa sposoby łączenia warunków:
w ciągu
[
z osobnymi
[
poleceniami w połączeniu z&&
lub||
Grupowanie w nawiasach jest prawdopodobnie łatwiejsze
[
.Pierwszego należy unikać, ponieważ jest zawodny (spróbuj na przykład z
month='!'
). Problemów z dziwną zawartością zmiennych można uniknąć, używając najpierw bezpiecznego ciągu (jeśli taki istnieje); lub używając[[
/]]
zamiast[
/]
:źródło
[
kiedy-a
/-o
nie są używane, zawsze jest niezawodne w przypadku powłok zgodnych z POSIX. Korzystanie z-a/-o
ponad nie ma żadnej przewagi&&/||
. Zdecydowanie odradzałbym jego użycie. Zauważ, że[[
to nie jest POSIX.Inny sposób, aby to napisać:
źródło
case
wyciąg. Jeśli masz więcej niż jedenelif
, prawdopodobnie powinieneś używaćcase
.Oto twoja odpowiedź:
Musisz więc wstawić „spację” między nawias kwadratowy a zmienną / wartością.
źródło
==
zamiast standardowych=
.[
akatest
jest=
.[
jeśli chodzi o testy, to nie wykonuje żadnego zadania, więc nie trzeba jednoznacznie określać. Niektóre[
implementacje obsługują==
rozszerzenie jako standard, ale nie wszystkie. The Bourne shell'S,ash
's,posh
' s[
s lub/bin/[
niektórych systemach, na przykład nie.==
został dodany przezksh
, przypuszczam, że dla spójności z tym samym operatorem w jego nowej(( ... ))
konstrukcji (która ma zarówno = i ==, ale nie ma standardu)