shell指令碼編寫入門指南2:for迴圈

如果您想建立您的極客信譽,請加入我們的shell腳本系列的第二部分。我們對上週的指令碼進行了一些修改和改進,併為新手提供了一個迴圈指南。...

shell指令碼編寫入門指南2:for迴圈

如果您想建立您的極客信譽,請加入我們的shell腳本系列的第二部分。我們對上週的指令碼進行了一些修改和改進,併為新手提供了一個迴圈指南。

重新訪問datecp指令碼

在shell指令碼指南的第一部分中,我們編寫了一個指令碼,在檔名末尾新增日期後,將檔案複製到備份目錄。

SamuelDionneRiel在評論中指出,有一種更好的方法來處理變數引用。

Arguments are space-separated in the bash shell, it will tokenize when there is a space in the resulted expanded command. In your script, cp $1 $2.$date_formatted will work as intended as long as the expanded variables do not have spaces in them. If you call your script this way: datecp "my old name" "my new name" the expansion will result in this command: cp my new name my old name.the_date which actually has 6 arguments.

To properly address this issue, the last line of the script should be: cp "$1" "$2.$date_formatted"

如您所見,將我們的指令碼行從:

cp -iv $1 $2.$date_formatted

收件人:

cp -iv “$1” “$2”.$date_formatted

在名稱中包含空格的檔案上使用指令碼時,將解決此問題。Samuel還指出,當從這個站點(或一般的網際網路)複製和貼上程式碼時,一定要用適當的破折號和引號替換那些經常替換它們的“排版更好”的破折號和引號。我們還將做更多的工作來確保我們的程式碼更易於複製/貼上。;-)

另一位評論者Myles Braithwaite決定擴充套件我們的指令碼,以便日期出現在檔案擴充套件之前。所以

tastyfile.mp3.07_14_11-12.34.56

我們會得到:

tastyfile.07_14_11-12.34.56.mp3

最終對大多數使用者來說更方便一點。他的程式碼可以在他的GitHub頁面上找到。讓我們看看他用什麼來分解檔名。

date_formatted=$(date +%Y-%m-%d_%H.%M%S) file_extension=$(echo “$1″|awk -F . ‘{print $NF}’) file_name=$(basename $1 .$file_extension)

cp -iv $1 $file_name-$date_formatted.$file_extension

我對格式做了一些修改,但是可以看到Myles在第1行聲明瞭他的日期函式。但是,在第2行中,他使用“echo”命令和指令碼的第一個引數來輸出檔名。他使用pipe命令獲取輸出並將其用作下一部分的輸入。完成管道後,Myles呼叫“awk”命令,這是一個強大的模式掃描程式。使用-F標誌,他告訴命令下一個字元(空格後)將定義“欄位分隔符”。在這種情況下,這是一個時期。

現在,awk看到一個名為美味檔案.mp3由兩個欄位組成:“tastyfile”和“mp3”。最後,他使用

‘{print $NF}’

顯示最後一個欄位。如果檔案有多個句點,因此awk會看到多個欄位,它將只顯示最後一個欄位,即副檔名。

在第3行中,他為檔名建立了一個新變數,並使用“basename”命令引用$1中除副檔名以外的所有內容。這是透過使用basename並將$1作為引數,然後新增一個空格和副檔名來實現的。由於引用第2行的變數,副檔名將自動新增。這樣做的目的是

tastyfile.mp3

把它變成

tastyfile

在最後一行中,Myles整理了一個命令,該命令將按順序輸出所有內容。請注意,沒有對指令碼的第二個引數$2的引用。這個特定的指令碼將把所說的檔案複製到您當前的目錄中。幹得好塞繆爾和邁爾斯!

執行指令碼和$path

我們在基礎文章中還提到,預設情況下,指令碼不允許作為命令引用。也就是說,您必須指向指令碼的路徑才能執行它:

./script

~/bin/script

但是,透過將指令碼放在~/bin/中,您只需從任何地方鍵入它們的名稱即可執行它們。

