Estoy intentando replicar el código deaquí
Por alguna razón, no funciona en mi computadora. La salida, en lugar del valor numérico, es el comando en sí.
apple$ x='echo "var=500;var%=7;var"|bc'
apple$ $x
"var=500;var%=7;var"|bc
Me gustaría saber por qué es eso. ¿Que hice mal?
Respuesta1
La fuente utiliza comillas invertidas ( `
) para indicar la sustitución de comandos. Se ejecuta el comando especificado entre las comillas invertidas y el resultado se coloca en su lugar. En este caso, se trata de una asignación de variable simple, por lo que el resultado del comando se asigna a la variable.
Esto es fácil de ver con la -x
opción de bash:
$ x=`echo "var=500;var%=7;var"|bc`
++ echo 'var=500;var%=7;var'
++ bc
+ x=3
En lugar de los caracteres de acento grave, ha utilizado comillas simples. Las comillas simples le indican al shell que mantenga el valor literal y no aplique ningún tipo de procesamiento a su contenido. Como resultado, el comando se asigna tal cual a la variable. Esta es la -x
salida correspondiente:
$ x='echo "var=500;var%=7;var"|bc'
+ x='echo "var=500;var%=7;var"|bc'
Por último, para imprimir el contenido de las variables, debe utilizar echo
o printf
. Cuando el valor de 'x' es 3, ejecutar $x
le dará un -bash: 3: command not found
mensaje de error. La ejecución $x
funcionó en su caso solo porque el echo
comando era parte del contenido de la variable.
Respuesta2
Como señaló Haxiel, en lugar de caracteres de acento grave, lo más probable es que haya utilizado comillas simples. Pero mejor que usar comillas invertidas ( `
), le sugiero que las use $()
. Las comillas invertidas están en desuso y $()
son compatibles con POSIX.
En tu ejemplo podrías hacer:
x=$(echo "var=500;var%=7;var" | bc)
echo "$x"
O en una sola línea:
echo "var=500;var%=7;var" | bc