循环浏览bash中的连续数字列表
for s in $(seq 1 5);do
echo ${s}
done
循环遍历一个连续的数字列表,在python中留下给定的数字,我可以这样做:
list = [s2 for s2 in range(6)[1:] if s2 != s1]
for s1 in list:
print s1
其中list包含除s1之外的所有数字
我如何在bash中做同样的事情?
答案 0 :(得分:5)
只需使用continue
即可跳过此步骤:
for s in {1..5} # note there is no need to use $(seq...)
do
[ "$s" -eq 3 ] && continue # if var is for example 3, jump to next loop
echo "$s"
done
返回:
1
2
4 # <--- 3 is skipped
5
来自Bash Reference Manual → 4.1 Bourne Shell Builtins:
继续强>
continue [n]
恢复封闭for,while,until或select的下一次迭代 环。如果提供n,则执行第n个封闭循环 恢复。 n必须大于或等于1.返回状态为 除非n不大于或等于1,否则为零。
答案 1 :(得分:2)
添加短路评估,||
(逻辑或):
for s in $(seq 1 5); do
(( s == 3 )) || echo "$s"
done
(( s == 3 ))
检查$s
是否等于3
,如果不是||
)echo
则为
反向检查($s
不等于3
)和逻辑AND(&&
):
for s in $(seq 1 5); do
(( s != 3 )) && echo "$s"
done
经典方式,if
与test
([
),非公平test
:
for s in $(seq 1 5); do
if [ "$s" -ne 3 ]; then
echo "$s"
fi
done
反向test
,股权支票:
for s in $(seq 1 5); do
if [ "$s" -eq 3 ]; then
continue
fi
echo "$s"
done
continue
将使循环控制位于顶部,而不是评估以下命令。
还有一个bash
关键字[[
在大多数情况下表现相似,但更强大。
答案 2 :(得分:2)
您可以像这样使用BASH算术构造((...))
:
s1=3 # skip this
s2=6 # upper count
for ((i=1; i<s2; i+=(i==s1-1?2:1) )); do echo $i; done
1
2
4
5
关于:i+=(i==s1-1?2:1)
在for循环中,而不是始终按i
递增1
,i
2
时,我i
递增1
然后是要跳过的数字。
使用BASH数组的解决方案:
arr=({1..5}) # populate 1 to 5 in an array
unset arr[s1-1] # delete element s1-1
# print the array
printf "%s\n" "${arr[@]}"
1
2
4
5