Níže uvedený skript používám k přesunu o dva dny zpět, když skript běží na začátku dvou dnů v roce, a také ke kontrole prvního a druhého dne každého měsíce a posunutí o dva dny zpět.
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 špatně se mi zobrazuje níže uvedená chybová zpráva
Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
Přijatá odpověď:
[
není ani metaznak, ani ovládací operátor (dokonce ani vyhrazené slovo; totéž platí pro ]
), proto potřebuje kolem sebe mezery. Jinak shell „vidí“ příkaz [01=01]
místo příkazu [
se samostatnými parametry 01
, =
, 01
a ]
. Každý operátor a operand musí být samostatný argument pro [
příkaz, takže mezery jsou nutné i kolem operátorů.
if [ "$month" = "01" ]
[$month="01"]
je vzor zástupného znaku odpovídající kterémukoli ze znaků v $month
nebo "01
. Pokud se s ničím neshoduje, je ponechán.
Pokud je za uzavírací závorkou středník, nepotřebujete před ním mezeru, protože středník je vždy součástí samostatného tokenu.
if [ "$month" = "01" ]; then
Totéž platí pro syntaxi bash (a ksh a zsh) se dvěma závorkami.
Více než jedna podmínka
Podmínky lze kombinovat dvěma způsoby:
-
v rámci
[
-
se samostatným
[
příkazy kombinované s&&
nebo||
Seskupování pomocí hranatých závorek je pravděpodobně jednodušší v [
.
if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or
if [ "$month" = "01" ] && [ "$day" = "01" ]
Prvnímu je třeba se vyhnout, protože je nespolehlivý (zkuste například pomocí month='!'
). Problémům s podivným proměnným obsahem se lze vyhnout tím, že nejprve použijete bezpečný řetězec (pokud nějaký existuje); nebo pomocí [[
/]]
místo [
/]
:
if [ "01" = "$month" -a "01" = "$day" ]