从 bash 中的数组生成尽可能小的数字

Generate lowest possible number from array in bash

假设我有一个包含一些数字的数组,从最低到最高的数字排序:

root@blubb:~# min=1
root@blubb:~# echo $array 
1 2 3 6 16 26 27

我想要一个 bash 脚本总是尝试首先定义的最小数量(在本例中为 min=1),如果不可能,则添加 1 并再次尝试,直到它最终起作用(在本例中情况下需要 4)

我尝试了很多 shuf 和 while-/for 循环,但无法正确地达到 运行。

试试这个。

array=(7 5 3 1)

min()
{
  local min=; shift
  local n
  for n in "$@"; do
    if ((n<min)); then
      min=$n
    fi
  done
  echo "$min"
}

min "${array[@]}"
min=1
array="1 2 3 6 16 26 27"

found=0
res=$min
for elem in $array; do
    if [[ $elem = $res ]]; then 
        found=1
        continue
    fi
    if [[ $found = 1 ]]; then
       ((res+=1))
       if ((elem>res)); then
           break
       fi
    fi
done

echo $res

或者用一个函数

function min_array {
    local min array res found
    min=
    shift
    array=$*

    found=0
    res=$min
    for elem in $array; do
        if [[ $elem = $res ]]; then
            found=1
            continue
        fi
        if [[ $found = 1 ]]; then
            ((res+=1))
            if ((elem>res)); then
                break
            fi
        fi
    done
    echo $res
}

$ min_array 1 1 2 3 6 16 26
4

$ min_array 6 1 2 3 6 16 26
7

$ min_array 8 1 2 3 6 16 26
8

EDIT 缺少一个案例,另一个版本

function min_array {
    local min array res found
    min=
    shift
    array=$*

    found=0
    res=$min
    for elem in $array; do
        if [[ $elem = $res ]]; then
            found=1
            ((res+=1))
            continue
        fi
        if [[ $found = 1 ]]; then
            if ((elem>res)); then
                break
            else
                ((res+=1))
            fi
        fi
    done
    echo $res
}