Saída estranha com a legenda de comando usando backticks no script bash

2
echo "testing:"
PROXY_URL="/proxyurl/"
proxyUrlSedEscaped='echo "$PROXY_URL" | sed -e 's/[\/&]/\&/g''
echo                     "$PROXY_URL" | sed -e 's/[\/&]/\&/g'
echo "$proxyUrlSedEscaped"

echo "???"

O texto acima tem a seguinte saída:

testing:
\/proxyurl\/
&proxyurl&
???

Por que a última saída de eco é diferente da saída de eco anterior?

Este comando funciona corretamente por meio da linha de comando: PROXY_URL="/proxyurl/"; echo "$PROXY_URL" | sed -e 's/[\/&]/\&/g' , saída: \/proxyurl\/

    
por Chris Stryczynski 27.06.2017 / 11:34

1 resposta

5

Pelo manual do Bash (e POSIX também ):

When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by $, ', or \.

Isso significa que 'echo "$PROXY_URL" | sed -e 's/[\/&]/\&/g'' resulta no comando sed que é executado sendo sed -e 's/[\/&]/\&/g' , porque a barra invertida dupla escapou para uma única. \& , em seguida, faz um literal & in sed.

Você pode usar a substituição do comando $(...) -style para evitar isso:

proxyUrlSedEscaped=$(echo "$PROXY_URL" | sed -e 's/[\/&]/\&/g')

A substituição de novo estilo permite qualquer comando com sua interpretação usual.

Se você precisar usar ' , a dupla fuga bastante grotesca também funciona:

proxyUrlSedEscaped='echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g''

Isso transforma \\ em \ , que sed transforma em \ para você.

    
por 27.06.2017 / 11:55