Как найти, если значение не присутствует в массиве, а затем записать пропущенное значение в переменную? - PullRequest
0 голосов
/ 23 января 2019

У меня есть несколько известных значений: 10 20 30 40 50 60 70. У меня есть массив, содержащий некоторый вывод, сгенерированный командой. Я хочу выяснить, отсутствуют ли какие-либо из известных значений в массиве, если это так, записать первое пропущенное значение в переменную.

Например, первое значение, отсутствующее в массиве, это 20, поэтому я хочу установить variable=20.

Я пробовал разные способы сделать это, но мои ограниченные знания bash здесь не помогают. Цикл по нескольким массивам, цикл по операторам. У меня нет рабочего кода.

array=( 1 2 10 30 40 )

if [ "$i" -ne "10" ] ; then
    variable="10"
    break
elif [ "$i" -ne "20" ] ; then
    variable="20"
    break
elif [ "$i" -ne "30" ] ; then
    variable="30"
    break
elif [ "$i" -ne "40" ] ; then
    variable="40"
    break
elif [ "$i" -ne "50" ] ; then
    variable="50"
    break
elif [ "$i" -ne "60" ] ; then
    variable="60"
    break
elif [ "$i" -ne "70" ] ; then
    variable="70"
    break
else
    echo "no values available"
    exit 1
fi

Ответы [ 2 ]

0 голосов
/ 24 января 2019

С Bash≥4.0 вы можете использовать ассоциативные массивы и иметь довольно чистый код следующим образом:

# declare the values you want:
wanted=( {10..70..10} )  # shortcut for wanted=( 10 20 30 40 50 60 70 )
# values you have:
array=( 1 2 10 30 40 )

# Make an associative array from the values you have, so that lookup
# is faster and cleaner (and correct!):
declare -A array_ass=()
for k in "${array[@]}"; do
    array_ass[$k]=1  # 1 is a dummy (non-empty) value. Put anything you like
done

# Now check that the values from wanted are in array_ass:
missing=
for k in "${wanted[@]}"; do
    [[ ${array_ass[$k]} ]] && continue
    # If we're here, the key k isn't in array!
    missing=$k
    break
done

if [[ $missing ]]; then
    echo "The value $missing is missing in array!"
else
    echo "All good!"
fi

Не говоря уже: все это будет работать с переменными любого типа, даже с теми, которые содержат пробелы,переводы строки, символы глобуса и т. д. (кроме пустой строки).

0 голосов
/ 24 января 2019
#!/bin/bash
l="10 20 30 40 50 60 70"             # list of numbers
a=( 1 2 10 30 40 )                   # given array

b=" ${a[*]} "                        # convert array to list, anchor = space

v=''                                 # empty variable
for i in $l; do
  if [[ "$b" != *" $i "* ]]; then    # $i is NOT found in $b
    v=$i
    break
  fi
done

echo v=$v                            # print the result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...