Bash 腳本:入門

Bash 腳本:入門
Bash 腳本第 2 部分:循環
Bash 腳本,第 3 部分:命令行選項和開關
Bash 腳本,第 4 部分:輸入和輸出
Bash 腳本,第 5 部分:信號、後台任務、腳本管理
Bash 腳本,第 6 部分:函數和庫開發
Bash 腳本,第 7 部分:sed 和文字處理
Bash 腳本,第 8 部分:awk 數據處理語言
Bash 腳本第 9 部分:正則表達式
Bash 腳本第 10 部分:實際示例
Bash 腳本,第 11 部分:交互式實用程序的期望和自動化

今天我們將討論 bash 腳本。 這 - 命令行腳本,為 bash shell 編寫。 還有其他 shell,例如 zsh、tcsh、ksh,但我們將重點關注 bash。 本材料適用於所有人,唯一的條件是能夠在其中工作 命令行 Linux操作系統。

Bash 腳本:入門

命令行腳本是可以從鍵盤輸入的相同命令的集合,這些命令收集在文件中並由某些共同目的統一起來。 同時,團隊的工作成果既可以具有獨立價值,也可以作為其他團隊的輸入。 腳本是自動執行頻繁執行的操作的有效方法。

Bash 腳本:入門

因此,如果我們談論命令行,它允許您一次執行多個命令,並用分號輸入它們:

pwd ; whoami

事實上,如果您在終端中嘗試過此操作,那麼您的第一個使用兩個命令的 bash 腳本已經編寫完畢。 它的工作原理是這樣的。 團隊第一 pwd 顯示當前工作目錄的信息,然後命令 whoami顯示有​​關您登錄的用戶的信息。

使用這種方法,您可以在一行上組合任意數量的命令,限制只是可以傳遞給程序的最大參數數量。 您可以使用以下命令定義此限制:

getconf ARG_MAX

命令行是一個很棒的工具,但是每次需要時都必須向其中輸入命令。 如果我們將一組命令寫入一個文件並簡單地調用該文件來執行它們會怎麼樣? 事實上,我們所說的文件稱為命令行腳本。

bash 腳本如何工作

使用命令創建一個空文件 touch。 在第一行中,您需要指定我們將使用哪個 shell。 我們感興趣的是 bash,所以文件的第一行是:

#!/bin/bash

在該文件的其他地方,哈希符號用於指示 shell 不處理的註釋。 然而,第一行是一個特殊情況,它是一個井號,後面跟著一個感嘆號(這個序列稱為 社邦)和路徑 bash,向系統表明該腳本是專門為 bash.

Shell 命令由換行符分隔,註釋由井號分隔。 它看起來是這樣的:

#!/bin/bash
# This is a comment
pwd
whoami

在這裡,就像在命令行上一樣,您可以將命令寫在一行上,並用分號分隔它們。 但是,如果您在不同的行上編寫命令,則該文件更易於閱讀。 無論如何,外殼都會處理它們。

設置腳本文件的權限

通過給文件命名來保存文件 myscript,bash腳本就快完成了。 現在只剩下使該文件可執行,否則,當您嘗試運行它時,您將遇到錯誤 Permission denied.

Bash 腳本:入門
嘗試運行權限配置不正確的腳本文件

讓我們使文件可執行:

chmod +x ./myscript

現在讓我們嘗試執行它:

./myscript

設置權限後,一切正常。

Bash 腳本:入門
成功運行bash腳本

消息輸出

要將文本打印到 Linux 控制台,請使用以下命令 echo。 讓我們利用這一事實的知識並編輯我們的腳本,向輸出其中已有命令的數據添加解釋:

#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami

以下是運行更新後的腳本後發生的情況。

Bash 腳本:入門
從腳本輸出消息

現在我們可以使用命令顯示解釋性標籤 echo。 如果您不知道如何使用 Linux 工具編輯文件,或者以前沒有見過該命令 echo, 看一眼 材料。

使用變量

變量允許您在腳本文件中存儲信息(例如命令的結果),以供其他命令使用。

