Como eco entre aspas simples ao usar aspas simples para envolver caracteres especiais no shell?

26

Estou lendo o tutorial do shell hoje em http://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm

Em que menciona:

Se uma aspas simples aparecer dentro de uma sequência a ser impressa, você não deve colocar a sequência inteira entre aspas simples, em vez disso, precederia o uso de uma barra invertida () da seguinte maneira:

echo 'It\'s Shell Programming'

Eu tentei isso no meu servidor centos, ele não funciona, um >prompt para sugerir que eu digite mais.

Fiquei me perguntando, uma vez que duas aspas simples transformam todos os caracteres especiais em caracteres normais, que incluem símbolo de escape \, mas se excluem, o ',
como devo representar uma única aspas 'em uma frase de aspas simples?

zen
fonte
1
Por que não usar echo It\'s Shell Programmingou echo "It's Shell Programming"?
precisa saber é
@cuonglm, porque eu posso usar a frase comoecho Wow, I'm going to have lots of $$$$$$ now
Zen
2
Portanto, você deve usar aspas duplas e escapar $também. Algo como echo Wow, I\'m going to have lots of \$\$\$\$\$\$ nowou apenasecho Wow, I\'m going to have lots of '$$$$$$' now
cuonglm
@cuonglm, sim, eu posso fazê-lo, e eu sei como posso fazê-lo. Mas o tutorial que estou lendo parece confiante de que existe uma maneira de escapar de aspas simples dentro de frases com aspas simples, mas o exemplo do tutorial não funciona. Então, eu estou querendo saber que alguém pode saber a solução.
Zen
1
Que tal agora? echo 'It'"'"'s Shell Programming'. Eu apenas o divido em três cadeias, a primeira e a última cercadas por aspas simples, mas a do meio tem uma aspas simples cercada por aspas duplas.
Jcbermu #

Respostas:

49

O tutorial está errado.

O POSIX diz:

Aspas simples não podem ocorrer entre aspas simples.

Aqui estão algumas alternativas:

echo $'It\'s Shell Programming'  # ksh, bash, and zsh only, does not expand variables
echo "It's Shell Programming"   # all shells, expands variables
echo 'It'\''s Shell Programming' # all shells, single quote is outside the quotes
echo 'It'"'"'s Shell Programming' # all shells, single quote is inside double quotes

Leitura adicional: Citações - Greg's Wiki

Mikel
fonte
4
Mais um: echo 'It''s Shell Programming'- zsh com o rc_quotesconjunto de opções (e o shell rc também) - um par de aspas simples dentro de aspas simples representa uma única aspas simples.
Michał Politowski
5
Às vezes eu uso q="'"e qq='"'para fazer isso mais limpo. Isso então permite echo "It${q}s ${qq}Shell Programming${qq}"(colchetes são necessários devido às letras finais). Seguro para POSIX. A camada externa deve estar entre aspas duplas.
Adam Katz
1

Você pode usar:

sed "s/'"'/&\\&&/g
     s/.*/'"'&'"'/
' <<IN
$arbitrary_value
IN

Para fazer shell com segurança, cite uma linha de valor por linha.

Dependendo do shell, você também pode ter a opção de fazer:

printf %q\\n "$arbitrary_value"

Embora eu prefira fazer:

a=$(alias "a=$arbitrary_value" a); a=${a#*=}

Uma abordagem mais manual pode se parecer com:

sq(){ set \' "$1"
      while case $2 in (*\'*) :;;
      (*) ! RETURN="$1$2'"     ;;esac
      do  set "$1${2%%\'*}'\''" "${2#*\'}"
      done
}

... que é, pelo menos, sem garfo.

mikeserv
fonte
1
Não tenho idéia do que você está falando, exceto a frase printf %q\\n "$arbitrary_value", outros são muito complicados.
Zen
1

Caso outra pessoa apareça para colocar uma mistura de aspas simples e duplas em um arquivo, isso também funcionará:

cat > its-shell-programing.txt << __EOF__
echo $'It\'s Shell Programming'
echo "It's Shell Programming"
echo 'It'\''s Shell Programming'
echo 'It'"'"'s Shell Programming'
__EOF__

Tudo o que o shell pode ver como variável deve ser escapado por uma barra invertida:

cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__
alexh
fonte