Bash - как проверить, находится ли значение переменной в массиве - PullRequest
0 голосов
/ 02 октября 2019

У меня есть массив, который имеет 6 значений, а затем у меня есть еще три массива где угодно между 4 и 1 значением. я хочу пройтись по массиву 1 и проверить, появляется ли значение из массива 1 в массиве 2, массиве 3 и массиве 4. В настоящее время у меня есть следующее, но оно только проверяет мое значение из массива 1 относительно первого значения в массивах 2,3 и4. Я опустил массивы 3 и 4, но они будут иметь такой же цикл for, что и array2, и будут внутри цикла для array1.

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

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Это возможно за один цикл:

#!/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
)
0 голосов
/ 02 октября 2019

Я думаю, что лучше всего сделать функцию

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[@]}" (с двойными кавычками и [@]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...