shell 中判断值是否已经在数组中

本文介绍三种使用Shell脚本检查变量是否存在于数组中的方法。第一种方法利用`echo`与`grep`结合实现;第二种采用`for`循环遍历数组进行比对;第三种则通过自定义函数`test_array`来完成,涉及`eval`、`sed`和`while read`等命令。
1.
echo "${array[@]}" | grep -wq "$var" &&  echo "Yes" || echo "No"

2.
for i in ${array[@]}
do
   [ "$i" == "$var" ] && echo "yes"
done

3.
  1. test_array ()
  2. {
  3. y_n=$1

  4. arr=$2

  5. echo $(eval echo \${$arr[@]}) |\
  6. sed 's/ /\n/g' |\
  7. while read line 
  8. do
  9.         
  10.         if [ "$y_n" == "$line" ]
  11.                 then
  12.                 return 1
  13.                 break
  14.         else
  15.                 continue
  16.         fi
  17.         ((i++))
  18. done
  19. }

  20. test_array $var array


<think>我们有一个数组,需要判断某个是否存在于该数组中。在Shell脚本中,我们可以通过遍历数组元素并逐一比较来实现。此外,我们也可以使用一些更简洁的方法,比如使用通配符结合字符串比较(但要注意元素中可能包含特殊字符的情况)。 根据用户的需求,我们参考了站内引用,但并没有直接相关的引用内容。不过,我们可以结合之前讨论过的数组操作知识来解答。 以下提供两种常见方法: 方法1:遍历数组元素 使用for循环遍历数组,逐个比较每个元素是否等于目标。 方法2:将数组转换为字符串(使用空格分隔),然后判断目标字符串是否是子串(注意:这种方法在元素包含空格或特殊字符时可能不可靠,但若元素是简单的单词,则可以使用)。 然而,更可靠的方法是遍历数组。 示例脚本: ```bash #!/bin/bash # 定义一个数组 declare -a array=("apple" "banana" "orange" "grape") # 要检查的 value="banana" # 设置一个标志 found=0 # 遍历数组 for element in "${array[@]}"; do if [[ "$element" == "$value" ]]; then found=1 break fi done # 根据标志输出结果 if [[ $found -eq 1 ]]; then echo "$value exists in the array." else echo "$value does not exist in the array." fi ``` 另一种更简洁的方式(使用关联数组模拟集合,但需要Bash 4.0+): 不过,如果只是检查存在性,且数组不大,遍历即可。 注意:如果数组元素包含空格或特殊字符,上述遍历方法仍然有效,因为我们使用了双引号`"${array[@]}"`,它会正确分割每个元素。 如果希望使用函数封装,可以这样: ```bash # 函数:检查元素是否数组中 # 参数1: 数组名(注意:需要传递数组名,而不是数组) # 参数2: 要查找的 # 返回: 0表示存在,1表示不存在 in_array() { local array="$1[@]" local seeking=$2 local in=1 for element in "${!array}"; do if [[ $element == "$seeking" ]]; then in=0 break fi done return $in } # 使用示例 declare -a fruits=("apple" "banana" "orange") if in_array fruits "banana"; then echo "存在" else echo "不存在" fi ``` 但是,上述函数在传递数组名时使用了间接引用,注意`${!array}`的写法。 然而,在Bash中,将数组作为参数传递给函数并不直接支持,所以使用间接引用是一种方法。 另一种更安全的方式(避免使用间接引用,且支持带空格的元素)的写法: ```bash in_array() { local seeking=$1 # 要查找的 shift # 将第一个参数移出,剩下的就是数组元素 for element; do [[ $element == "$seeking" ]] && return 0 done return 1 } # 使用示例 declare -a fruits=("apple" "banana" "orange") in_array "banana" "${fruits[@]}" && echo "存在" || echo "不存在" ``` 这个函数将数组元素作为多个参数传递,然后遍历这些参数。这样更清晰,且避免了间接引用。 因此,推荐使用第二种函数方式。 总结: 判断是否数组中,可以通过遍历数组元素并比较来实现。在函数封装时,建议将数组元素展开为多个参数传递给函数。 注意:在比较字符串时,我们使用了`[[ ... ]]`,它比`[ ... ]`更强大且更安全,特别是在处理空字符串和带空格字符串时。 根据用户的问题,我们提供了多种实现方式,用户可以根据自己的Bash版本和需求选择。 相关问题: 1. 如何在Shell脚本中遍历数组? 2. 如何将数组作为参数传递给函数? 3. 除了遍历,还有哪些方法可以检查数组包含关系? 4. 在Shell中如何安全地处理带空格的数组元素?</think>在 Shell 脚本中判断某个是否存在于数组中,可以通过遍历数组元素并逐一比较实现。以下是几种可靠的方法: ### 方法1:直接遍历比较(推荐) ```bash #!/bin/bash # 定义数组 declare -a fruits=("apple" "banana" "orange" "grape") # 要检查的 search_value="banana" # 遍历检查 found=false for fruit in "${fruits[@]}"; do if [[ "$fruit" == "$search_value" ]]; then found=true break fi done # 输出结果 if $found; then echo "$search_value exists in the array" else echo "$search_value does NOT exist in the array" fi ``` ### 方法2:使用函数封装 ```bash #!/bin/bash # 检查函数 in_array() { local search="$1" shift # 移出第一个参数(查找) for element; do [[ "$element" == "$search" ]] && return 0 done return 1 } # 定义数组 declare -a colors=("red" "green" "blue") # 检查是否存在 if in_array "green" "${colors[@]}"; then echo "green exists in array" else echo "green not found" fi ``` ### 方法3:使用关联数组(Bash 4.0+) ```bash #!/bin/bash # 定义普通数组 declare -a numbers=(10 20 30 40) # 转换为关联数组 declare -A map for num in "${numbers[@]}"; do map["$num"]=1 done # 检查 check_value=30 if [[ ${map[$check_value]} ]]; then echo "$check_value exists" else echo "$check_value not found" fi ``` ### 关键说明: 1. **元素比较**:使用 `[[ "$element" == "$value" ]]` 进行字符串精确匹配 2. **带空格元素**:用双引号包裹数组扩展 `"${array[@]}"` 可正确处理含空格元素 3. **函数参数**:`shift` 命令配合 `for element; do` 可遍历所有参数 4. **性能考虑**: - 小数组:直接遍历即可 - 大数组(1000+元素):考虑使用关联数组优化查询效率 ### 示例输出 ``` banana exists in the array green exists in array 30 exists ``` > 注意:这些方法都严格区分大小写。如需不区分大小写,可将比较改为 `[[ "${fruit,,}" == "${search_value,,}" ]]`(Bash 4.0+)[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值