Como ecoar 'aspas simples' ao usar aspas simples para agrupar caracteres especiais no shell?

26

Estou lendo o tutorial do shell hoje no link

Em que menciona:

If a single quote appears within a string to be output, you should not put the whole string within single quotes instead you whould preceed that using a backslash () as follows:

echo 'It\'s Shell Programming'

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

Eu queria saber, já que duas aspas simples transformam cada caractere especial em caracteres normais, que incluem o símbolo de escape \ , mas se excluem, o ' ,
como devo representar uma única cota única ' em uma frase entre aspas simples?

    
por Zen 02.03.2015 / 09:47

3 respostas

46

O tutorial está errado.

POSIX diz:

A single-quote cannot occur within single-quotes.

Veja 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

Outras leituras: Citações - Wiki de Greg

    
por 02.03.2015 / 10:25
1

Você pode usar:

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

Para proteger 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 geralmente prefira fazer:

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

Uma abordagem mais manual poderia parecer:

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

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

    
por 02.03.2015 / 21:46
1

No caso de alguém aparecer para colocar uma mistura de aspas simples e duplas em um arquivo, isso também está funcionando:

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 uma variável, embora deva ser escapado por uma barra invertida:

cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__
    
por 13.06.2016 / 23:03

Tags