如何检查给定参数是否在给定数组中?

AGa*_*yer 1 shell

我有一个这样的shell脚本script.sh

names=( jack john jerry)

我希望用户输入这三个名称中的任何一个作为它的第一个参数,就像:

./script.sh jack

如果用户输入错误,例如

./script.sh kate

它将触发 aexit并要求用户仅输入这 3 个中的一个。

我该怎么办?

Pet*_*r.O 6

names=(jack john jerry); 
if [[ " "${names[@]}" " == *" "$1" "* ]] ;then 
    echo "$1: ok"
else 
    echo "$1: not recognized. Valid names are:"
    echo "${names[@]/%/,}"
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于不包含空格的名称。
下面的修改版本可以处理名称中的空格。

names=("flash jack" john jerry); 
d=$'\1'   # validation delimiter - value is \x01
valid="${names[@]/%/$d}"
valid="$d${valid//$d /$d}"
if [[ $valid == *$d$1$d* ]] ;then 
    echo "$1: ok"
else 
    echo "$1: not recognized. Valid names are:"
    echo "${names[@]/%/,}"
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

空白感知版本的输出:

flash jack: ok
Run Code Online (Sandbox Code Playgroud)

或者

kate: not recognized. Valid names are:
flash jack, john, jerry,
Run Code Online (Sandbox Code Playgroud)