Script de bash, string não substituída corretamente por $ e caracteres & com escape

2

Eu criei um script de shell que usa uma string como entrada. Se a string contiver $ ou & , será necessário substituir esses caracteres por \$ e \& . Eu poderia fazer isso com o comando sed . Depois disso, quero substituir uma palavra em um arquivo de texto específico por essa string correspondente.

Por favor, consulte esta seção para mais esclarecimentos.

Este é o meu arquivo.

test.txt

hello my root password is root.

Agora, quero alterar a palavra raiz com uma string. A string pode ser qualquer coisa que inclua caracteres especiais como $ ou & .

Se eu quiser substituir root pela string my&rootpa$$ , ele deverá se parecer com my\&rootpa\$\$ no arquivo de texto.

Este é o meu scipt shell

#!/bin/bash
dothis(){
    rootpass=$(echo "$1" | sed -r 's/\$/\$/g');
    rootpass=$(echo "$rootpass" | sed -r 's/\&/\&/g');
    echo $rootpass;
    sed -i "s/root/$rootpass/g" test.txt
}
dothis "my&rootpa$$";

Esse script funciona corretamente até echo $rootpass , o que significa que, quando eu fizer o eco da string, ele exibirá my\&rootpa\$\$ .

Mas no arquivo parece my&rootpa$$ em vez de my\&rootpa\$\$ . O que há de errado com o roteiro?

Por favor, conselhos.

    
por Uvais Ibrahim 22.01.2014 / 07:55

3 respostas

2

Existe uma camada extra de cotação ausente. Em sed & tem um significado especial na substituição (significa a string correspondente). Então, para inserir um literal & você escaparia dele uma vez, e para inserir um literal \& , você escaparia da barra invertida ( \ ) e do e comercial ( \& ), mesmo para a barra invertida antes de% código%. Isso te dá:

#!/bin/bash
dothis(){
    rootpass="${1//\$/\\$}"
    rootpass="${rootpass//&/\\\&}"
    echo $rootpass
    sed -i "s/root/$rootpass/g" test.txt
}
dothis 'my&rootpa$$';
    
por 22.01.2014 / 08:46
0

Você deve alterar esta linha:

dothis "my&rootpa$$";

para

dothis "my&rootpa\$\$";

ou usando aspas em vez de aspas duplas:

dothis 'my&rootpa$$';

No seu caso, $$ na string my&rootpa$$ será expandido para o PID do próprio script.

    
por 22.01.2014 / 08:26
0

Esta " dothis "my&rootpa$$" usa aspas duplas e o " $$ " no final será expandido para o PID atual.Quando executo seu script, isso acontece:

 $ ./a.sh 
 my\&rootpa3595

... desde que "3595" é o PID do script. Quando você usa aspas simples (''), a seqüência de caracteres que você esperava é impressa:

 $ tail -1 a.sh 
 dothis 'my&rootpa$$';

 $ ./a.sh 
 my\&rootpa\$\$
    
por 22.01.2014 / 08:33