Estoy usando la secuencia de comandos a continuación para retroceder dos días cuando la secuencia de comandos se ejecuta al comenzar dos días del año y también verificar el primer y segundo día de cada mes y retroceder 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 lo malo 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
bash
shell
shell-script
test
whitespace
Kumar1
fuente
fuente

[. Además, mire laelifdeclaración; Te ayudará a limpiar las cosas. Además, los puntos y comas después de las declaraciones if no son necesarios, pero tampoco son incorrectos, simplemente extraños.if [ ... ]; then), así que no es tan inusual.Respuestas:
[no es un metacarácter ni un operador de control (ni siquiera una palabra reservada; lo mismo para]), por lo tanto, 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 independientes01,=,01, y]. Cada operador y operando debe ser un argumento separado del[comando, por lo que también es necesario un espacio en blanco alrededor de los operadores.[$month="01"]es un patrón comodín que coincide con cualquiera de los caracteres en$montho"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.
Lo mismo ocurre con la sintaxis de doble parche de bash (y ksh y zsh).
Más de una condición
Hay dos formas de combinar condiciones:
dentro
[con
[comandos separados combinados con&&o||Agrupar entre paréntesis es probablemente más fácil dentro
[.El primero debe evitarse ya que no es confiable (pruebe, por ejemplo, con
month='!'). Los problemas con contenido variable extraño pueden evitarse utilizando primero la cadena segura (si hay una); o usando[[/ en]]lugar de[/]:fuente
[cuando-a/-ono se utilizan siempre es confiable con shells compatibles con POSIX. No hay ninguna ventaja en usar-a/-omás&&/||. Definitivamente desalentaría su uso. Tenga en cuenta que[[no es POSIX.Otra forma de escribirlo:
fuente
casedeclaración. Si tiene más de unoelif, probablemente debería estar usandocase.Entonces, esta es tu respuesta:
Por lo tanto, debe poner "espacio" entre corchetes y variable / valor.
fuente
==lugar de estándar=.[testes=.[si para las pruebas, no realiza ninguna tarea, por lo que no hay necesidad de desambiguar. Algunas[implementaciones admiten==como una extensión sobre el estándar, pero no todas. El shell Bourne,ash's,posh'[s o el/bin/[de algunos sistemas, por ejemplo, no.==fue agregado porksh, supongo, por coherencia con el mismo operador en su nueva(( ... ))construcción (que tiene ambos = y ==, pero no es estándar)