
¿Cómo puedo escribir esto correctamente con un script AIX? Mi requisito es escribir este comando en test.txt:
clock=$(prtconf -s | awk '{print $4,$5}')
Probé este comando:
print 'clock=$(prtconf -s | awk '{print $4,$5}')' > test.txt
El resultado escrito en test.txt me da:
clock=$(prtconf -s | awk {print ,})
Si uso " "
comillas:
print "clock=$(prtconf -s | awk '{print $4,$5}')"
Me da directamente a:
clock=3612 MHz
¿Como puedo resolver esto?
Respuesta1
La forma más sencilla de hacerlo es utilizar comillas simples '…'
alrededor de la cadena. Las comillas simples delimitan una cadena literal, por lo que puedes poner cualquier cosa entre ellas excepto una comilla simple '
. Para insertar una comilla simple en la cadena, use la secuencia de cuatro caracteres '\''
(comillas simples, barra invertida, comillas simples, comillas simples).
Técnicamente, no hay forma de poner una comilla simple dentro de un literal entre comillas simples. Sin embargo, los literales consecutivos son tan buenos como un solo literal. 'foo'\''bar'
se analiza como
- el literal entre comillas simples
foo
- el carácter literal entre comillas con barra invertida
'
- el literal entre comillas simples
bar
Esto significa efectivamente que '\''
es una forma de escapar de una comilla simple en un literal entre comillas simples.
Tenga en cuenta que el print
comando ksh realiza una expansión de barra invertida. Agregue la -r
opción para evitar esto. No le hará daño porque no hay una barra invertida en la cadena que desea imprimir, pero es mejor usar -r
, en caso de que se agregue una barra invertida durante el mantenimiento.
print -r -- 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt
Alternativamente, puedes usar el método POSIX para imprimir una cadena literalmente con una nueva línea al final:
printf '%s\n' 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt
Respuesta2
Debe seguir usando comillas simples, pero luego imprimir las que necesita en el resultado "por separado" o usar comillas dobles y escapar de los signos de dólar.
Para la segunda opción:
print "clock=\$(prtconf -s | awk '{print \$4,\$5}')" > test.txt
Por el primero:
print 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt
(Eso entonces 'text'
se escapó de comillas simples ).\'
'other text'
En aras de la integridad, tenga en cuenta que print
expande las secuencias de escape de caracteres de barra invertida (esto no importa en su caso porque la cadena que desea imprimir no contiene ninguna barra invertida). Para evitar esto, utilice print -r
.
Respuesta3
Hay 2 soluciones, como dijo @Mat.
1] Uso de comillas simples '
: estas comillas simples eliminan el significado especial de los caracteres de escape y $
diferentes comandos (básicamente todas las construcciones bash y los comandos Unix). print
El comando tomará todo como caracteres simples y lo escribirá en un archivo.test.txt
2] Uso de comillas dobles "
: aquí necesitamos escapar explícitamente de las construcciones bash. \$
elimina el significado especial de $
, es decir, el valor de la variable utilizada después de $
.
Respuesta4
¿Por qué no utilizar simplemente unaquí documento?
cat <<'END' > test.txt
clock=$(prtconf -s | awk '{print $4,$5}')
END
Tenga en cuenta las comillas END
en <<'END'
: significan que el texto de las siguientes líneas (hasta el END
marcador) se utilizará literalmente. Con sólo , se realizaría <<END
la expansión del dólar (es decir, $(command)
o ).$variable