Con el siguiente script de shell, ¿por qué recibo errores?
syntax error near unexpected token `else'
Shell Script
echo "please enter username"
read user_name
echo "please enter password"
read -s pass
echo ${ORACLE_SID}
SID=${ORACLE_SID}
if ["${ORACLE_SID}" != 'Test'] then
sqlplus -s -l $USER_NAME/$PASS@$SID <<EOF
copy from scott/tiger@orcl insert EMP using select * from EMP
exit
EOF
else
echo "Cannot copy"
fi

Respuestas:
Tienes que terminar la condición de
ifesta manera:o así:
Nota: también debes poner espacios después
[y antes].La razón del
;salto de línea o es que la parte de condición de laifdeclaración es solo un comando. Cualquier comando de cualquier longitud para ser precisos. El shell ejecuta ese comando, examina el estado de salida del comando y luego decide si ejecutar lathenparte o laelseparte.Debido a que el comando puede tener cualquier longitud, debe haber un marcador para marcar el final de la parte de la condición. Esa es la
;o la nueva línea, seguida dethen.La razón de los espacios después
[es porque[es un comando. Por lo general, una construcción de la cáscara. El shell ejecuta el comando[con el resto como parámetros, incluido el]último parámetro obligatorio. Si no coloca un espacio después,[el shell intentará ejecutarse[whatevercomo comando y fallará.La razón del espacio antes del
]es similar. Porque de lo contrario no se reconocerá como un parámetro propio.fuente
test.sh: line 6: [: missingifes sintaxis, no es un comando ordinario. Es una palabra reservada. A diferencia de muchos otros lenguajes de programación, el shell no reconoce palabras reservadas en todas partes, solo cuando son la primera palabra de un comando (con algunas sutilezas).ifes la sintaxis. Estaba tratando de comunicar que la parte de la condiciónifno está limitada a una determinada forma por la sintaxis. He editado el texto. Espero que sea más claro ahora.Puede verificar fácilmente sus scripts de shell utilizando ShellCheck en línea (también disponible como una herramienta independiente).
En este caso, señalará que la instrucción if necesita espacios, después
[y antes], y que necesita un;(o una nueva línea) antes delthenen la misma línea.Cuando haya solucionado eso, continuará diciéndole que
USER_NAMEse utiliza sin inicializarse a nada. Esto se debe a que también tiene unauser_namevariable (los casos son importantes). Lo mismo es cierto paraPASSypass.También le indica que use
read -rpara evitar lareadmanipulación\(podría ser importante para las contraseñas, por ejemplo), y que debe citar las variables al llamarsqlpluspara evitar que el intérprete accidentalmente se bloquee el nombre del archivo y se divida la palabra (de nuevo, esto es importante si la contraseña, por ejemplo, contiene caracteres globales de archivos como*espacios).La sangría del código también lo hará más legible:
Aquí también he hecho posible el uso de contraseñas con caracteres de espacio iniciales o finales al configurar temporalmente
IFSuna cadena vacía para la lectura de la contraseñaread.La lógica también se cambió para rescatar si
$ORACLE_SID/$sidesTest. Esto evita tener la parte operativa principal del script en unaiframa.fuente
if ([ x = x ]) then (echo yes) fitambién funciona.ifdeclaraciones con[ ... ]... :-)Cuando escribas
shte gustaríaCuando se escribe
bashCuidado con los espacios por favor. Debe haber un espacio entre
[[y el primer operador.fuente