2011-03-11 15 views
12

He la siguiente línea como parte de una escritura del golpe mucho más grande:comando dentro de si la declaración de la escritura del golpe

if [ `packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^ *//g'` -eq 1 ] 

después de ejecutar el guión, me sale:

./install.sh : línea 219: [: -eq: operador unario espera

donde la línea 219 es la línea anterior. Alguna sugerencia para una solución?

Respuesta

22

Esto ocurre cuando está utilizando el test incorporado a través de [ y su expresión del lado izquierdo devuelve NUL. Puede solucionar este problema mediante el uso de:

if [ x`some | expression | here` = x1 ]; then 

O bien, como ya se está utilizando fiesta puede utilizar la sintaxis es mucho mejor (()) que no tiene este problema y hacer:

if (($(some | expression | here) == 1)); then 

Tenga en cuenta que también utilicé $() para la sustitución de comandos sobre acentos abiertos `` ya que este último no es POSIX y dEPRECATED

4

Pruebe [[test_expression]]; en lugar de [test_expression];

8

El error se produce debido a que su sustitución comando devuelve nada efectivamente hacer que su mirada prueba como:

if [ -eq 1 ] 

Una forma común de solucionar este problema es añadir alguna constante en ambos lados de la ecuación, de manera que ningún operando se convierte vaciar en cualquier momento:

if [ x`packages/TinySVM-0.09/bin/svm_learn 2>&1| grep TinySVM | wc -l | cut -c0-7 | sed 's/^ *//g'` = x1 ] 

Tenga en cuenta que se está utilizando = como ahora estamos comparando cadenas.

4

se podría añadir una "x" a ambos lados de la comparación o usted podría citar el lado izquierdo:

[ "$(command | pipeline)" = 1 ] 

No entiendo para qué sirven cut y sed. La salida de wc -l en una tubería es simplemente un número.

18

Puede ejecutar su comando sin ninguna sintaxis adicional. Por ejemplo, las siguientes comprobaciones el código de salida de grep para determinar si la expresión regular coincide o no:

if ! grep -q "$word" /usr/share/dict/words 
then 
    echo "Word $word is not valid word!" 
fi 
+1

Eso es lo que estaba buscando ... – mmey

+0

¿Hay alguna razón para no usar esta técnica, ya que es mencionado muy raramente? –

+1

Probablemente encontré la razón por mí mismo: con grep que funciona bien, pero con otros comandos, que podría dar como resultado algo. (y no solo devuelve un código), esta salida se imprimirá en stdout. ¿Qué pasa con '' '' if command> &/dev/null; entonces ... '' ''? –

Cuestiones relacionadas