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 $THEME
produce 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.