Condições sim / não [duplicado]

0

Estou executando o código a seguir como parte de um script ( #!/bin/bash ).

read -p "Do you want to make use of Thorpe volume attenuation in the watercolumn [Y/N]:" Thorpe
read -p "Do you want to include *.ati file? [Y/N]:" ati
Thorpe_att=T
ati_file=*
if [$Thorpe = Y]; then
   if [$ati = Y]; then
      echo "Usage of Thopre volume attenuation volume and *.ati file is accepted"
      sed -i "4s/''/'$interp$surf$attenuation$Thorpe_att$ati_file'/" $Mod_Filename
   else
      echo "Only usage of Thopre volume attenuation volume is accepted"
      sed -i "4s/''/'$interp$surf$attenuation$Thorpe_att'/" $Mod_Filename
   fi
else 
   if [$ati = Y]; then
      echo "Only usage of *.ati file is accepted"
      sed -i "4s/''/'$interp$surf$attenuation$ati_file'/" $Mod_Filename
   else
      echo "Neither usage of Thopre volume attenuation volume nor *.ati file is accepted"
      sed -i "4s/''/'$interp$surf$attenuation'/" $Mod_Filename
   fi
fi

Depois de executá-lo, estou recebendo este erro:

./mod.sh: line 50: [N: command not found
./mod.sh: line 59: [N: command not found

E depois imprime no terminal a linha: echo "Nem uso ...". Alguém pode resolver o problema? Agradecemos antecipadamente.

    
por G. Paschalis 28.08.2017 / 17:34

2 respostas

2

Você está perdendo os espaços em seus comandos de teste. Esta parte:

if [$Thorpe = Y]; then
   if [$ati = Y]; then
      ...

deve ser

if [ $Thorpe = Y ]; then
   if [ $ati = Y ]; then
      ...

Sem os espaços, o shell expande o valor de $Thorpe para N e tenta executar [N , que ele vê como um comando. Ele não reconhece isso como um comando válido e gera o erro que você está vendo.

Pessoalmente, prefiro usar o [[ $Thorpe = Y ]] Bash incorporado, em vez de test , ( [ $Thorpe = Y ] ), ele lida melhor com strings não citadas e tem um uso mais óbvio de & amp; & amp; e || operadores.

    
por Arronical 28.08.2017 / 17:47
1

O erro é o espaço ausente. A construção [ ] sempre precisa de espaços, portanto, [foo] está errado, mas [ foo ] está correto. Então, no seu caso, mude

if [$Thorpe = Y]; then

para

if [ $Thorpe = Y ]; then

Em uma nota mais geral, por que você faria algo para tornar a vida de seus usuários tão difícil? Parar a execução de um programa e exigir que os usuários digitem laboriosamente e manualmente a entrada é um projeto muito ruim. Especialmente quando pedir um nome de arquivo que poderia ser facilmente dado usando a conclusão de tabulação e é muito provável que seja inserido erroneamente.

Em vez de forçar os usuários a responder perguntas, escreva seu script para que ele possa manipular opções de linha de comando ou, pelo menos, faça com que quaisquer argumentos passados sejam automaticamente assumidos como quaisquer valores que você esteja pedindo.

    
por terdon 28.08.2017 / 17:48