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:
-
dentro de
[ -
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" ]