Imprimer une string contenant des guillemets simples et d'autres caractères spéciaux

Comment puis-je écrire ceci avec un script AIX correctement? Ma condition est d'écrire cette command dans test.txt:

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

J'ai essayé cette command:

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

La sortie écrite dans test.txt me donne:

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

Si j'utilise des guillemets " " :

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

Cela me donne directement à:

 clock=3612 MHz 

Comment puis-je resoudre ceci?

Vous devez soit continuer à utiliser des guillemets simples, mais ensuite imprimer ceux dont vous avez besoin dans la sortie "séparément", ou utiliser des guillemets doubles et échapper aux signes dollar.

Pour la deuxième option:

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

Pour le premier:

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

(C'est 'text' puis échappé guillemet simple \' puis 'other text' .)

Pour être complet, notez que print développe des séquences d'échappement de type backslash (cela n'a pas d'importance dans votre cas car la string que vous voulez imprimer ne contient aucune barre oblique inverse). Pour éviter cela, utilisez print -r .

2 solution est là comme @Mat dit.

1] Utilisation d'un guillemet simple ' : ce guillemet unique élimine la signification spéciale des caractères d'échappement, $ , des commands différentes (essentiellement toutes les constructions bash et les commands unix). command d' print prendra tout comme des caractères simples et écrit ceci dans le file test.txt

2] Utiliser des guillemets " : Ici, nous devons explicitement échapper aux constructions bash. \$ Supprime la signification spéciale de $ , c'est-à-dire la valeur de la variable utilisée après $ .

Pourquoi ne pas simplement utiliser un document ici ?

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

Notez les guillemets autour de END dans <<'END' : ils signifient que le text dans les lignes suivantes (jusqu'au marqueur END ) sera utilisé littéralement. Avec seulement <<END , l'expansion du dollar (ie $(command) ou $variable ) sera effectuée.

La façon simple de le faire est d'utiliser des guillemets simples '…' autour de la string. Les guillemets simples délimitent une string littérale, de sorte que vous pouvez mettre n'importe quoi entre eux sauf un guillemet simple. Pour insert un guillemet simple dans la string, utilisez la séquence à quatre caractères '\'' (guillemet simple, barre oblique inverse, guillemet simple, guillemet simple).

Techniquement, il n'y a aucun moyen de mettre une seule citation à l'intérieur d'un seul coté. Cependant, les littéraux consécutifs sont aussi bons qu'un seul littéral. 'foo'\''bar' est analysé comme

  1. le foo littéral unique-cité
  2. le caractère littéral ' antislash '
  3. la bar littérale cotée unique

Cela signifie effectivement que '\'' est un moyen d'échapper à un guillemet simple dans un littéral unique.

Notez que la command ksh print exécute une extension de barre oblique inverse. Ajoutez l'option -r pour éviter cela. Cela ne vous fera pas de mal car il n'y a pas de barre oblique inverse dans la string que vous voulez imprimer, mais il est préférable d'utiliser -r , au cas où une barre oblique inverse serait ajoutée pendant la maintenance.

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

Vous pouvez également utiliser la méthode POSIX pour imprimer une string littéralement avec une nouvelle ligne à la fin:

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