Imprima uma string incluindo aspas simples e outros caracteres especiais

4

Como posso escrever isso com um script AIX corretamente? Minha exigência é 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

Saída escrita em test.txt me dá:

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

Se eu usar " " quotes:

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

Isso me dá diretamente para:

clock=3612 MHz

Como posso resolver isso?

    
por batil 10.06.2014 / 11:12

4 respostas

2

Você precisa continuar usando aspas simples, mas depois imprimir as que precisa na saída "separadamente" ou usar aspas duplas e escapar dos sinais de dólar.

Para a segunda opção:

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

Para o primeiro:

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

(Isso é 'text' , em seguida, escapou da cota única \' then 'other text' .)

Para fins de conclusão, observe que print expande seqüências de escape de caractere de barra invertida (isso não importa no seu caso porque a cadeia que você deseja imprimir não contém nenhuma barra invertida). Para evitar isso, use print -r .

    
por 10.06.2014 / 12:05
2

A maneira simples de fazer isso é usar aspas simples '…' ao redor da string. As aspas simples delimitam uma string literal, portanto, você pode colocar qualquer coisa entre elas, exceto uma única aspas ' . Para inserir uma aspa simples na string, use a seqüência de quatro caracteres '\'' (aspas simples, barra invertida, aspas simples, aspas simples).

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

  1. o literal com aspas simples foo
  2. o caractere literal com aspas invertidas '
  3. o literal com aspas simples bar

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

Observe que o comando ksh print executa a expansão de barra invertida. Adicione a opção -r para evitar isso. Ele não vai te machucar porque não há barras invertidas na string que você deseja imprimir, mas é melhor usar -r , no caso de uma barra invertida ser adicionada durante a manutenção.

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

Como alternativa, 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
    
por 20.07.2015 / 00:09
1

2 solução está lá como @Mat disse.

1] Usando aspas simples ' : essa aspa simples remove o significado especial de caracteres de escape, $ , comandos diferentes (basicamente todas as construções bash e comandos unix). O comando print terá tudo como caracteres simples e gravará isso no arquivo test.txt

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

    
por 10.06.2014 / 13:42
1

Por que não usar apenas um documento aqui ?

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

Observe as aspas em torno de END em <<'END' : elas significam que o texto nas linhas a seguir (até o marcador END ) será usado literalmente. Com apenas <<END , a expansão em dólar (ou seja, $(command) ou $variable ) seria executada.

    
por 10.06.2014 / 14:32