script bash que verifica la entrada para ver si es "y", "n" u otro; no funciona

script bash que verifica la entrada para ver si es "y", "n" u otro; no funciona

He escrito este script bash que está destinado a verificar su entrada para ver si es y, no 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 $responseen if [$response = "y"]thenla línea 6; . De manera similar, para [y $responseen la línea 9`

También debe colocar comillas dobles $responsepara evitar errores en caso de que el usuario ingrese una entrada con espacio.

Respuesta3

Además, el setcomando es más exótico de lo que piensas. No utiliza el setcomando para establecer variables.

Usted sabe que, cuando invoca un script de shell con parámetros, se asignan a  ,,, $1… ; ¿bien? Bien, $2$3unode las cosas setque 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 $checkpointno 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 $checkpointya 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.

información relacionada