GNU/Linux >> Znalost Linux >  >> Linux

Závorky ve stavu If:Proč dostávám chyby syntaxe bez mezer?

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:

  1. v rámci [

  2. 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" ]

Linux
  1. Proč hlavní funkce bez příkazu return vrací hodnotu 12?

  2. Tomcat se spustí bez chyb, ale neposlouchá na 8080

  3. Spusťte ls, aniž byste získali úplnou cestu

  1. Zkontrolujte konfigurační soubory Linuxu, zda neobsahují chyby syntaxe

  2. Proč se mi při spuštění ssh-add odepírá oprávnění?

  3. Jak mohu vydat příkaz do souboru, aniž bych při chybě dostal prázdný soubor?

  1. Chyby PHP

  2. Jak zjistím chyby syntaxe v konfiguraci webového serveru Apache

  3. Shell skript funguje dobře bez řádky shebang? Proč?