我正在尝试运行这个 bash 脚本。
#!/bin/sh
MAX=5
j=1
while [ $((1+$j)) -le $MAX ] do
input=$j
if [ $input -le $j ] then
echo "input=$j,$j,$((j+1)),$((j+2)),$((j+3)),$((j+4))"
else
echo "$input"
fi j=$((j+1))
done
我正在编写一个 bash 脚本并尝试检查 shell 值的参数中提供的顺序列表。输出内容为:
input=1,1,2,3,4,5
input=2,2,3,4,5,6
input=3,3,4,5,6,7
input=4,4,5,6,7,8
正如我所期望的,它应该在每一行按递增顺序给出列表,但我正在寻找的结果是:
input=1,2,3,4,5
input=2,1,3,4,5
input=3,1,2,4,5
input=4,1,2,3,5
input=5,1,2,3,4
请帮助我,谢谢。
最佳答案
在您的脚本中,当您迭代变量 j
时,只有 while 循环会跟踪范围 {1 .. MAX}。因此,如果您在循环中处于 j=5
位置,则在 $j,$((j+1)),$((j+2)),$((j+3)),$((j+4))
上运行 echo
分别会产生 5,6,7,8,9
,这不是您想要的结果。
解决方案的一种方法是,给定数字 i
,创建一个范围 {1 .. MAX},并删除 i
。例如,给定 i=2
,创建列表 1,3,4,...,MAX
。然后可以将其连接到最终输出格式,如 echo "input=$i,$list"
。
以下range
例程创建这样一个列表:
# range() outputs a range of numbers 1 to MAX, but with
# the number 'num' removed from the range.
# Usage: range num MAX
# Example: [ input: range 2 5 ] [ output: 1,3,4,5 ]
range() {
num="$1"
MAX="$2"
for i in $(eval echo {1..$MAX}); do
if [ "$num" -eq "$MAX" ]; then
if [ "$i" -eq $((MAX-1)) ]; then
printf "$i"
break
else
printf "$i,"
fi
elif [ "$i" -eq "$MAX" ]; then
printf "$i"
elif [ "$i" -eq "$num" ]; then
continue
else
printf "$i,"
fi
done
printf "\n"
}
然后你的 while 循环就变成了,
j=1
MAX=5
while [ "$j" -le "$MAX" ]; do
list=$(range "$j" "$MAX")
echo "input=$j,$list"
j=$((j+1))
done
其中 list
变量被分配使用 range "$j""$MAX"
创建的范围的值,然后 list
连接到最终输出。
测试:假设上述脚本名为permute
,
# when j=1 and MAX=5
$ ./permute
input=1,2,3,4,5
input=2,1,3,4,5
input=3,1,2,4,5
input=4,1,2,3,5
input=5,1,2,3,4
# when j=1 and MAX=10
$ ./permute
input=1,2,3,4,5,6,7,8,9,10
input=2,1,3,4,5,6,7,8,9,10
input=3,1,2,4,5,6,7,8,9,10
input=4,1,2,3,5,6,7,8,9,10
input=5,1,2,3,4,6,7,8,9,10
input=6,1,2,3,4,5,7,8,9,10
input=7,1,2,3,4,5,6,8,9,10
input=8,1,2,3,4,5,6,7,9,10
input=9,1,2,3,4,5,6,7,8,10
input=10,1,2,3,4,5,6,7,8,9
关于linux - Bash while if 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35993628/