我正试图找到一种方法,在步骤100中$ {x} == 4时跳过中间(150到200)之间的步骤。什么是最好的方法。我试图设置step = 250,但它被改回150.
for step in $(seq "$stepnum" 50 650)
do
case $step in
"50")
# do something
;;
"100")
# do something
if [[ ${x} == 4 ]]
then
step=250
fi
## skip to step 250
;;
"150")
# do something
;;
"200")
# do something
;;
"250")
;;
*)
;;
esac
答案 0 :(得分:0)
使用算术for
表达式而不是in
:
for (( step=stepnum ; step+=50 ; step<=650 ))
这就是区别:
in
,循环变量将遍历示例中seq
提供的列表中的每个成员,无论您如何修改计数器。for
,循环变量将按照循环头的第二个语句中的指示递增,因此如果您修改循环体中的计数器,它将按预期工作。键入help for
或man bash
,详细了解for
语法。
答案 1 :(得分:0)
我提供此解决方案,因为OP已表明他们不想修改循环语法。生成的代码结构不合理:
if [[ ${x} == 4 ]] && [ step -gt 100 ] && [ step -lt 250 ]
then
continue
fi
在case
。
答案 2 :(得分:0)
放置在循环开头的continue
是一种可以做你想做的方法:
#!/bin/bash
stepnum=50
x=${1:-0} # x is 0 by default, set with 1st argument on command line
for step in $(seq "$stepnum" 50 650)
do
[ $step -ge 150 -a $step -le 200 -a $x -eq 4 ] && continue
case $step in
"50")
# do something
printf " 50 hit\n"
;;
"100")
# do something
printf " 100 hit\n"
;;
"150")
# do something
printf " 150 hit\n"
;;
"200")
# do something
printf " 200 hit\n"
;;
"250")
# do something
printf " 250 hit\n"
;;
*)
# do something
printf " %3d - default hit\n" $step
;;
esac
done
exit 0
输出(x = 4)
$ bash caseseq.sh 4
50 hit
100 hit
250 hit
300 - default hit
350 - default hit
400 - default hit
450 - default hit
500 - default hit
550 - default hit
600 - default hit
650 - default hit
输出(x =其他任何内容)
$ bash caseseq.sh
50 hit
100 hit
150 hit
200 hit
250 hit
300 - default hit
350 - default hit
400 - default hit
450 - default hit
500 - default hit
550 - default hit
600 - default hit
650 - default hit
注意:只是跳过150
:
[ $step -eq 150 ] && continue
示例:更改for
循环索引
#!/bin/bash
for ((i=0; i< 10; i++)); do
[[ $i == [257] ]] && ((i++))
printf "index %s\n" $i
done
<强>输出强>
$ bash chgidx.sh
index 0
index 1
index 3
index 4
index 6
index 8
index 9