Estou usando o script abaixo para retornar dois dias quando o script é executado no início de dois dias do ano e também verificar o primeiro e o segundo dia de cada mês e retornar dois dias atrás.
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
Mas meu mal estou recebendo a mensagem de erro abaixo
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
fonte
fonte
[
. Além disso, examine aelif
declaração; isso ajudará você a limpar as coisas. Além disso, os pontos e vírgulas após as instruções if não são necessários, mas também não são incorretos, apenas estranhos.if [ ... ]; then
), então isso não é incomum.Respostas:
[
não é um metacaractere nem um operador de controle (nem mesmo uma palavra reservada; é a mesma para]
), portanto, precisa de espaço em branco ao seu redor. Caso contrário, o shell "vê" o comando[01=01]
em vez do comando[
com os parâmetros separados01
,=
,01
, e]
. Cada operador e operando precisa ser um argumento separado para o[
comando, portanto, também é necessário espaço em branco ao redor dos operadores.[$month="01"]
é um padrão curinga que corresponde a qualquer um dos caracteres em$month
ou"01
. Se não corresponder a nada, será deixado sozinho.Se houver um ponto e vírgula após o colchete de fechamento, você não precisará de um espaço antes dele, porque o ponto e vírgula sempre faz parte de um token separado.
O mesmo vale para a sintaxe de colchete duplo do bash (e ksh e zsh).
Mais de uma condição
Existem duas maneiras de combinar condições:
dentro
[
com
[
comandos separados combinados com&&
ou||
O agrupamento com parênteses é provavelmente mais fácil por dentro
[
.O primeiro deve ser evitado, pois não é confiável (tente, por exemplo, com
month='!'
). Problemas com conteúdo variável estranho podem ser evitados usando a string segura (se houver) primeiro; ou usando[[
/ em]]
vez de[
/]
:fonte
[
quando-a
/-o
não é usado é sempre confiável com os shells compatíveis com POSIX. Não há nenhuma vantagem em usar-a/-o
mais&&/||
. Eu definitivamente desencorajaria seu uso. Observe que[[
não é POSIX.Outra maneira de escrever:
fonte
case
declaração. Se você tiver mais de umelif
, provavelmente deveria estar usandocase
.Então, esta é sua resposta:
Portanto, você deve colocar "espaço" entre colchetes e variável / valor.
fonte
==
vez de padrão=
.[
test
é=
.[
se for para testes, ele não realiza nenhuma tarefa, portanto não há necessidade de desambiguar. Algumas[
implementações suportam==
como uma extensão acima do padrão, mas não todas. Os shell Bourne,ash
's,posh
'[
s ou o/bin/[
de alguns sistemas, por exemplo, não.==
adicionou-se porksh
, que supor, por consistência com o mesmo operador na sua nova(( ... ))
construo (que tem ambos = e ==, mas nenhum padrão)