執行單個命令而不存儲其工作結果並沒有什麼問題,但這種方法的可能性非常有限。

bash 腳本中可以使用兩種類型的變量:

  • 環境變量
  • 用戶變量

環境變量

有時 shell 命令需要處理一些系統數據。 例如,以下是顯示當前用戶的主目錄的方法:

#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"

請注意,我們可以使用系統變量 $HOME 用雙引號括起來,這不會阻止系統識別它。 如果運行上面的腳本,會發生以下情況。

Bash 腳本:入門
在腳本中使用環境變量

但是如果你想顯示美元符號怎麼辦? 讓我們試試這個:

echo "I have $1 in my pocket"

系統將檢測由引號分隔的字符串中的美元符號,並假設我們引用了一個變量。 該腳本將嘗試顯示未定義變量的值。 $1。 這不是我們需要的。 該怎麼辦?

在這種情況下,在美元符號之前使用反斜杠控製字符會有所幫助:

echo "I have $1 in my pocket"

該腳本現在將準確輸出預期的內容。

Bash 腳本:入門
使用轉義序列輸出美元符號

用戶變量

除了環境變量之外,bash 腳本還允許您在腳本中設置和使用自己的變量。 這些變量在腳本結束之前都會保留一個值。

與系統變量一樣,可以使用美元符號訪問用戶變量:
TNW-CUS-FMP - 我們的服務可享受 10% 折扣的促銷代碼,可在 7 天內激活

#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"

以下是運行這樣的腳本後會發生的情況。

Bash 腳本:入門
腳本中的自定義變量

命令替換

bash 腳本最有用的功能之一是能夠從命令的輸出中提取信息並將其分配給變量,這允許您在腳本文件中的任何位置使用此信息。

