Arrays 使用Bash将带空格的输入字符串与数组进行比较
我想找到一种最快的方法来比较排序数组中的用户输入。假设我有一个这样的数组Arrays 使用Bash将带空格的输入字符串与数组进行比较,arrays,bash,Arrays,Bash,我想找到一种最快的方法来比较排序数组中的用户输入。假设我有一个这样的数组 $ {arr[@]} = {Adam, Bob, Carl, Daniel} 和来自终端的用户输入 $ Emma Carl Bob Frank 我想要一个比较函数,它可以像 $ [ Carl, Bob ] already registerd 这是我当前的脚本,它只使用1个输入,没有空间 containsElement () { local e for e in "${@:2}"; do [[ "$e" ==
$ {arr[@]} = {Adam, Bob, Carl, Daniel}
和来自终端的用户输入
$ Emma Carl Bob Frank
我想要一个比较函数,它可以像
$ [ Carl, Bob ] already registerd
这是我当前的脚本,它只使用1个输入,没有空间
containsElement () {
local e
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 1; done
return 0
}
while true; do
echo "Enter usernames, seperated by a space: "
read USERNAMES
containsElement "$USERNAMES" "${arr[@]}"
var=$?
if [ "$var" == '1' ]; then
echo "User already exists!"
break
fi
done
我不知道这是否是“最快的”,但有一种方法可以避免循环中的循环:
arr=(Adam Bob Carl Daniel)
read -p "Enter usernames, separated by a space: " -a usernames
already=()
for name in "${usernames[@]}"
do
[[ " ${arr[*]} " == *" $name "* ]] && already+=($name)
done
[ "${already[*]}" ] && echo "[ ${already[*]} ] already registered"
例如:
$ bash script.sh
Enter usernames, separated by a space: Emma Carl Bob Frank
[ Carl Bob ] already registered
连续循环版本
根据您在评论中的请求,此循环将持续进行。我还让它用新名称更新了arr
:
arr=(Adam Bob Carl Daniel)
while true
do
read -p "Enter usernames, seperated by a space: " -a usernames
already=()
for name in "${usernames[@]}"
do
if [[ " ${arr[*]} " == *" $name "* ]]
then
already+=($name)
else
arr+=($name)
fi
done
[ "${already[*]}" ] && echo "[ ${already[*]} ] already registered"
done
谢谢,它可以工作,但我想使用while循环来提示输入其他名称(如果有)exists@Casper是的,你可以在它周围绕一圈。我刚刚在答案中添加了一个带有
while true
循环的版本。我在您的代码打印最后一条语句以中断循环之前添加了此代码。如果没有现有名称,它会工作吗<代码>如果[-z“${ready[*]}”];然后几乎中断:它需要和fi
。试试这个:if[-z“${ready[*]}]”;然后打破;fi
这个脚本工作得很好,现在这个脚本是否不管大小写都可以比较字符串,即Adam==Adam