Я написал этот сценарий bash, который предназначен для проверки вашего ввода, чтобы увидеть, есть ли это 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'.
. Что не так с моим кодом? (Я очень новичок в сценариях оболочки.)
есть одна простая ошибка в строках 6 и 9. В строке if [$response = "y"]then в строке 6 должно быть пробел между [ и $response; , Аналогично, для [ и $response в строке 9`
Также вы должны поместить двойные qout вокруг $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).
Bash интерпретирует ваши $response как команды, которые он не может найти. Закрепите их в двойных кавычках, как строки, с которыми вы сравниваете их, и они должны работать, как ожидалось.