GNU/Linux >> Tutoriales Linux >  >> Linux

Corchetes en la condición If:¿Por qué obtengo errores de sintaxis sin espacios en blanco?

Estoy usando la siguiente secuencia de comandos para retroceder dos días cuando la secuencia de comandos se ejecuta al inicio de dos días del año y también verifico el primer y segundo día de cada mes y retrocedo dos días.

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

Pero mi problema es que recibo el siguiente mensaje de error

Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found

Respuesta aceptada:

[ no es ni un metacarácter ni un operador de control (ni siquiera una palabra reservada; lo mismo para ] ) por lo que necesita espacios en blanco a su alrededor. De lo contrario, el shell "ve" el comando [01=01] en lugar del comando [ con los parámetros separados 01 , = , 01 y ] . Cada operador y operando debe ser un argumento separado del [ comando, por lo que también se necesitan espacios en blanco alrededor de los operadores.

if [ "$month" = "01" ]

[$month="01"] es un patrón comodín que coincide con cualquiera de los caracteres en $month o "01 . Si no coincide con nada, se deja solo.

Si hay un punto y coma después del corchete de cierre, no necesita un espacio antes, porque el punto y coma siempre forma parte de un token separado.

if [ "$month" = "01" ]; then

Lo mismo ocurre con la sintaxis de doble paréntesis de bash (y ksh y zsh).

Más de una condición

Hay dos formas de combinar condiciones:

  1. dentro de [

  2. con [ separado comandos combinados con && o ||

Agrupar con corchetes probablemente sea más fácil dentro de [ .

if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or

if [ "$month" = "01" ] && [ "$day" = "01" ]

El primero debe evitarse ya que no es confiable (pruebe, por ejemplo, con month='!' ). Los problemas con el contenido de variables extrañas se pueden evitar utilizando primero la cadena segura (si la hay); o usando [[ /]] en lugar de [ /] :

if [ "01" = "$month" -a "01" = "$day" ]

Linux
  1. ¿Por qué una función principal sin declaración de retorno devuelve el valor 12?

  2. ¿Cómo compruebo los errores de sintaxis en la configuración de mi servidor web Apache?

  3. Tomcat se inicia sin errores pero no escucha en 8080

  4. ¿El script de Shell funciona bien sin la línea shebang? ¿Por qué?

  5. Convenciones de sintaxis de la página man de Linux/Unix

¿Por qué se produce un error en el aviso de Bash cuando examino el historial?

Grep:¿por qué los corchetes en el patrón Grep eliminan el proceso Grep de los resultados de Ps?

¿Son las pruebas Bash tan exigentes con los espacios en blanco?

¿Por qué la expansión variable sin $ funciona en expresiones?

¿Cómo verifico la sintaxis de un script Bash sin ejecutarlo?

¿Cómo puedo enviar un comando a un archivo sin obtener un archivo en blanco por error?