Imprima uma string incluindo aspas simples e outros caracteres especiais

Imprima uma string incluindo aspas simples e outros caracteres especiais

Como posso escrever isso corretamente com um script AIX? Meu requisito é escrever este comando em test.txt:

clock=$(prtconf -s | awk '{print $4,$5}')

Eu tentei este comando:

print 'clock=$(prtconf -s | awk '{print $4,$5}')' > test.txt

A saída escrita em test.txt me dá:

clock=$(prtconf -s | awk {print ,})

Se eu usar " "aspas:

print "clock=$(prtconf -s | awk '{print $4,$5}')"

Isso me dá diretamente para:

clock=3612 MHz

Como posso resolver isso?

Responder1

A maneira simples de fazer isso é usar aspas simples '…'ao redor da string. Aspas simples delimitam uma string literal, então você pode colocar qualquer coisa entre elas, exceto aspas simples '. Para inserir uma aspa simples na string, use a sequência de quatro caracteres '\''(aspas simples, barra invertida, aspas simples, aspas simples).

Tecnicamente, não há como colocar uma aspa simples dentro de um literal entre aspas simples. No entanto, literais consecutivos são tão bons quanto um único literal. 'foo'\''bar'é analisado como

  1. o literal entre aspas simplesfoo
  2. o caractere literal entre aspas invertidas'
  3. o literal entre aspas simplesbar

Isso efetivamente significa que '\''é uma maneira de escapar de aspas simples em um literal entre aspas simples.

Observe que o printcomando ksh executa expansão de barra invertida. Adicione a -ropção para evitar isso. Não vai te machucar porque não há barra invertida na string que você deseja imprimir, mas é melhor usar -r, caso uma barra invertida seja adicionada durante a manutenção.

print -r -- 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

Alternativamente, você pode usar o método POSIX para imprimir uma string literalmente com uma nova linha no final:

printf '%s\n' 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

Responder2

Você precisa continuar usando aspas simples, mas depois imprimir as que precisa na saída "separadamente" ou usar aspas duplas e escapar dos cifrões.

Para a segunda opção:

print "clock=\$(prtconf -s | awk '{print \$4,\$5}')" > test.txt

Pela primeira vez:

print 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

(Isso então 'text'escapou de aspas simples .)\''other text'

Para completar, observe que printexpande as sequências de escape de caracteres de barra invertida (isso não importa no seu caso porque a string que você deseja imprimir não contém nenhuma barra invertida). Para evitar isso, use print -r.

Responder3

A solução 2 existe como @Mat disse.

1] Usando aspas simples ': esta aspa simples remove o significado especial de caracteres de escape, $comandos diferentes (basicamente todas as construções bash e comandos unix). printcomando considerará tudo como caracteres simples e gravará isso no arquivotest.txt

2] Usando aspas duplas ": aqui precisamos escapar explicitamente das construções bash. \$remove o significado especial de $, ou seja, o valor da variável usada depois $.

Responder4

Por que não usar apenas umaqui documento?

cat <<'END' > test.txt
clock=$(prtconf -s | awk '{print $4,$5}')
END

Observe as aspas ENDem <<'END': elas significam que o texto nas linhas seguintes (até o ENDmarcador) será usado literalmente. Com apenas <<END, a expansão do dólar (ou seja, $(command)ou $variable) seria realizada.

informação relacionada