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