這可以通過兩種方式完成。

  • 帶有反引號字符“`”
  • 借助施工 $()

使用第一種方法時,請注意不要使用單引號而不是反引號。 該命令必須包含在兩個這樣的圖標中:

mydir=`pwd`

在第二種方法中,同樣是這樣寫的:

mydir=$(pwd)

最終的腳本可能如下所示:

#!/bin/bash
mydir=$(pwd)
echo $mydir

在其運行過程中,命令的輸出 pwd將被存儲在一個變量中 mydir,其中的內容,使用命令 echo,將轉到控制台。

Bash 腳本:入門
將命令結果保存在變量中的腳本

數學運算

要在腳本文件中執行數學運算,您可以使用以下形式的構造 $((a+b)):

#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2

Bash 腳本:入門
腳本中的數學運算

if-then 控制結構

在某些場景下,需要控制命令執行的流程。 例如,如果某個值大於五,則必須執行一個操作,否則執行另一個操作。 這適用於很多情況,這裡控制結構將幫助我們 if-then。 最簡單的形式是這樣的:

if команда
then
команды
fi

這是一個工作示例:

#!/bin/bash
if pwd
then
echo "It works"
fi

在這種情況下,如果執行命令 pwd成功完成後,控制台中將顯示“it Works”文本。

讓我們利用現有的知識來編寫一個更複雜的場景。 假設我們需要找到一個用戶 /etc/passwd,如果找到,則報告它存在。

#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi

這就是運行該腳本後發生的情況。

Bash 腳本:入門
用戶搜索

這裡我們使用了命令 grep在文件中搜索用戶 /etc/passwd。 如果團隊 grep你不熟悉的可以查看它的描述 這裡.

在此示例中,如果找到用戶,腳本將顯示相應的消息。 如果找不到用戶怎麼辦? 在這種情況下,腳本將簡單地完成執行,而不告訴我們任何事情。 我也希望他告訴我們這一點,所以讓我們改進代碼。

if-then-else 控制結構

為了使程序能夠報告成功搜索和失敗的結果,我們使用以下結構 if-then-else。 設置方式如下:

if команда
then
команды
else
команды
fi

如果第一個命令返回零,則表示已成功執行,則條件為真,並且不會沿著分支執行 else。 否則,如果返回非零的值,這意味著失敗或錯誤結果,則後面的命令 else.

讓我們編寫以下腳本:

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi

他被處決了 else.

Bash 腳本:入門
使用 if-then-else 結構運行腳本

好吧,讓我們繼續問自己更困難的條件。 如果您需要檢查的不是一個條件而是多個條件怎麼辦? 例如,如果找到所需的用戶,則應顯示一條消息,如果滿足某些其他條件,則應顯示另一條消息,等等。 在這種情況下,嵌套條件會對我們有所幫助。 它看起來像這樣:

if команда1
then
команды
elif команда2
then
команды
fi

如果第一個命令返回零,表明執行成功,則將執行第一個塊中的命令 then,否則,如果第一個條件為假,並且第二個命令返回零,則將執行第二個代碼塊。

#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi

例如,在這樣的腳本中,您可以使用以下命令創建新用戶 useradd,如果搜索沒有返回結果,或者執行其他有用的操作。

數量比較

在腳本中,您可以比較數值。 下面是相關命令的列表。

n1 -eq n2返回真,如果 n1n2.
n1 -ge n2 返回真,如果 n1大於或等於 n2.
n1 -gt n2返回真,如果 n1 更多 n2.
n1 -le n2返回真,如果 n1小於或等於 n2.
n1 -lt n2如果 n1 小於則返回 true n2.
n1 -ne n2返回真,如果 n1不等於 n2.

作為示例,讓我們嘗試一下比較運算符之一。 請注意,表達式括在方括號內。

#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fi

這是該命令將輸出的內容。

Bash 腳本:入門
比較腳本中的數字

變量值 val1大於5,最終執行該分支 then比較運算符和相應的消息顯示在控制台中。

字符串比較

腳本還可以比較字符串值。 比較運算符看起來很簡單,但是字符串比較運算符有一定的特殊性,我們將在下面討論。 這是運營商列表。

str1 = str2 測試字符串是否相等,如果字符串相同則返回 true。
str1 != str2如果字符串不相同,則返回 true。
str1 < str2返回真,如果 str1少於 str2.
str1 > str2 返回真,如果 str1多於 str2.
-n str1 如果長度返回 true str1零以上。
-z str1如果長度返回 true str1等於零。

以下是腳本中字符串比較的示例:

#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user  is the current logged in user"
fi

作為腳本執行的結果,我們得到以下結果。

Bash 腳本:入門
腳本中的字符串比較

這是字符串比較的一個值得一提的功能。 即,“">”和“<”運算符必須使用反斜杠轉義,否則腳本將無法正常工作,但不會出現錯誤消息。 該腳本將“>”符號解釋為重定向輸出的命令。

以下是使用這些運算符在代碼中的顯示方式:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

這是腳本的結果。

Bash 腳本:入門
字符串比較,拋出警告

請注意,該腳本雖然正在執行,但會發出警告:

./myscript: line 5: [: too many arguments

為了擺脫這個警告,我們得出結論 $val2 用雙引號括起來:

#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

現在一切都按其應有的方式進行。

Bash 腳本:入門
字符串比較

">" 和"<" 運算符的另一個功能是它們如何處理大寫和小寫字符。 為了理解這個功能,我們準備一個包含以下內容的文本文件:

Likegeeks
likegeeks

用名稱保存 myfile然後在終端中運行以下命令:

sort myfile

它將對文件中的行進行排序,如下所示:

likegeeks
Likegeeks

團隊 sort默認情況下,按升序對字符串進行排序,這意味著我們示例中的小寫字母小於大寫字母。 現在讓我們準備一個腳本來比較相同的字符串:

#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi

如果你運行它,結果恰恰相反 - 小寫字母現在比大寫字母大。

Bash 腳本:入門
腳本文件中的排序命令和字符串比較

在比較命令中,大寫字母比小寫字母小。 這裡的字符串比較是通過比較 ASCII 字符代碼來完成的,因此排序順序取決於字符代碼。

團隊 sort依次使用系統語言設置中指定的排序順序。

文件檢查

也許下面的命令在 bash 腳本中最常用。 它們允許您檢查有關文件的各種條件。 以下是這些命令的列表。

-d file檢查文件是否存在以及是否是目錄。
-e file檢查文件是否存在。
-f file 檢查文件是否存在以及是否是文件。
-r file檢查文件是否存在並且可讀。
-s file П檢查文件是否存在且不為空。
-w file檢查文件是否存在並且可寫。
-x file檢查文件是否存在並且可執行。
file1 -nt file2 檢查是否較新 file1file2.
file1 -ot file2檢查是否較老 file1file2.
-O file 檢查文件是否存在並且由當前用戶擁有。
-G file檢查文件是否存在以及其組 ID 是否與當前用戶的組 ID 匹配。

這些命令以及今天討論的許多其他命令都很容易記住。 他們的名字是各種單詞的縮寫,直接表明他們執行的檢查。

讓我們在實踐中嘗試其中一個命令:

#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fi

對於現有目錄,此腳本將顯示其內容。

Bash 腳本:入門
列出目錄的內容

我們相信您可以自行嘗試其餘命令,它們都按照相同的原則應用。

結果

今天我們討論瞭如何開始編寫 bash 腳本並涵蓋了一些基本知識。 事實上,bash 編程的話題很大。 本文是由 11 份材料組成的大型系列的第一部分的翻譯。 如果您現在想繼續,這裡是這些材料的原始列表。 為了方便起見,您剛剛閱讀過的譯文已包含在此處。

  1. Bash 腳本一步一步 - 這裡我們討論如何開始創建 bash 腳本,考慮變量的使用,條件構造,計算,數字、字符串的比較,查找文件信息。
  2. Bash 腳本編寫第 2 部分,Bash 的厲害之處 - 這裡揭示了使用 for 和 while 循環的功能。
  3. Bash 腳本編寫第 3 部分,參數和選項 - 本材料專門介紹可以傳遞給腳本的命令行參數和鍵,處理用戶輸入的數據以及可以從文件中讀取的數據。
  4. Bash 腳本編寫第 4 部分,輸入和輸出 - 這裡我們討論文件描述符並使用它們,關於輸入、輸出、錯誤、輸出重定向流。
  5. Bash 腳本編寫第 5 部分,信號和作業 — 本材料專門介紹 Linux 信號、它們在腳本中的處理、計劃的腳本啟動。
  6. Bash 腳本編寫第 6 部分,函數 - 在這裡您可以了解如何在腳本中創建和使用函數以及開發庫。
  7. Bash 腳本編寫第 7 部分,使用 sed — 本文是關於使用 sed 流文本編輯器的。
  8. Bash 腳本編寫第 8 部分,使用 awk — 本材料專門介紹 awk 數據處理語言的編程。
  9. Bash 腳本編寫第 9 部分,正則表達式 - 在這裡您可以了解有關 bash 腳本中正則表達式的使用。
  10. Bash 腳本編寫第 10 部分,實際示例 - 以下是處理可發送給用戶的消息的方法,以及監視磁盤的方法。
  11. Bash 腳本編寫第 11 部分,Expect 命令 - 本材料專用於 Expect 工具,您可以使用該工具自動與交互式實用程序進行交互。 特別是,這是關於 Expect 腳本以及它們如何與 bash 腳本和其他程序交互。

我們認為本系列文章的一大優點是它從最基本的、適合任何級別的用戶開始,逐漸引出相當嚴肅的主題,讓每個人都有機會在 Linux 命令行腳本編寫方面取得進步。

親愛的讀者們! 我們請 bash 編程大師談論他們如何達到精通的高度,分享秘密,我們正在等待那些剛剛編寫第一個腳本的人的印象。

Bash 腳本:入門

只有註冊用戶才能參與調查。 登入, 請。

翻譯該系列文章的其餘部分?

  • 是的!

  • 不需要不需要

1030 位用戶投票。 106 名用戶棄權。

來源: www.habr.com

添加評論