Вы выбрали самый сложный из возможных способ написания скрипта: писать его сверху вниз и затем одновременно устранять все синтаксические ошибки.
Вам будет намного легче, если вы напишете его по одной строке или меньше за раз, а затем сохраните, запустите и убедитесь, что он работает должным образом, прежде чем добавлять следующую.
Если бы вы это сделали, вы, возможно, попали сюда и обнаружили, что это дает ошибку вместо проверки, пуста ли строка:
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!