Я записал этот сценарий удара, который предназначен для проверки входа, чтобы видеть, ли это y
, n
или что-то еще (это будет частью большего проекта):
#!/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
Но каждый раз, когда я выполняю его, я получаю ошибку, подобную этому независимо от того, что я вставил:
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'.
Так что не так с моим кодом? (Я являюсь очень новым для окружения сценариев.)
Это ясно даст понять Вас (Проверьте Пробелы):
$ 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
Так, необходимо поместить пробел до и после условия при использовании test
команда ([ ]
).
существует одна простая ошибка на строке 6 и 9. Должно быть пространство между [
и $response
в if [$response = "y"]then
на строке 6;. точно так же для [
и $response
на строке 9'
Также необходимо поместить двойные кавычки [приблизительно 115] для предотвращения ошибок в случае, если пользователь вводит вход с пространством.
Bash интерпретирует Ваш $response
как команды, которые он не может найти. Включите их в двойные кавычки как строки, с которыми Вы сравниваете их, и это должно работать как ожидалось.
Кроме того, set
команда более экзотична, чем Вы думаете. Вы не используете set
управляйте для установки переменных.
Вы знаете, что при вызове сценария оболочки с параметрами что им присваивают $1
, $2
, $3
, …;правильно? ну, одна из вещей set
команда делает должен установить $1
, $2
, $3
, … для текущей (интерактивной) оболочки. Так, например,
% 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'
который не является тем, что Вы хотите.
И у Вас есть другая проблема. Правильный синтаксис
checkpoint="t"
Если Вы говорите
$checkpoint="t"
и $checkpoint
не установлен, эта команда уменьшает до
="t"
который ищет названную программу =t
(который, вероятно, не существует). Точно так же
$checkpoint = "t"
уменьшает до
= "t"
который ищет названную программу =
. Еще хуже, если $checkpoint
уже установлен на "t"
, и Вы говорите
$checkpoint="f"
затем это интерпретируется как
t="f"
таким образом установка переменной t
(т.е. $t
).