Estoy siguiendo esta guía de scripting de bash shell:
En la sección Comparaciones numéricas, cita un ejemplo:
anny > num=`wc -l work.txt`
anny > echo $num
201
anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi
Lo que parece suceder arriba es que almacenamos una cadena de comandos en una variable bash y luego invocamos echo en la variable. Lo que parece suceder es que se evalúa la cadena y se ejecuta el comando wc y devuelve el recuento de líneas al terminal de control.
Ok, entonces lanzo mi terminal en Ubuntu 12.04 e intento algo similar:
$ touch sample.txt && echo "Hello World" > sample.txt
$ cat sample.txt
Hello World
$ num='wc -l sample.txt'
echo $num
wc -l sample.txt
Espere un segundo, eso no evaluó la cadena y devolvió el recuento de líneas. Eso solo hizo eco de la cadena de regreso a la terminal. ¿Por qué obtuve resultados diferentes?
command-line
bash
scripts
JohnMerlino
fuente
fuente
wc -l work.txt
, sino que se le asigna el número 201.Respuestas:
Necesitas usar backticks para evaluar la expresión.
Si desea ver solo "1" en la salida, use el comando
Y también funciona:
Para obtener información adicional, consulte Diferencias entre comillas dobles "", comillas simples '' y comillas inversas ´ ´ en la línea de comandos?
fuente
wc
comando. Tratarcat sample.txt | wc -l
.Tenga en cuenta ese símbolo:
Una frase
y
Cita posterior
Por lo tanto, el Backquote devuelve el resultado del comando a Salida estándar. Es por eso que
devuelve resultados del comando, mientras
simplemente devuelva "wc -l sample.txt" como cadena habitual
Considere hacer esto como ejemplo:
Y ahora repite las tres variables:
fuente
Si desea capturar la salida de un comando en una variable, debe usar los backticks
``
o encerrar el comando en$()
:Tenga en cuenta que la cadena se evalúa realmente en el momento de la declaración de variable, no cuando la repite. El comando se ejecuta realmente dentro de las
$()
teclas de retroceso o y la salida de ese comando se guarda como el valor de la variable.En general, siempre debe usar en
$()
lugar de backticks que están en desuso y solo por razones de compatibilidad y mucho más limitados. No puede, por ejemplo, anidar comandos dentro de backticks, pero puede hacerlo con$()
:Consulte este hilo en U&L para obtener más detalles sobre por qué
``
debe evitarse.fuente
$(
)
a`
`
. Pero como dice Wag, las comillas inversas sí anidan.echo $(date -d $(echo yesterday))
se convierteecho `date -d \`echo yesterday\``
;echo $(echo $(date -d $(echo yesterday)))
se convierteecho `echo \`date -d \\\`echo yesterday\\\`\``
. Digo que esto no refuta su tesis, sino que la fortalece : las comillas internas escapadas hacen que la`
`
sintaxis sea más poderosa de lo que a menudo se admite, pero el tratamiento especial\
es extraño, sorprendente y difícil de razonar. Con$(
)
lo que ves es generalmente lo que obtienes.