He escrito este script bash que está destinado a verificar su entrada para ver si es y
, n
o algo más (esto será parte de un proyecto más grande):
#!/bin/bash
echo "Have you updated the PATH variable in your .bashrc file yet? [y/n]"
read response
if [$response = "y"]; then
echo "Checkpoint passed"
set $checkpoint = "t"
elif [$response = "n"]; then
echo "Please set the PATH variable in your .bashrc file before running this script."
set $checkpoint = "f"
else
echo "Please only use 'y' and 'n'."
set $checkpoint = "f"
fi
Pero cada vez que lo ejecuto me sale un error similar a este sin importar lo que ponga:
Have you updated the PATH variable in your .bashrc file yet? [y/n]
y
./snbjdkhome: line 6: [y: command not found
./snbjdkhome: line 9: [y: command not found
Please only use 'y' and 'n'.
Entonces, ¿qué hay de malo en mi código? (Soy muy nuevo en los scripts de shell).
Respuesta1
Esto lo dejará claro (verifique los espacios en blanco):
$ var=c
$ ["$var" == "c"] && echo "OK"
[c: command not found
$ ["$var" == "c" ] && echo "OK"
[c: command not found
$ [ "$var" == "c"] && echo "OK"
bash: [: missing `]'
$ [ "$var" == "c" ] && echo "OK"
OK
Por lo tanto, debe colocar espacios en blanco antes y después de la condición mientras usa el comando test
( [ ]
).
Respuesta2
hay un error simple en las líneas 6 y 9. Debe haber espacio entre [
y $response
en if [$response = "y"]then
la línea 6; . De manera similar, para [
y $response
en la línea 9`
También debe colocar comillas dobles $response
para evitar errores en caso de que el usuario ingrese una entrada con espacio.
Respuesta3
Además, el set
comando es más exótico de lo que piensas. No utiliza el set
comando para establecer variables.
Usted sabe que, cuando invoca un script de shell con parámetros, se asignan a ,,, $1
… ; ¿bien? Bien,
$2
$3
unode las cosas set
que hace el comando es establecer $1
, $2
, $3
, … para elactual caparazón (interactivo). Así por ejemplo,
% set checkpoint="y"
% echo "$checkpoint"
(nothing)
% echo "arg1 = '$1', arg2 = '$2', arg3 = '$3'"
arg1 = 'checkpoint=y', arg2 = '', arg3 = ''
% set checkpoint = "y"
% echo "$checkpoint"
(nothing)
% echo "arg1 = '$1', arg2 = '$2', arg3 = '$3'"
arg1 = 'checkpoint', arg2 = '=', arg3 = 'y'
que no es lo que quieres.
Y tienes otro problema. La sintaxis correcta es
checkpoint="t"
Si usted dice
$checkpoint="t"
y $checkpoint
no está configurado, este comando se reduce a
="t"
que busca un programa llamado =t
(que probablemente no existe). Similarmente,
$checkpoint = "t"
reduce a
= "t"
que busca un programa llamado =
. Peor aún, si $checkpoint
ya está configurado en "t"
y dices
$checkpoint="f"
entonces eso se interpreta como
t="f"
estableciendo así la variable t
(es decir, $t
).
Respuesta4
Bash interpreta sus $response
comandos como que no puede encontrar. Enciérrelos entre comillas dobles como las cadenas con las que los compara, y debería funcionar como se esperaba.