从 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
}
假设我有一个包含一些数字的数组,从最低到最高的数字排序:
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
}