bash, который проверяет ввод, чтобы увидеть, является ли оно & ldquo; y & rdquo ;, & ldquo; n & rdquo; или другой - не работает

Я написал этот сценарий 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'.

. Что не так с моим кодом? (Я очень новичок в сценариях оболочки.)

1
задан 15 March 2015 в 19:22

3 ответа

есть одна простая ошибка в строках 6 и 9. В строке if [$response = "y"]then в строке 6 должно быть пробел между [ и $response; , Аналогично, для [ и $response в строке 9`

Также вы должны поместить двойные qout вокруг $response, чтобы избежать ошибок в случае, если пользователь вводит вход с пробелом.

4
ответ дан 23 May 2018 в 22:23

Кроме того, команда 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).

2
ответ дан 23 May 2018 в 22:23

Bash интерпретирует ваши $response как команды, которые он не может найти. Закрепите их в двойных кавычках, как строки, с которыми вы сравниваете их, и они должны работать, как ожидалось.

1
ответ дан 23 May 2018 в 22:23

Другие вопросы по тегам:

Похожие вопросы: