Como comparar a variável bash com aspas duplas

0

Eu tenho esse código

STATUS='echo "test"'


if [ $STATUS == "test" ]; then
   exit 0
fi

Eu tentei de tudo e não consigo torná-lo verdadeiro.

Eu tentei

"$STATUS" == "test"
eval $STATUS == "test"
${STATUS[@]} == "test"

A única coisa que funcionou é

$STATUS == \"test\"
    
por Mirage 29.06.2018 / 05:48

3 respostas

2

O código na pergunta funciona, o que significa que ele executará a instrução exit 0 .

Seu

STATUS='echo "test"'

é o mesmo que

STATUS="test"

e (neste caso) como

STATUS=test

i.e. a variável STATUS é atribuída test como valor (não há aspas duplas no valor).

Para testar isso com o valor test , faça

if [ "$STATUS" = "test" ]

ou

if [[ $STATUS == "test" ]]

Se STATUS tiver o valor "test" , como em

STATUS='"test"'

use essa string na comparação:

if [ "$STATUS" = '"test"' ]

ou

if [[ $STATUS == '"test"' ]]

Veja também:

por 29.06.2018 / 08:50
0

Essas citações com escape em \"test\" me fazem pensar que há alguma confusão sobre as regras de citação do shell, porque o primeiro código funciona como pretendido e $STATUS == \"test\" não deveria (a menos que você tenha escrito STATUS='echo '"test"'' ou algo semelhante ).

Para esclarecer adequadamente essa confusão, é necessário explicar alguns conceitos de shell.

Citação

Em shells POSIX, a cotação é um dos mecanismos mais importantes. Infelizmente, também é um tópico muito confuso e, quando usado incorretamente, uma grande fonte de bugs e comportamentos estranhos em scripts.

As regras básicas são as seguintes:

  1. Caractere de escape \ : Preserva o valor literal do próximo caractere seguinte, com exceção de <newline> .
  2. Aspas duplas " : Preserva o valor literal de todos os caracteres entre aspas, com exceção de $ , ' , \ e, quando a expansão de histórico está ativada, ! .
  3. Aspas simples ' : Preserva o valor literal de todos os caracteres dentro das aspas, sem exceções.

Substituição de comandos

A substituição de comandos permite que a saída de um comando substitua o comando em si. Sua sintaxe é $(command) ou 'command' , embora a primeira seja preferida.

Comando de teste

O comando test (também conhecido como [ em POSIX e [[ em shells como bash, ksh e zsh) permite usar várias expressões aritméticas e condicionais úteis. Por exemplo, ele pode verificar se um determinado arquivo regular existe e é legível, se duas sequências são iguais ou se um número é maior que outro.

Agora, analisando o código:

STATUS='echo "test"'

A substituição de comando aqui é inútil, já que poderia ter sido escrita como STATUS="test" . Observe que as aspas duplas não são impressas por echo , portanto STATUS contém test como seu valor.

if [ $STATUS == "test" ]; then
   exit 0
fi

Aqui estão, pelo menos, 3 possíveis falhas:

  1. O $STATUS sem aspas pode ser afetado pela divisão de palavras.
  2. == é sintaxe não POSIX. Use = se você se importa com a portabilidade.
  3. if e exit 0 são inúteis neste cenário, pois [ já faz o trabalho pretendido.

Além disso, observe que, como a linha de código anterior, as aspas duplas não são consideradas literalmente, portanto, o comando resultante (após a remoção da expansão e da cotação) é [ test = test ] , o que é verdadeiro.

Mas se sua meta fosse ter "test" como o valor de STATUS ,

STATUS=\"test\"
STATUS="\"test\""
STATUS='"test"'

são todas as atribuições válidas e

[ "$STATUS" = \"test\" ]
[ "$STATUS" = "\"test\"" ]
[ "$STATUS" = '"test"' ]

são todas expressões condicionais válidas.

    
por 29.06.2018 / 10:42
0

A solução para esse problema pode diferir com base no shell que você está usando. Além disso, certifique-se de que $ STATUS contenha "teste" antes da comparação com uma linha "echo $ STATUS" em seu script. Verificar o conteúdo das variáveis é muito útil para a depuração. Embora improvável, há uma pequena chance de algum outro programa estar configurando-o, caso em que obviamente falhará.

No geral, o código que você escreveu DEVE funcionar. Se não for o problema, talvez seja necessário haver qualquer outro código no script, o próprio shell ou algum outro programa interferindo. Você pode tentar exportar a variável do sistema com exportação para garantir que ela esteja configurada corretamente. Isso deve substituir todos os valores interferentes. Tenha em mente se outro programa está interferindo, pode não gostar que suas variáveis sejam alteradas.

Como referência, fornecerei as seguintes informações:

A melhor maneira de definir uma variável para um estado simples como "teste" é simplesmente:

VARIABLE="value"

Enquanto você pode usar echo para retornar o texto para uma variável, para strings como test, não há motivo para isso. A menos que você pretenda inserir caracteres de controle como feeds de linha usando echo -e ou printf.

A maneira recomendada de comparar uma string é com um destes:

if [ "$VARIABLE" = "value" ]; then
if [[ $VARIABLE == value ]]; then

Se você ainda não tentou, tente usar o mais novo [[ também conhecido como teste estendido, em vez de [ também conhecido como teste clássico.

link

link

Estes são ótimos recursos para ajudá-lo a obter mais informações, se você quiser saber todos os detalhes sobre os operadores de teste.

    
por 29.06.2018 / 09:09