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
if
esta 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 laif
declaració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 lathen
parte o laelse
parte.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[whatever
como 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: [: missing
if
es 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).if
es la sintaxis. Estaba tratando de comunicar que la parte de la condiciónif
no 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 delthen
en la misma línea.Cuando haya solucionado eso, continuará diciéndole que
USER_NAME
se utiliza sin inicializarse a nada. Esto se debe a que también tiene unauser_name
variable (los casos son importantes). Lo mismo es cierto paraPASS
ypass
.También le indica que use
read -r
para evitar laread
manipulación\
(podría ser importante para las contraseñas, por ejemplo), y que debe citar las variables al llamarsqlplus
para 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
IFS
una cadena vacía para la lectura de la contraseñaread
.La lógica también se cambió para rescatar si
$ORACLE_SID
/$sid
esTest
. Esto evita tener la parte operativa principal del script en unaif
rama.fuente
if ([ x = x ]) then (echo yes) fi
también funciona.if
declaraciones con[ ... ]
... :-)Cuando escribas
sh
te gustaríaCuando se escribe
bash
Cuidado con los espacios por favor. Debe haber un espacio entre
[[
y el primer operador.fuente