什麼是 Bash 變量以及如何使用它們?

什麼是 Bash 變量以及如何使用它們?

Bash 允許您將整個文本字符串映射到單個變量,從而簡化其使用和腳本編寫。它們如何工作,您如何使用它們?讓我們找出來。

什麼是 Bash 變量?

變量是易於記憶的名稱,可以包含不同的字母數字值。它們很有用,因為它們允許將相同的功能應用於不同的值,而無需重寫腳本/代碼段。它們還使編寫腳本/代碼段變得容易,因為您可以對所有值使用相同的名稱,而不是處理單個值。

實時變量

Bash 允許使用變量。您可以即時創建變量並在當前 Bash 會話期間重用它們。它們可以以多種不同方式幫助您使用 Bash,並且會在當前會話結束後消失。

例如,假設您正在訪問多個網站。您可以進行研究或抓取數據並創建以下變量:

sitea=https://www.maketecheasier.com

顯示基本變量分配的終端。

之後,如果您想使用 Firefox 訪問我們的網站,您只需輸入:

firefox $sitea

顯示變量作為程序參數的終端。

更容易——也更易讀。該$sitea變量將一直映射到站點,直到您手動更改其內容或 Bash 會話結束。當然,您可以創建更多變量,例如sitebsitecsited

設置新變量時,您可以使用任何名稱並在其中存儲任何字母數字字符串。不過請記住,默認情況下它們區分大小寫。因此,$sitea不會與$SiteA. 另外,請注意,在存儲其中包含特殊字符(包括空格)的字符串時,應使用引號。

腳本中的變量

Bash 中的變量在編寫腳本時更有用,因為它們允許您編寫單個腳本,然後可以遍歷不同的字符串或對自定義數據片段進行操作。假設您正在編寫每個人都可以在其計算機上使用的腳本,但每次都會顯示個性化的問候語。如果沒有變量,您將不得不為每個用戶編寫不同版本的腳本。使用變量,您可以保持腳本不變,只更改用戶名。

這樣的腳本看起來像下面這樣:

#!/bin/bash

username=Ramces
echo $username

顯示基本變量分配腳本的終端。

上面的例子可能看起來多餘;然而,隨著代碼複雜性的增加,變量變得不可或缺。一個腳本可能有數百或數千行長,並在不同位置包含用戶名。為了更好地理解它,請考慮以下稍微不同的腳本:

#!/bin/bash

username=Linus
echo Hello $username. This is a simple script I wrote that will repeat your name - that is, $username - often as an actual example of how to use Bash variables. I hope it will make it easier to understand how to use variables to improve your Bash workflow, $username. In this case, the variable username is mapped to your name. Whenever Bash runs into it, it replaces it with $username.

顯示具有多個變量替換的基本腳本的終端。

上面的腳本將使用定義為username變量的名稱來完成文本。如果使用實際用戶的姓名,您必須輸入四次,然後為下一個用戶做同樣的事情,再為下一個用戶做四次。一次又一次。通過將其分配給變量,您只需為每個用戶更改一次,文本中每次提及用戶名時都會更新。

永久 Bash 變量和別名

我們看到瞭如何臨時設置變量,以及如何將它們包含在您自己的腳本中以獲得更永久的東西。您還可以通過編輯“~/.bashrc”文件在 Bash 中永久設置變量。

  • 在您喜歡的文本編輯器中打開文件“~/.bashrc”。

nano ~/.bashrc

  • 我們建議您從測試運行開始,只添加一個變量,這樣您就知道在流程不成功時要查看的位置。移至文件末尾,並在新行中添加您的變量。

myname="Ramces Red"

終端顯示 bashrc 文件中的新永久變量。
  • 保存文件並退出編輯器。這些調整不會立即應用。在您的終端中輸入以下內容以使其生效:

source ~/.bashrc

  • 在 Bash 會話中使用新設置的變量:

echo $myname

您可以根據需要設置任意數量的變量,並極大地簡化您在 Bash 中的日常冒險。

為了進一步提高生產力,還值得設置一種不同類型的變量:別名。與映射到您可以在命令中使用的數據的典型變量不同,使用別名而不是實際命令。

正如您可以使用一個易於記憶的變量來保存長文本字符串一樣,您可以使用別名作為複雜命令的簡單替代方法。

最後,即使您已經在 .bashrc 中永久設置了一個變量,您也可以臨時為它重新分配一個不同的值,就像我們之前看到的那樣。該變量將顯示新內容,直到當前 Bash 會話結束(註銷或重新啟動後)或您重新獲取 . .bashrc文件。

