[: =: operador unário esperado [duplicado]

0

Eu preciso escrever um script para testar se um serviço dentro de um emulador Android está pronto para a instalação do apk ou não usando este comando

adb -s emulator-5554 shell pm list package | grep package:com.android.

Se o comando não produzir qualquer uma destas substrings na primeira linha, então o avd não está pronto para a instalação do apk

Is the system running?

Can't find service

online

Este é o meu script

if [ $(adb -s emulator-5554 shell pm list package | grep package:com.android. | head -n 1) = *"Is the system running?"* ] ||
   [ $(adb -s emulator-5554 shell pm list package | grep package:com.android. | head -n 1) = *"Can't find service"* ] ||
   [ $(adb -s emulator-5554 shell pm list package | grep package:com.android. | head -n 1) = *"online"* ] ; then
  echo "could not find package service"
else
  echo "found package service"    
fi  

mas recebo este erro

./script.sh: line 4: [: =: unary operator expected
./script.sh: line 5: [: =: unary operator expected
./script.sh: line 6: [: =: unary operator expected
    
por the_prole 26.11.2018 / 21:18

1 resposta

3

Nos testes, se a substituição do comando $(adb -s ...) gerar uma sequência de várias palavras, o shell a tratará como um erro de sintaxe. Você terá que citar as expansões:

[ "$(adb -s ...)" = *"Is the system running?"* ]

O resultado de uma substituição de comando sem aspas passará por divisão e globalização de nome de arquivo, exatamente como ocorre em uma expansão de variável sem aspas. Citando a expansão evita isso. No seu caso, é a divisão que causa problemas.

Com a substituição do comando expandida, o teste pode parecer algo como

if [ word1 word2 word3 = *"some string"* ]

Este é claramente um erro de sintaxe.

    
por 26.11.2018 / 21:22