Eu escrevi este script bash que visa verificar sua entrada para ver se é y
ou n
algo 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 $response
na if [$response = "y"]then
linha 6; . Da mesma forma, para [
e $response
na linha 9`
Além disso, você deve colocar caracteres duplos $response
para evitar erros caso o usuário insira uma entrada com espaço.
Responder3
Além disso, o set
comando é mais exótico do que você pensa. Você não usa o set
comando 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 set
comando 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 $checkpoint
nã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 $checkpoint
já 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.