簡體   English   中英

bash循環除了給定數字之外的數字列表

[英]bash loop through list of numbers except given number

循環遍歷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中做同樣的事情?

只需使用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參考手冊→4.1 Bourne Shell Builtins

繼續

 continue [n] 

恢復封閉for,while,until或select循環的下一次迭代。 如果提供n,則恢復執行第n個封閉循環。 n必須大於或等於1.返回狀態為零,除非n不大於或等於1。

添加短路評估, || (邏輯OR):

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關鍵字[[在大多數情況下表現相似但更強大。

您可以像這樣使用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遞增2i比要跳過的數字少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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM