什麼是 Bash 變量以及如何使用它們?
Bash 允許您將整個文本字符串映射到單個變量,從而簡化其使用和腳本編寫。它們如何工作,您如何使用它們?讓我們找出來。
什麼是 Bash 變量?
變量是易於記憶的名稱,可以包含不同的字母數字值。它們很有用,因為它們允許將相同的功能應用於不同的值,而無需重寫腳本/代碼段。它們還使編寫腳本/代碼段變得容易,因為您可以對所有值使用相同的名稱,而不是處理單個值。
實時變量
Bash 允許使用變量。您可以即時創建變量並在當前 Bash 會話期間重用它們。它們可以以多種不同方式幫助您使用 Bash,並且會在當前會話結束後消失。
例如,假設您正在訪問多個網站。您可以進行研究或抓取數據並創建以下變量:
sitea=https://www.maketecheasier.com
之後,如果您想使用 Firefox 訪問我們的網站,您只需輸入:
firefox $sitea
更容易——也更易讀。該$sitea
變量將一直映射到站點,直到您手動更改其內容或 Bash 會話結束。當然,您可以創建更多變量,例如siteb
、sitec
和sited
。
設置新變量時,您可以使用任何名稱並在其中存儲任何字母數字字符串。不過請記住,默認情況下它們區分大小寫。因此,$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"
- 保存文件並退出編輯器。這些調整不會立即應用。在您的終端中輸入以下內容以使其生效:
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)
echo
通過使用命令從中提取數據來測試您的新陣列是否有效:
echo ${myarray[1]}
您還可以使用“*”運算符流式傳輸數組的內容:
echo ${myarray[*]}
執行子 shell 變量
Bash 的最大特性之一是它能夠創建子 shell,程序可以在子 shell 中運行,就好像它們是基本函數一樣。例如,編寫ls -a
一個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 變量:
chmod u+x. /subshell.sh
bash. /subshell.sh
子串操作
除了存儲和檢索數據,您還可以修改變量的內容。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 的所有更改和屏幕截圖。
發佈留言