Não obtém saída para o shell script usando if e para

6

Eu não obtenho nenhum resultado impresso para isso, mas não entendo por quê?

read -e -i "no" -p "Install? " result

if [ '$result' == 'yes' ]; then
  declare -a subs=('one' 'two')
  for sub in "${subs[@]}"
  do
    echo "$sub"
  done
fi
    
por user3142695 11.10.2017 / 15:38

2 respostas

14

Você precisa dar aspas duplas em $result em vez de aspas simples; caso contrário, elas não serão expandidas.

[ '$result' == 'yes' ] nunca será avaliado como verdadeiro porque está tentando comparar o literal $result com o literal yes .

Além disso, como Kusalananda aponta; o operador == é para construções de teste bash [[ , enquanto o operador = é para construções de teste padrão (POSIX) [ .

Portanto, você deve alterar essa linha para: [ "$result" = 'yes' ]

Outra boa ferramenta a ser conhecida é a set builtin e sua -x switch que pode ser usada para rastrear seus scripts. Se você adicionar set -x ao topo do seu script original e executá-lo, verá o seguinte impresso:

+ read -e -i no -p 'Install? ' result
Install? yes
+ '[' '$result' == yes ']'

Como você pode ver, está tentando comparar '$ result' a 'yes'. Quando citada corretamente, você não verá a variável $result , mas a expansão é assim:

+ read -e -i no -p 'Install? ' result
Install? yes
+ '[' yes == yes ']'
+ subs=('one' 'two')
+ declare -a subs
+ for sub in '"${subs[@]}"'
+ echo one
one
+ for sub in '"${subs[@]}"'
+ echo two
two

Sempre que você estiver batendo a cabeça contra a parede com um script, você deve ativar set -x e rastrear o que está fazendo e onde está errado.

    
por 11.10.2017 / 15:39
3

A seguir à resposta de @Jesse_b.

Por que preciso citar duas vezes a variável?

A diferença entre aspas simples e duplas:

Enclosing characters in single quotes preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.

Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of $, ', \, and, when history expansion is enabled, !.

Em man bash

Você precisa se lembrar disso bem, isso poupará o trabalho de depuração por um tempo.

    
por 11.10.2017 / 16:51

Tags