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 laelif
declaració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$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.
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
/-o
no se utilizan siempre es confiable con shells compatibles con POSIX. No hay ninguna ventaja en usar-a/-o
más&&/||
. Definitivamente desalentaría su uso. Tenga en cuenta que[[
no es POSIX.Otra forma de escribirlo:
fuente
case
declaració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=
.[
test
es=
.[
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)