Como escapar de aspas simples ou duplas ao passar uma variável para o script bash?

4

Digamos que eu tenha um script que ecoa $1

#!/bin/bash
echo $1

É chamado de test.sh . Então eu chamo /bin/test.sh 'test' . A saída é test . Mas isso não funciona:

/bin/test.sh 'te'st'

Há um erro de sintaxe.

Pode haver algo entre essas duas citações simples, por exemplo

/bin/test.sh 'te"s"t'' or '/bin/test.sh 'te's't'' or '/bin/test.sh 'te"s't'

Existe uma maneira de lidar com isso? Eu posso trabalhar apenas com citações incluídas. Eu não posso alterar o que está dentro da variável; é uma análise de log. Qualquer coisa pode estar dentro de uma entrada de log.

Eu preciso que o bash leve esses argumentos corretamente.

Exemplo:

/bin/test.sh '2015.11.11 07:45:44.060|executor-2|||ERROR|236 - PDF document for 5616904 wasn't created!'

Isso não funciona porque o único ' na palavra não estava dentro da string.

A string está sendo colocada exatamente como eu a escrevi. Eu estou usando com o Zabbix (solução de monitoramento). Então, no zabbix, é algo assim:

/bin/test.sh '{$TRIGGER.VALUE}'

Mas, no final, {$TRIGGER.VALUE} é substituído pela string real e o script é chamado com valor literal.

    
por Pepa Vidlák 18.11.2015 / 13:53

2 respostas

3

Sua abordagem é fundamentalmente falha. Você tritura a carne em hambúrguer para o transporte, e depois quer pegar a vaca de volta no final. Não, isso não funciona.

Em vez de injetar a string diretamente no comando shell, passe-a como um argumento. Eu não estou familiarizado com o Zabbix, mas olhando para a documentação, isso parece ser como ele funciona (por exemplo, , parâmetros do usuário : você especifica um comando, e os argumentos necessários. Portanto, especifique apenas test.sh como o comando e especifique que o parâmetro obtido é "{TRIGGER.VALUE}" . Aparentemente (mais uma vez, não estou familiarizado com o Zabbix), isso significa que você escreve algo como

test.sh["{TRIGGER.VALUE}"]

Em test.sh , para se referir ao argumento do script, lembre-se de que você precisa escrever "$1" , não $1 .

    
por 19.11.2015 / 02:34
2

Para colocar aspas simples na linha de comando, use aspas duplas ou barra invertida:

test.sh "'test'"
test.sh \'test\'

Mas no seu post, parece que o seu verdadeiro problema é diferente:

I can't alter what is inside the variable

Se você já tiver uma string em uma variável, apenas aspas duplas para passar seu valor inalterado.

test.sh "$var"
    
por 18.11.2015 / 14:01