評論者們花了一些時間來討論這有多合適,因為沒有一個現代Linux發行版預設建立這個目錄。此外,預設情況下也沒有人將其新增到$PATH變數中,這是指令碼像命令一樣執行所必需的。我有點困惑,因為在檢查了$PATH變數之後,註釋者是對的,但是呼叫指令碼仍然對我有效。我發現了原因:許多現代Linux發行版在使用者的主目錄–.profile中建立了一個特殊的檔案。

shell指令碼編寫入門指南2:for迴圈

此檔案由bash讀取(除非使用者的主目錄中存在.bash\u profile),在底部,有一個部分將~/bin/folder新增到$PATH變數(如果存在)。所以,這個謎團被解開了。對於本系列的其餘部分,我將繼續將指令碼放在~/bin/目錄中,因為它們是使用者指令碼,應該能夠由使用者執行。而且,似乎我們真的不需要手動處理$PATH變數來讓事情正常工作。

使用迴圈重複命令

讓我們來看看極客武器庫中處理重複性任務最有用的工具之一:迴圈。今天,我們將討論“for”迴圈。

for迴圈的基本輪廓如下:

for VARIABLE in LIST; do command1 command2 … commandn done

變數可以是任何變數,儘管通常按約定使用小寫“i”。列表是項的列表;可以指定多個項(用空格分隔)、指向外部文字檔案或使用星號(*)表示當前目錄中的任何檔案。列出的命令按約定縮排,因此更容易看到巢狀—將迴圈放入迴圈中(這樣可以在迴圈時迴圈)。

因為列表使用空格作為分隔符—也就是說,空格表示移動到列表中的下一項—所以名稱中有空格的檔案不是很友好。現在,讓我們繼續使用沒有空間。讓從一個簡單的指令碼開始,顯示當前目錄中的檔名。在~/bin/資料夾中建立一個名為“loopscript”的新指令碼。如果您不記得該怎麼做(包括將其標記為可執行檔案和新增hash-bang hack),請參閱我們的bash指令碼基礎文章。

在其中,輸入以下程式碼:

for i in item1 item2 item3 item4 item5 item6; do echo “$i” done

shell指令碼編寫入門指南2:for迴圈

當您執行指令碼時,應該將這些列表項作為輸出。

shell指令碼編寫入門指南2:for迴圈

很簡單吧?讓我們看看如果我們稍微改變一下會發生什麼。更改指令碼,使其顯示以下內容:

for i in *; do echo “$i” done

shell指令碼編寫入門指南2:for迴圈

當您在資料夾中執行此指令碼時,您應該得到它作為輸出包含的檔案列表。

shell指令碼編寫入門指南2:for迴圈

現在,讓我們將echo命令更改為更有用的東西,比如zip命令。也就是說,我們將把檔案新增到歸檔中。我們來討論一下吧!

for i in $@; do zip archive “$i” done

shell指令碼編寫入門指南2:for迴圈

有新東西!“$@”是“$1$2$3…$n”的快捷方式。換句話說,它是您指定的所有引數的完整列表。現在,看看當我用幾個輸入檔案執行指令碼時會發生什麼。

shell指令碼編寫入門指南2:for迴圈

你可以看到哪些檔案在我的資料夾中。我用六個引數運行了這個命令,每個檔案都被新增到一個名為存檔.zip”. 很簡單,對吧?

因為迴圈是非常美妙的。現在可以對檔案列表執行批處理函式。例如,可以將指令碼的所有引數複製到壓縮的存檔中,將原始檔案移動到其他資料夾,並自動將壓縮檔案安全複製到遠端計算機。如果你用SSH設定金鑰檔案,你甚至不需要輸入密碼,你甚至可以告訴指令碼在上傳zip檔案後刪除它!

 


使用for迴圈可以很容易地對目錄中的所有檔案執行一系列操作。您可以將各種各樣的命令堆疊在一起,並且可以非常輕鬆地使用引數來建立即時列表,這只是冰山一角。

 

