bash循环除了给定数字之外的数字列表

时间:2016-10-18 13:56:50

标签: bash loops

循环浏览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中做同样的事情?

3 个答案:

答案 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

经典方式,iftest[),非公平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递增1i 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