2

Я пытаюсь увидеть, существует ли первый аргумент в массиве:

#!/bin/bash

action="$1"
actions=( install run )
actionOK=false

for i in "${actions[@]}"
do
    if [ $i=$action ]; then
        actionOK=true
    fi
done

echo $actionOK

if [ $actionOK = false ]; then
    echo "unknown action: $action"
fi

теперь при попытке wan27 run сценарий отображает true, но он также отображает true для действия, не входящего в массив, например test, foo, bar или чего-либо еще

2 ответа2

3

Я думаю, что ваш скрипт работал для "установки", но не для "запуска".

Вам нужно сделать:

for i in "${actions[@]}"
do
  ...
done

Это связано с тем, что $actions расширяется только до первого элемента массива.

$ array=( a b c )
$ echo $array
a
$ echo "${array[@]}"
a b c

См. Документацию по bash-массивам для более подробной информации о том, как работают массивы.

На любой элемент массива можно ссылаться, используя $ {name [subscript]}. Скобки необходимы, чтобы избежать конфликтов с операторами расширения имени оболочки. Если нижний индекс равен «@» или «*», слово распространяется на все элементы имени массива.

0

Я попробовал исправленный сценарий Франсуа Веспа, и он у меня работает нормально, он выдает «неизвестное действие: ...», если я пропускаю что-то еще, кроме запуска или установки.

Единственная ошибка, которую я вижу, это когда я не передаю аргументы. Вы должны проверить [$ # -gt 0] или [$ # -eq 1], чтобы выяснить, были ли переданы аргументы вообще.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .