script bash que verifica a entrada para ver se é "y", "n" ou outro - não funciona

script bash que verifica a entrada para ver se é "y", "n" ou outro - não funciona

Eu escrevi este script bash que visa verificar sua entrada para ver se é you nalgo mais (isso fará parte de um projeto maior):

#!/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

Mas toda vez que eu executo, recebo um erro semelhante a este, não importa o que eu coloquei:

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'.

Então, o que há de errado com meu código? (Sou muito novo em scripts de shell.)

Responder1

Isso deixará você claro (verifique os espaços em branco):

$ 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

Portanto, você precisa colocar espaços em branco antes e depois da condição ao usar o comando test( [ ]).

Responder2

há um erro simples nas linhas 6 e 9. Deve haver espaço entre [e $responsena if [$response = "y"]thenlinha 6; . Da mesma forma, para [e $responsena linha 9`

Além disso, você deve colocar caracteres duplos $responsepara evitar erros caso o usuário insira uma entrada com espaço.

Responder3

Além disso, o setcomando é mais exótico do que você pensa. Você não usa o setcomando para definir variáveis.

Você sabe que, quando invoca um script de shell com parâmetros, eles são atribuídos a  $1, $2, $3,…; certo? Bem, umdas coisas que o setcomando faz é definir  $1, $2, $3,… para oatual shell (interativo). Então, por exemplo,

% 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 não é o que você quer.

E você tem outro problema. A sintaxe correta é

checkpoint="t"

Se você diz

$checkpoint="t"

e $checkpointnão está definido, este comando se reduz a

="t"

que procura um programa chamado =t(que provavelmente não existe). De forma similar,

$checkpoint = "t"

reduz para

= "t"

que procura um programa chamado =. Pior ainda, se $checkpointjá estiver definido como "t", e você disser

$checkpoint="f"

então isso é interpretado como

t="f"

definindo assim a variável t(ou seja, $t).

Responder4

Bash interpreta seus $response comandos como não consegue encontrar. Coloque-os entre aspas duplas, como as strings com as quais você os compara, e isso deve funcionar conforme o esperado.

informação relacionada