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