關於linux中bash for loops的所有知識

Bash是一個強大的指令碼工具,也是Linux系統的主幹。在這裡學習一些基本知識。...

Bash指令碼是一種高效的自動化任務的方法,特別是那些利用其他現有程式的任務。這種自動化通常需要重複幾次類似的操作,這正是for迴圈進入自己的位置。

A photo of a roller coaster ride with looping tracks

Linux和Mac系統管理員通常都熟悉透過終端編寫指令碼,但即使是Windows使用者也可以使用Windows子系統for Linux來進行操作。

bash指令碼的工作原理

bash指令碼只是一個純文字檔案,其中包含bashshell可以讀取和執行的一系列命令。Bash是catalinamacos之前版本和大多數Linux發行版中的預設shell。

如果您以前從未使用過shell指令碼,那麼應該從最簡單的情況開始。這將允許您練習關鍵概念,包括指令碼的建立和執行。

首先,在方便的位置建立以下檔案(理想情況下,首先開啟終端並導航到所需的目錄):

#!/bin/bashecho "Hello, World"

第一行告訴執行這個程式的人如何執行它(即使用bash直譯器)。第二個命令與您在命令列中輸入的任何其他命令一樣。將該檔案另存為hello_世界.sh,然後:

$ chmod +x hello_world.sh$ ./hello_world.sh

第一行上的chmod命令使檔案可執行,這意味著可以透過鍵入其名稱來執行,如第二行所示。

如果您看到“Hello,World”字樣出現在終端的一行上,那麼一切都按要求工作。

for迴圈是如何工作的

在一般程式設計中,for迴圈有兩種主要型別:numeric和foreach。傳統上,數字型別是最常見的,但是在bash的用法中,通常是相反的。

Numeric for迴圈通常關注單個整數,該整數決定將執行多少次迭代,例如:

for (i = 0; i < 100; i++) { /* statements to execute repeatedly */}

這是一個熟悉的查詢迴圈,它將精確地迭代100次,除非我在迴圈中被更改,或者另一個語句導致for迴圈的執行停止。

相反,Foreach迴圈傾向於對列表或陣列等結構進行操作,並對集合中的每個項進行迭代:

people = [ "Peter", "Paul", "Mary" ]foreach (people as person) { if (person == "Paul") { ... }}

有些語言使用稍有不同的語法來交換集合和項的順序:

people = [ "Peter", "Paul", "Mary" ]for (person in people) { if (person == "Paul") { ... }}

對於in迴圈

在bash中,foreach或for In迴圈更為常見。基本語法是:

for arg in [list]do /* statements to execute repeatedly */ /* the value of arg can be obtained using $arg */done

例如,要遍歷三個顯式命名的檔案:

for file in one.c two.c three.cdo ls "$file"done

如果當前目錄中存在此類檔案,則此指令碼的輸出將為:

one.ctwo.cthree.c

可以透過glob模式(包括萬用字元——表示其他字元的特殊字元)獲取列表,而不是固定的一組檔案。在下面的示例中,for迴圈遍歷名稱以“.xml”結尾的所有檔案(在當前目錄中):

for file in *.xmldo ls -l "$file"done

下面是一些示例輸出:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

這看起來很像一個冗長的方法:

$ ls -l *.xml

但是有一個顯著的區別:for迴圈執行ls程式兩次,每次只傳遞一個檔名。在單獨的ls示例中,glob模式(*.xml)首先匹配檔名,然後將所有檔名作為單獨的命令列引數傳送到ls的一個例項。

下面是一個使用wc(單詞計數)程式使差異更加明顯的示例:

$ wc -l *.xml44 feed.xml231 sitemap.xml275 total

wc程式分別計算每個檔案中的行數,然後列印所有行的總計數。相反,如果wc在for迴圈中執行:

for file in *.xmldo wc -l $filedone

您仍將看到每個檔案的計數:

44 feed.xml231 sitemap.xml

但是沒有總的摘要彙總,因為wc是獨立執行的,每次迴圈迭代。

當列表不是列表時

由於bash處理帶引號的引數/字串的方式,在處理for迴圈時有一個非常簡單和常見的錯誤。迴圈瀏覽檔案列表的方式如下:

for file in one.c two.c

不是這樣的:

for file in "one.c two.c"

第二個示例將檔名括在雙引號中,這將導致只包含一個引數的列表;for迴圈將只執行一次。在以下情況下,可以透過使用變數來避免此問題:

FILES="one.c two.c"for file in $FILESdo ...done

請注意,變數宣告本身需要將其值括在雙引號中!

因為沒有名單

由於沒有可迭代的內容,for迴圈在呼叫時對提供給指令碼的任何命令列引數進行操作。例如,如果您有一個名為args.sh檔案包含以下內容:

#!/bin/shfor ado echo $adone

然後執行args.sh檔案將為您提供以下資訊:

$ ./args.sh one two threeonetwothree

Bash認識到這種情況,並將do視為in$@do中for的等價物,其中,$@是表示命令列引數的特殊變數。

模擬傳統的數字for迴圈

Bash指令碼通常處理檔案列表或其他命令的輸出行,因此for-in型別的迴圈很常見。但是,仍然支援傳統的c型操作:

for (( i=1; i<=5; i++ ))do echo $idone

這是一個經典的形式,包括三個部分:

  1. 變數在第一次遇到迴圈時被初始化(i=1)
  2. 只要條件(i<=5)為真,迴圈就繼續
  3. 每次迴圈時,變數都會遞增(i++)