創建數組

雖然大多數 Bash 用戶將變量視為一段數據和標籤之間的簡單鏈接,但也可以將它們用作數組的標記。這些是一種數據結構,可以以編號索引格式存儲多個值。要創建數組,請按照以下步驟操作:

  • 創建一個空的 shell 腳本:

nano array.sh

  • 使用declare子命令在當前 shell 進程中初始化 Bash 數組。

declare -a myarray

顯示數組聲明步驟的終端。
  • 使用內置的 Bash 賦值運算符填充新數組。例如,以下代碼行創建一個包含五個元素的數組:

myarray=([0]=hello [1]=maketecheasier [2]=its [3]=an [4]=array)

顯示包含 5 個元素的基本數組的終端。
  • echo通過使用命令從中提取數據來測試您的新陣列是否有效:

echo ${myarray[1]}

顯示獲取單個數組元素的數組腳本的終端。

您還可以使用“*”運算符流式傳輸數組的內容:

echo ${myarray[*]}

顯示陣列腳本流式傳輸整個陣列的終端。

執行子 shell 變量

Bash 的最大特性之一是它能夠創建子 shell,程序可以在子 shell 中運行,就好像它們是基本函數一樣。例如,編寫ls -a一個shell腳本並運行它仍然會打印當前工作目錄的內容。

顯示簡單命令子 shell 的終端。

雖然這看起來很有限,但 Bash 通過允許您將這些程序的輸出存儲在變量中來擴展它。這允許您將它們用作腳本中其他程序的輸入。

  • 要使用子 shell 變量,首先創建一個空的 shell 腳本:

nano subshell.sh

  • 在新的 shell 腳本中編寫以下樣板代碼:

#!/bin/bash

mysubshell=$(x)echo "The output of the variable is $mysubshell"

  • 將“x”替換為您要運行並存儲輸出的命令。例如,以下將獲取 world.txt 文件的內容,並將單詞“world”替換為“maketecheasier”。

mysubshell=$(sed s/world/maketecheasier/g world.txt)

顯示簡單子 shell 執行的終端。
  • 通過運行新腳本來測試新的子 shell 變量:

chmod u+x. /subshell.sh
bash. /subshell.sh

顯示子 shell 腳本輸出的終端。

子串操作

除了存儲和檢索數據,您還可以修改變量的內容。Bash 有一組運算符,您可以將它們附加在每個變量的末尾,這將允許您微調腳本而無需調用任何其他程序。

  • 創建一個空的 shell 腳本:

nano substring.sh

  • 在空腳本中編寫以下樣板代碼:

#!/bin/bash

mysubstring=hello.txt.old
echo "My filename is: ${mysubstring}"

  • 基本的子字符串操作有三種形式。首先,“#”字符接受 shell 將在變量開頭刪除的正則表達式模式:

#!/bin/bash

mysubstring=hello.txt.old
echo "My filename is: ${mysubstring#*.}"

顯示基本前綴子字符串操作的終端。
  • 其次,“%”字符還接受 shell 將在變量末尾刪除的正則表達式模式:

#!/bin/bash

mysubstring=hello.txt.old
echo "My filename is: ${mysubstring%.*}"

顯示基本後綴子字符串操作的終端。
  • Bash 還提供了一種有選擇地修改變量內容的方法。與sed程序類似,您可以使用“/”字符來查找和替換變量內的任何字符串:

#!/bin/bash

mysubstring=hello.txt
echo "My filename is: ${mysubstring/hello/maketecheasier}"

顯示基本流編輯子字符串功能的終端。

經常問的問題

是否可以在變量內運行 shell 腳本?

是的,通過編寫您要運行的腳本的完整路徑。例如,運行$(/home/ramces/.scripts/sample.sh)將創建一個 Bash 子 shell 並從我的主目錄運行“sample.sh”腳本。

您可以在腳本運行時刪除變量嗎?

是的。unset您可以通過在腳本中插入後跟變量名稱的子命令來從正在運行的 shell 進程中刪除變量。請務必注意,運行此命令不會刪除在當前 shell 進程之外運行的任何變量。

您可以在外部 shell 腳本中使用永久變量嗎?

是的。可以引用在當前 shell 進程之外聲明的變量的值。但是,在使用外部變量時也需要小心,因為它們很容易被臨時覆蓋。

圖片來源:Unsplash。Ramces Red 的所有更改和屏幕截圖。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *