Bash Если оператор не запускается - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь написать простую вложенную if функцию в bash; будучи новичком ie я не совсем уверен, где я ошибаюсь в своем синтаксисе.

  1. Сценарий разработан, чтобы принимать либо 2 аргумента, либо вообще ни одного.
  2. Это Предполагается, что для запуска функции с именем hero, если в сценарий не переданы аргументы, отсюда следует внешний оператор if.
  3. , однако, если аргумент передается в этом случае, строка word, он должен проверить находится ли второй аргумент в уже существующем в ассоциативном массиве с именем options и запустите функцию silent_hero
if [![ -n $1 ]]
then
        hero

else [[ $1 == 'word']]
then
        if [![ -n $2 ] && [ ${!options[*]} =~ (^|[[:space:]])$2($|[[:space]])]
        then
                silent_hero

        else
                echo 'error!
                exit 129
        fi
fi

1 Ответ

0 голосов
/ 06 мая 2020

Вы выбрали самый сложный из возможных способ написания скрипта: писать его сверху вниз и затем одновременно устранять все синтаксические ошибки.

Вам будет намного легче, если вы напишете его по одной строке или меньше за раз, а затем сохраните, запустите и убедитесь, что он работает должным образом, прежде чем добавлять следующую.

Если бы вы это сделали, вы, возможно, попали сюда и обнаружили, что это дает ошибку вместо проверки, пуста ли строка:

if [![ -n $1 ]]
then
        echo "True"
fi

Теперь вместо «Как мне проверить, является ли первый параметр пусто, а затем, если оно соответствует другому слову, проверьте, пуст ли второй параметр и ключ в массиве «вы можете задать / изучить гораздо более простой вопрос» Как определить, пуста ли переменная в Bash ".

В любом случае, вот исправленная версия скрипта с комментариями:

# Make sure variables are defined
declare -A options=([foo]=1 [bar]=1)

# ! must be inside [[ .. ]]
if [[ ! -n $1 ]]
then
        hero
# Use `elif` for additional conditions
# Need space before ]]
elif [[ $1 == 'word' ]]
then
        # ! must be inside [[ ]], but you probably didn't even want it here
        # don't use [..] as parentheses
        # Missing ending : in [[:space]]
        if [[ -n $2 && ${!options[*]} =~ (^|[[:space:]])$2($|[[:space:]]) ]]
        then
                silent_hero

        else
                # add missing trailing quote
                echo 'error!'
                exit 129
        fi
fi

А вот пример попадания в каждую из веток:

$ bash myscript
myscript: line 7: hero: command not found
$ bash myscript word foo
myscript: line 17: silent_hero: command not found
$ bash myscript word unknown
error!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...