2012-05-14 22 views
12

en mi secuencia de comandos bash, tengo una función para devolver 0 o 1 (verdadero o falso) para la condición de la función principal posterior.encuentro "operador unario esperado" en el script bash

function1() { 
    if [[ "${1}" =~ "^ ...some regexp... $" ]] ; then 
     return 1 
    else 
     return 0 
    fi 
} 

entonces en mi función principal:

main() { 
    for arg in ${@} ; do 
     if [ function1 ${arg} ] ; then 
      ... 
     elif [ ... ] ; then 
      ... 
     fi 
    done 
} 

sin embargo, cuando me encontré con este guión que siempre me dio un error msg "[: function1: operador unario espera"

puede ayudar a nadie ¿yo por favor?

+1

Tenga en cuenta que, al menos en la versión 4 de bash, no debe citar la expresión regular : hacerlo fuerza una simple coincidencia de cadenas - [documentado aquí] (http://www.gnu.org/software/bash/manual/bashref.html#index-g_t_005b_005b-57). Además, debe usar 'para arg en" $ @ "' con las comillas, o 'para arg; do ... ' –

+1

Deberías poner tu expresión regular en una variable. 'pattern = '^ ... some regexp ... $'; si [[$ 1 = ~ $ patrón]] '. Tenga en cuenta que dentro de los corchetes dobles, no es necesario citar variables y, como dijo glenn, la expresión regular (variable) nunca se debe citar. –

Respuesta

28

Comete el error común de suponer que [ es parte de la sintaxis del comando if. No lo es; la sintaxis de if es simplemente

if command; then 
    ... things which should happen if command's result code was 0 
else 
    ... things which should happen otherwise 
fi 

Uno de los command s comunes que usamos es [ que es un alias para el comando test. Es un comando simple para comparar cadenas, números y archivos. Acepta una combinación bastante estrecha de argumentos, y tiende a generar mensajes de error confusos y engañosos si no le pasa los argumentos esperados. (O más bien, los mensajes de error son adecuados y útiles una vez que te acostumbras, pero son fácilmente incomprendidos si no te utilizan)

En tu función main, la llamada al [ aparece fuera de lugar. Probablemente se refiera a

if function "$arg"; then 
    ... 
elif ... ; then ... 

Por cierto, para una buena medida, siempre debe citar sus cadenas. Utilice "$1" no $1 y "$arg" en lugar de $arg.

Las razones históricas para test como un fregadero de la cocina general de cosas que los autores no quisieron hacer parte de la sintaxis de if es uno de los diseños menos atractivos del shell Bourne original. Bash y zsh ofrecen alternativas que son menos difíciles de manejar (como los [[ paréntesis dobles en bash, que se usan en su definición function1), y por supuesto, POSIX test es mucho más temperamental que la creación original de Bell Labs.

como una aclaración adicional, su función se puede simplificar a solo

function1() { 
    ! [[ "$1" =~ "^ ...some regexp... $" ]] 
} 

Es decir, realizar la prueba con [[ y revertir su código de resultado. (El caso "normal" sería devolver 0 para tener éxito, pero quizás esté intentando verificar que la cadena no concuerde?)

+0

esos ... representan el script después de $ {1}, y en mi secuencia de comandos actual, dividí cuidadosamente mi secuencia de comandos y los corchetes con un espacio. así que no creo que sea el problema con ese –

+0

no, mi función 1 en realidad comprueba si ese $ 1 coincide con algún tipo de expresión regular.y mi función 1 funciona bien sola. así que lo que creo es que hay algún problema con la condición en mi función principal –

+0

Oh, lo siento, me perdí el error en 'main'. Gracias por la pista. El análisis básico aún se mantiene; '[' no es lo que crees que es. – tripleee

Cuestiones relacionadas