Bash Error "se esperaba un operador unario"

Imagen de hadso
0 puntos

Estimados foristas, soy un usuario promedio de Ubuntu. No me dedico a la informática como medio de vida, es sólo un hoby.
Se algunos conceptos básicos de programación y me divierto aprendiendo.
Aclarado este punto, quiero hacerles la siguiente pregunta:
Estoy haciendo un pequeño script en bash para que forme los directorios y archivos iniciales requeridos en cualquier proyecto que se inicie en XUL. El tema es que me da un error que no se cómo resolver.

El código del script es el siguiente:

#!/bin/bash
# XUL Helper 0.1.3 (GPL v3)
# ./xul_helper $NOMBRE_DIRECTORIO $NOMBRE_APLICACION

if [ $1 -z ]
then 
    echo Falta el parametro Nombre de Directorio
    echo Pruebe con $ ./xul_helper DIRECTORIO NOMBRE_APLICACION
    exit 0
else
    if [ $2 -z ]
    then
		echo Falta el parametro Nombre de la aplicacion
		echo Pruebe con $ ./xul_helper DIRECTORIO NOMBRE_APLICACION
	exit 0
    else
		mkdir $1
		echo Directorio $1 creado
		cd $1
	
		# desde acá es la cración sólo de los archivos
		echo Directorio Chrome creado
		mkdir chrome
		cd chrome
		mkdir content
		echo Direcotrio Content creado
		cd content
		# echo Creando $2.xul
		echo -e "<?xml version="1.0"?>" >> $2.xul && 
		echo	 -e "<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>" >> $2.xul && 
		echo -e "> $2.xul && 
		echo -e "xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">" >> $2.xul && 
		echo -e "" >> $2.xul && 
		echo -e "" >> $2.xul 
		echo Archivo $2.xul creado
	
		cd ..
	
		echo -e "content hello file:content/" >> chrome.manifest
		echo Archivo chrome.manifest creado
		cd ..
		echo Archivo application.ini creado
		echo -e "[App]" >> application.ini &&
		echo -e "Version=1.0" >> application.ini &&
		echo -e "Vendor=$USER" >> application.ini &&
		echo -e "Name=$2" >> application.ini &&
		echo -e "BuildID=number" >> application.ini &&
		echo -e "ID=Creado con XUL Helper" >> application.ini &&
		echo -e "[Gecko]" >> application.ini &&
		echo -e "MinVersion=1.8" >> application.ini 
		
		echo Directorio defaults creado
		mkdir defaults
		cd defaults
		mkdir preferences
		echo Directorio preferences creado
		cd preferences
		
		echo -e "pref("toolkit.defaultChromeURI", "chrome://$1/content/hello.xul");" >> pref.js
		echo Archivo pref.js creado
		
		echo PROCESO FINALIZADO
		echo XUL Helper 0.1.3
	fi
fi
#Fin de creación de archivos

#chrome
#   | content
#       | hello.xul
#   | chrome.manifest
#defaults
#   | preferences
#       | pref.js
#application.ini

Como decía, es algo con lo que me entretengo pero se que no es útil.

