BASH:从数组中设置变量的最佳方法

时间:2011-06-02 02:24:37

标签: arrays bash validation

Linux上的Bash 4~ 我有一系列可能的值。我必须将用户输入限制为这些值。

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

似乎工作正常,是否有更好的方法来测试用户输入对一组允许的值?

更新:我喜欢John K的回答......有人可以澄清$ @的使用吗?我知道这代表了所有的位置参数 - 所以我们将第一个参数从堆栈中移开,$ @现在表示所有剩余的参数,那些是传递的数组......这是正确的吗?我讨厌盲目地使用代码而不理解......即使它有效!

3 个答案:

答案 0 :(得分:1)

function func_exists () {
  case "$1"
  in
    hello)
    kitty)
    goodbye) 
    quick)
    fox)
      return 1;;
    *)
      return 0;;
  esac
}

答案 1 :(得分:1)

你的解决方案就是我要做的。也许使用更多的shell-isms,例如返回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')

答案 2 :(得分:1)

另一种解决方案。 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"