【问题标题】:Bash -how to check if variable value is in an arrayBash - 如何检查变量值是否在数组中
【发布时间】:2019-10-02 08:45:39
【问题描述】:

我有一个包含 6 个值的数组,然后我有另外三个数组,其值介于 4 和 1 之间。我想遍历数组 1 并检查数组 1 中的值是否出现在数组 2、数组 3 和数组 4 中。目前我有以下内容,但它似乎只检查数组 1 中的值与数组 2,3 中的第一个值和4. 我省略了数组 3 和 4,但它们的 for 循环与数组 2 相同,并且在数组 1 的循环内。

array1=("value1" "value2" "value3" "value4" "value5" "value6")

for i in "${array1}"; do

array2= ("value1" "value3" "value4" "value5")

for f in "${array2}; do
if [[ ${i} == ${f} ]]; then

echo "${i} in array1 matches ${f} in array2"
else
echo "${i} in array1 does not match any value in array2"
fi
done
done

【问题讨论】:

  • ${array1}${array1[0]} 一样,你应该改用${array1[@]}
  • 我猜这可能是一个错字,但你分配给array2 的应该是array2=("value1" "value3" "value4" "value5")= 周围没有空格)

标签: arrays bash


【解决方案1】:

我认为最好的办法是做一个函数

in_array () {
  search=$1
  shift        # remove first argument from list of args $@
  for val; do  # equivalent to `for val in "$@"`
    if [[ $search = $val ]]; then
      return   # returns exit code of the successful [[ test ]], 0
    fi
  done
  return 1
}

如果找到该值,则返回0,否则返回1,允许您像这样使用它:

array1=("value1" "value2" "value3" "value4" "value5" "value6")
array2=("value1" "value3" "value4" "value5")

for i in "${array1[@]}"; do
  if in_array "$i" "${array2[@]}"; then
    echo "$i in array1 is in array2"
  fi
done

请注意,要遍历数组的所有值,正确的扩展是"${array[@]}"(带有双引号和[@])。

【讨论】:

    【解决方案2】:

    这在一个循环中是可能的:

    #!/usr/bin/env bash
    
    array1=("value1" "value2" "value3" "value4" "value5" "value6")
    array2=("value1" "value3" "value4" "value5")
    
    while read -r -d '' -n 8 count && IFS= read -r value; do
      if [ "$count" -gt 1 ]; then
        # value is seen more than once, so it is in both arrays
        echo "${value} in array1 matches ${value} in array2"
      else
        # value is only seen once
        if printf $'%s\n' "${array1[@]}" | grep --quiet "$value"; then
          # value is from array1
          echo "${value} in array1 does not match any value in array2"
        fi
      fi
    done< <(
      # Combine both arrays
      # Sort and count number of times each value appears
      # then feed the while loop
      printf $'%s\n' "${array1[@]}" "${array2[@]}" | sort | uniq --count
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2013-10-22
      • 2011-04-05
      • 2016-03-28
      • 1970-01-01
      相关资源
      最近更新 更多