你有什麼建議嗎?你做了一個有用的指令碼,使用迴圈?想分享你對這個系列的想法嗎?留下一些評論和幫助其他指令碼新手了!

  • 發表於 2021-04-12 21:18
  • 閱讀 ( 35 )
  • 分類:網際網路

你可能感興趣的文章

5個有用的vb windows指令碼,可自動使用計算機

...通計算機使用者,都可能需要經常在PC上執行許多工。VB指令碼是按比例縮小的Visual Basic程式,用作Windows指令碼,可以執行任何操作,從調出有關計算機硬體的重要資訊,到停止和啟動服務或重置網路卡片。 ...

  • 發佈於 2021-03-11 20:14
  • 閲讀 ( 57 )

使用簡單的shell指令碼修復html格式

...有時會新增惱人的格式標記(如標記)。使用簡單的shell指令碼,您可以通過幾個簡單的命令自動清除那些垃圾HTML格式。 ...

  • 發佈於 2021-03-13 00:12
  • 閲讀 ( 51 )

什麼是shell指令碼,為什麼要使用它

...l還可以執行儲存在檔案中的命令。這種執行模式稱為shell指令碼,本文將介紹shell指令碼的基礎知識。 ...

  • 發佈於 2021-03-13 04:53
  • 閲讀 ( 56 )

如何用google指令碼在google表單中傳送電子郵件

...一次小小的努力,您就再也不用手動傳送資料了。讓谷歌指令碼充當你自己的私人助理,為你做所有的工作。 ...

  • 發佈於 2021-03-14 04:11
  • 閲讀 ( 47 )

VisualStudio程式碼是mac的完美文字和指令碼編輯器

...一個匆忙衝出Windows版本的埠。程式碼對於簡單的自動化指令碼來說是很好的,但是外掛支援才是它真正的亮點。 ...

  • 發佈於 2021-03-14 07:11
  • 閲讀 ( 57 )

使用powershell而不是批處理指令碼的5個原因

...如果您喜歡命令列而不是圖形視窗,或者如果您喜歡使用指令碼自動化任務,那麼您將喜歡PowerShell提供的功能。 ...

  • 發佈於 2021-03-15 16:49
  • 閲讀 ( 100 )

製作一個樹莓皮gmail通知燈

...ail電子郵件通知燈。如果您有任何未讀的電子郵件,Python指令碼會開啟指示燈。這個專案需要很少的部分,可以在一個小時內完成!當然,你可以把你的LED打扮成任何你喜歡的樣子,比如MineCraft紅石塊,或者其他用透明塑膠列印...

  • 發佈於 2021-03-17 17:32
  • 閲讀 ( 57 )

什麼是applescript?編寫第一個mac自動化指令碼

如果你在編寫指令碼的世界裡感到舒服,並且在Mac上工作,AppleScript可能是你的自動化解決方案。AppleScript是一種功能強大的語言,只要它提供AppleScript庫,就可以控制任何應用程式。 ...

  • 發佈於 2021-03-20 16:33
  • 閲讀 ( 62 )

如何開始與樹莓皮生鏽

... 您將從終端編譯和構建所有指令碼,但還需要一個程式碼編輯器。在這個專案中,我將使用codeoss,一個可以安裝在Pi上的VS程式碼的社群構建,但它不是必需的。任何程式碼編輯器都可以。 ...

  • 發佈於 2021-03-21 09:18
  • 閲讀 ( 62 )

如何使用applescript將bash指令碼轉換為可單擊的應用程式

假設你是一個bash指令碼嚮導,喜歡為不太懂技術的朋友和家人自動化任務。即使你給了他們一個指令碼,完全解決了他們的問題,他們可能仍然擔心自己使用終端。在這種情況下,您不妨手動為它們執行所有操作。 ...

  • 發佈於 2021-03-21 09:39
  • 閲讀 ( 55 )