Ahora bien, cuando lo ejecuto, si bien cumple con su función, es decir, si no tiene alguno de los dos parámetros el programa los pide y se cierra, o de tenerlos, crea los directorios y archivos.
Pero siempre que falte el segundo parámetro, el intérprete dice:
línea 5: [: app: se esperaba un operador unario

Alguien me puede explicar cómo resolver esto? Me llama la tención que el programa cumpla con lo programado, pero que a la vez manifieste esto.
Publico el código también para que ustedes me recomienden cómo mejorarlo y me acerquen sus ideas, de ser posible. Todo en pos de aprender.

Muchas gracias.

Saludos,

Imagen de AgD
+1
+1
-1

La sintaxis correcta para verificar si una cadena está vacía puede ser:

[ -z $1 ]
[[ -z $1 ]]
[[ $1 = "" ]]

Respecto al script en si, encerrar condicionales dentro de condicionales empeora la legibilidad. Siempre que sea posible, es mejor evitarlo. En tu caso lo podrías hacer, por ejemplo con:

#!/bin/bash
# XUL Helper 0.1.3 (GPL v3)
# ./xul_helper $NOMBRE_DIRECTORIO $NOMBRE_APLICACION
if [ -z $1 ] ; then 
    echo "Falta el parametro Nombre de Directorio"
    echo "Pruebe con $ ./xul_helper DIRECTORIO NOMBRE_APLICACION"
    exit 0
fi
if [ -z $2 ] ; then
     echo Falta el parametro Nombre de la aplicacion
     echo Pruebe con $ ./xul_helper DIRECTORIO NOMBRE_APLICACION
     exit 0
fi

Resto del script

También podrías agrupar las dos salidas

#!/bin/bash
# XUL Helper 0.1.3 (GPL v3)
# ./xul_helper $NOMBRE_DIRECTORIO $NOMBRE_APLICACION
if [[ -z $1 ]] || [[ -z $2 ]] ; then
     echo "Sintaxis incorrecta"
     echo "Recuerdo que la sintaxis debe ser ./xul_helper DIRECTORIO NOMBRE_APLICACION"
     exit 0
fi
Resto del script
+1
+1
-1

make install . es
Noticias, apuntes y pequeños tutoriales sobre GNU/Linux
Imagen de hadso
+1
0
-1

Muchas gracias por tu aporte.
Ahora mismo lo voy a probar.
Por otro lado, me he dado cuenta de que BASH no escribe las comillas en el string.
No me había dado cuenta porque sólo me había limitado a probar si el script hacía los archivos, pero no a probar los mismo en XUL.
Cómo puedo hacer para escribir las comillas (") en el string? Estimo que con alguna constante que las contenga.
Gracias de antemano!
Saludos,

+1
0
-1
Imagen de AgD
+1
+1
-1

Tan solo debes de proteger las comillas con el carácter \. Ejemplo:

agd-desktop # echo "Proteger comillas \"comillas protegidas\""
Proteger comillas "comillas protegidas"
agd-desktop # echo "Proteger comillas "comillas no protegidas""
Proteger comillas comillas no protegidas
+1
+1
-1

make install . es
Noticias, apuntes y pequeños tutoriales sobre GNU/Linux
Imagen de hadso
+1
0
-1

Muchas gracias por tu ayuda!

Ahora mi siguiente paso será, en lugar de usar parámetros en el comando, ingresar valores por medio de inputs, trabajaré en ello.
Dejo el código final:

#!/bin/bash
# XUL Helper 0.1.3 (GPL v3)
# ./xul_helper $NOMBRE_DIRECTORIO $NOMBRE_APLICACION

if [[ -z $1 ]] || [[ -z $2 ]] ; then 
    echo "Sintaxis incorrecta" 
    echo "Recuerde que la sintaxis debe debe ser  $./xul_helper DIRECTORIO NOMBRE_APLICACION"
    exit 0
fi
mkdir $1
		echo Directorio $1 creado
		cd $1
	
		# desde acá es la cración sólo de los archivos
		echo Directorio Chrome creado
		mkdir chrome
		cd chrome
		mkdir content
		echo Direcotrio Content creado
		cd content
		# echo Creando $2.xul
		echo -e "<?xml version=\"1.0\"?>" >> $2.xul && 
		echo -e "<?xml-stylesheet href=\"chrome://global/skin/\" type=\"text/css\"?>" >> $2.xul && 
		echo -e "> $2.xul && 
		echo -e "xmlns=\"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul\">" >> $2.xul && 
		echo -e "" >> $2.xul && 
		echo -e "" >> $2.xul 
		echo Archivo $2.xul creado
	
		cd ..
	
		echo -e "content hello file:content/" >> chrome.manifest
		echo Archivo chrome.manifest creado
		cd ..
		echo Archivo application.ini creado
		echo -e "[App]" >> application.ini &&
		echo -e "Version=1.0" >> application.ini &&
		echo -e "Vendor=$USER" >> application.ini &&
		echo -e "Name=$2" >> application.ini &&
		echo -e "BuildID=number" >> application.ini &&
		echo -e "ID=Creado con XUL Helper" >> application.ini &&
		echo -e "[Gecko]" >> application.ini &&
		echo -e "MinVersion=1.8" >> application.ini 
		
		echo Directorio defaults creado
		mkdir defaults
		cd defaults
		mkdir preferences
		echo Directorio preferences creado
		cd preferences
		
		echo -e "pref(\"toolkit.defaultChromeURI\", \"chrome://$1/content/hello.xul\");" >> pref.js
		echo Archivo pref.js creado
		
		echo PROCESO FINALIZADO
		echo XUL Helper 0.1.3
	

#fin de creación de archivos

#/chrome
#   /content
#       hello.xul
#    chrome.manifest
#/defaults
#   /preferences
#       pref.js
#application.ini

Muchas gracias!

+1
0
-1
Imagen de hadso
+1
0
-1

Por cierto, he visto más de una vez, que muchos scripts que comienzan siendo un comando para la terminal, finalmente adoptan GUIs.
Cómo se logra tal cosa?
Muchas gracias!

+1
0
-1
Imagen de AgD
+1
+1
-1

Haciendo uso de GTK (GNOME), QT (KDE) o cualquier otra biblioteca para generar entornos gráficos. Si quieres algo muy simple, pero que puedas invocar fácilmente desde consola, puedes usar zenity:

agd@agd-desktop $ zenity --title="XUL Automator" --entry --text="Nombre directorio" --entry-text="Archivo" 
+1
+1
-1

make install . es
Noticias, apuntes y pequeños tutoriales sobre GNU/Linux