在兩個值之間迭代是一個非常常見的要求,因此有一個更短、稍微不那麼混亂的替代方案:

for i in {1..5}do echo $idone

發生的支架擴充套件有效地將上述for迴圈轉換為:

for i in 1 2 3 4

更精細的迴圈控制與中斷和繼續

更復雜的for迴圈通常需要一種方法,即提前退出主迴圈或立即使用下一個值重新啟動主迴圈。為此,bash借用了其他程式語言中常見的break和continue語句。下面的示例使用這兩種方法查詢第一個長度超過100個字元的檔案:

#!/bin/bashfor file in *do if [ ! -f "$file" ] then echo "$file is not a file" continue fi num_chars=$(wc -c < "$file") echo $file is "$num_chars characters long" if [ $num_chars -gt 100 ] then echo "Found $file" break fidone

這裡的for迴圈操作當前目錄中的所有檔案。如果該檔案不是常規檔案(例如,如果它是一個目錄),則使用continue語句依次用下一個檔案重新啟動迴圈。如果它是一個常規檔案,第二個條件塊將確定它是否包含超過100個字元。如果是這樣,則使用break語句立即離開for迴圈(併到達指令碼的末尾)。

結論

bash指令碼是包含一組可以執行的指令的檔案。for迴圈允許指令碼的一部分重複多次。透過使用變數、外部命令以及break和continue語句,bash指令碼可以應用更復雜的邏輯並執行範圍更廣的任務。

  • 發表於 2021-03-29 06:22
  • 閱讀 ( 59 )
  • 分類:程式設計

你可能感興趣的文章

頂級網站和書籍,讓您成為linux命令列英雄

一旦您切換到所選的Linux發行版並掌握了使用者介面,您應該很樂意繼續。但是如果你想要額外的功能呢?如果在幾個選單上單擊滑鼠並不能提供您所期望的超級使用者體驗,該怎麼辦? ...

  • 發佈於 2021-03-14 07:04
  • 閲讀 ( 58 )

使用linux命令列安裝硬碟和分割槽

如果您希望更多地使用Linux終端,那麼學習如何手動裝載和解除安裝硬碟是一個簡單的開始。此外,如果你發現自己處於一種讓你遠離傳統桌面的境地,學習如何這樣做可能會節省很多時間和谷歌搜尋。 ...

  • 發佈於 2021-03-16 13:53
  • 閲讀 ( 84 )

最好的,最快的,最堅固的usb快閃記憶體驅動器,你可以現在購買

...發人員的需求,命令列下面隱藏著更多的特性。瞭解更多關於Bash-on-Windows的資訊,從您應該如何以及為什麼安裝它,到您可能不知道的隱藏特性。 ...

  • 發佈於 2021-03-17 01:06
  • 閲讀 ( 49 )

nand和emmc:你需要知道的關於快閃記憶體的所有知識

快閃記憶體無處不在。它存在於你的USB記憶棒,你相機的SD卡,你的固態硬碟,醫院醫療裝置,工業機器人機器,和無數的裝置和小工具。 ...

  • 發佈於 2021-03-17 13:33
  • 閲讀 ( 40 )

如何使用windows subsystem for linux執行linux桌面

... 您可以在“設定”&amp;gt;“系統”&amp;gt;“關於”中進行檢查,在那裡可以找到“系統型別”條目。要繼續,應將其改為“64位作業系統”。如果不是,並且您正在執行64位硬體,則需要將Windows10從32位升級到64位。 ...

  • 發佈於 2021-03-18 04:14
  • 閲讀 ( 45 )

如何在windows10上獲得linux bash shell

想要在Windows PC上快速方便地訪問Linux嗎?最好的選擇是使用Windows子系統for Linux。 ...

  • 發佈於 2021-03-21 11:48
  • 閲讀 ( 58 )

icloud照片主指南:照片管理所需的所有知識

...照片應用程式的設定中找到“最佳化”選項,還可以在“關於此Mac”&amp;gt;“儲存”&amp;gt;“管理”&amp;gt;“照片”下找到該選項。它顯示為最佳化照片庫。 ...

  • 發佈於 2021-03-24 12:57
  • 閲讀 ( 59 )

學習關於精益六西格瑪的所有知識

...術的所有方面。 六西格瑪綠帶大師班,有關於Minitab的專業知識:透過480次講座,學習提高Minitab技能並分析任何業務。 六西格瑪黑帶認證:六西格瑪階段0&amp;1:一旦你準備好了黑帶,請檢視本課程...

  • 發佈於 2021-03-26 13:58
  • 閲讀 ( 47 )

在linux中,“bash”是什麼意思?

... 我們這裡也有關於如何利用的文章,這些文章將訓練您成為一個更好的Bash指令碼編寫者。例如,我們可以向您展示如何在Bash中編寫for迴圈,或者將您的指令碼轉換為可單擊的應用程式...

  • 發佈於 2021-03-28 13:14
  • 閲讀 ( 61 )

如何在linux上使用seq命令

Linux seq命令可以在眨眼之間生成數字列表。但是如何將這個功能付諸實際使用呢?我們將向您展示seq如何為您帶來便利。 seq命令 乍一看,Linux seq命令似乎有些奇怪。它可以讓你快速生成數字序列,就這樣!不過,這裡的關鍵...

  • 發佈於 2021-04-01 11:46
  • 閲讀 ( 41 )
yf1t0843
yf1t0843

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