
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
- o literal entre aspas simples
foo
- o caractere literal entre aspas invertidas
'
- o literal entre aspas simples
bar
Isso efetivamente significa que '\''
é uma maneira de escapar de aspas simples em um literal entre aspas simples.
Observe que o print
comando ksh executa expansão de barra invertida. Adicione a -r
opçã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 print
expande 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). print
comando 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 END
em <<'END'
: elas significam que o texto nas linhas seguintes (até o END
marcador) será usado literalmente. Com apenas <<END
, a expansão do dólar (ou seja, $(command)
ou $variable
) seria realizada.