我试着运行这个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请帮帮我,谢谢。
发布于 2016-03-14 19:11:09
在您的脚本中,当您在变量j上迭代时,只有while循环会跟踪范围{1 ..麦克斯)因此,如果您在循环中的j=5,那么分别在$j,$((j+1)),$((j+2)),$((j+3)),$((j+4))结果5,6,7,8,9上运行echo,这不是您想要的。
一个解决方案的方法是,给定一个数字i,创建一个{1 .删除i的MAX}。例如,给定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"
}然后你的Then循环变成,
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,9https://stackoverflow.com/questions/35993628
复制相似问题