Saltar al contenido

¿Por qué recibo un error de “operador unario esperado”?

El tutorial o código que encontrarás en este post es la resolución más eficiente y válida que encontramos a esta inquietud o problema.

Solución:

Necesita cotizaciones alrededor $THEME aquí:

if [ $THEME == '' ]

De lo contrario, cuando no especifique un tema, $THEME se expande a nada, y el shell ve este error de sintaxis:

if [ == '' ]

Con comillas añadidas, así:

if [ "$THEME" == '' ]

la expansión de un vacío $THEMEproduce esta comparación válida en su lugar:

if [ "" == '' ]

Esta capacidad de cometer errores de sintaxis en tiempo de ejecución puede sorprender a quienes tienen experiencia en lenguajes de programación más tradicionales, pero los shells de comandos (al menos los de la tradición Bourne) analizan el código de forma un tanto diferente. En muchos contextos, los parámetros de shell se comportan más como macros que como variables; este comportamiento proporciona flexibilidad, pero también crea trampas para los incautos.

Desde que etiquetaste esta pregunta intentovale la pena señalar que no se realiza una división de palabras en el resultado de la expansión de parámetros dentro de la “nueva” sintaxis de prueba disponible en bash (y ksh/zsh), a saber [[]]. Así que también puedes hacer esto:

if [[ $THEME == '' ]]

Los lugares a los que puede escaparse sin comillas se enumeran aquí. Pero es un buen hábito citar siempre las expansiones de parámetros de todos modos, excepto cuando desea explícitamente dividir las palabras (e incluso entonces, vea si las matrices resolverán su problema en su lugar).

Sería más idiomático usar el -z operador de prueba en lugar de igualdad con el vacío string:

if [ -z "$THEME" ]

Técnicamente, no necesita las comillas en este caso simple; [ -z ] evalúa a true. Pero si tiene una expresión más complicada, el analizador se confundirá, por lo que es mejor usar siempre las comillas. Por supuesto, [[]] tampoco requiere ninguno aquí:

if [[ -z $THEME ]]

Pero [[]] no es parte del estándar POSIX; por lo demás, tampoco ==. Entonces, si le preocupa la compatibilidad estricta con otros shells POSIX, apéguese a la solución de cotización y use cualquiera -z o un solo =.

[ "$THEME" ] evaluará a false si $THEME no está definido o está vacío string y true de lo contrario. Consulte http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html#Bash-Conditional-Expressions. Puede reorganizar su declaración if para explotar este comportamiento y tener un condicional aún más simple:

if [ "$THEME" ]; then
    cd 'workspace/aws/ghost/'$THEME'/'
    grunt watch
else
    echo 'Need to specify theme from the following'
    ls workspace/aws/ghost
fi

"$THEME" debe estar entre comillas dobles, en caso de que su valor contenga espacios en blanco.

Te invitamos a corroborar nuestra faena mostrando un comentario o puntuándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *