BASH: лучший способ установить переменную из массива - PullRequest
1 голос
/ 02 июня 2011

Bash 4 в Linux ~
У меня есть массив возможных значений. Я должен ограничить ввод данных этими значениями.

Arr=(hello kitty goodbye quick fox)

Пользователь указывает значение в качестве аргумента скрипта:

bash myscript.sh -b var

В настоящее время я пытаюсь сделать следующее:

function func_exists () {
_var="$1"
for i in ${Arr[@]}
do
    if [ "$i" == "$_var" ]
    then
        echo hooray for "$_var"
        return 1
    fi
done
    return 0
}

func_exists $var
if [ $? -ne 1 ];then
    echo "Not a permitted value."
    func_help
    exit $E_OPTERROR
fi

Кажется, что работает нормально, есть ли лучшие методы для проверки ввода пользователя с массивом допустимых значений?

ОБНОВЛЕНИЕ: мне нравится ответ Джона К. ... может кто-нибудь прояснить использование $ @? Я понимаю, что это представляет все позиционные параметры - поэтому мы удаляем первый параметр из стека, а $ @ теперь представляет все остальные параметры, которые являются переданным массивом ... это правильно? Я ненавижу слепо использовать код, не понимая ... даже если он работает!

Ответы [ 3 ]

1 голос
/ 02 июня 2011

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

# Tests if $1 is in the array ($2 $3 $4 ...).
is_in() {
    value=$1
    shift

    for i in "$@"; do
        [[ $i == $value ]] && return 0
    done

    return 1
}

if ! is_in "$var" "${Arr[@]}"; then
    echo "Not a permitted value." >&2
    func_help
    exit $E_OPTERROR
fi

Тщательное использование двойных кавычек гарантирует, что это будет работать, даже еслиотдельные записи массива содержат пробелы, что разрешено.Это массив из двух элементов: list=('hello world' 'foo bar').

1 голос
/ 02 июня 2011

Другое решение.is_in - это просто переменная:

Arr=(hello kitty goodbye quick fox)

var='quick'

string=" ${Arr[*]} "                            # array to string, framed with blanks
is_in=1                                         # false
# try to delete the variable inside the string; true if length differ 
[ "$string" != "${string/ ${var} /}" ] && is_in=0

echo -e "$is_in"
1 голос
/ 02 июня 2011
function func_exists () {
  case "$1"
  in
    hello)
    kitty)
    goodbye) 
    quick)
    fox)
      return 1;;
    *)
      return 0;;
  esac
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...