用 Bash 讀寫文件
當你使用 Bash 編寫腳本時,有時你需要從一個文件中讀取數據或向一個文件寫入數據。有時文件可能包含配置選項,而另一些時候這個文件是你的用戶用你的應用創建的數據。每種語言處理這個任務的方式都有些不同,本文將演示如何使用 Bash 和其他 POSIX shell 處理數據文件。
安裝 Bash
如果你在使用 Linux,你可能已經有了 Bash。如果沒有,你可以在你的軟體倉庫里找到它。
在 macOS 上,你可以使用默認終端,Bash 或 Zsh,這取決於你運行的 macOS 版本。
在 Windows 上,有幾種方法可以體驗 Bash,包括微軟官方支持的 Windows Subsystem for Linux(WSL)。
安裝 Bash 後,打開你最喜歡的文本編輯器並準備開始。
使用 Bash 讀取文件
除了是 shell 之外,Bash 還是一種腳本語言。有幾種方法可以從 Bash 中讀取數據。你可以創建一種數據流並解析輸出, 或者你可以將數據載入到內存中。這兩種方法都是有效的獲取信息的方法,但每種方法都有相當具體的用例。
在 Bash 中援引文件
當你在 Bash 中 「 援引 」 一個文件時,你會讓 Bash 讀取文件的內容,期望它包含有效的數據,Bash 可以將這些數據放入它建立的數據模型中。你不會想要從舊文件中援引數據,但你可以使用這種方法來讀取配置文件和函數。
(LCTT 譯註:在 Bash 中,可以通過 source
或 .
命令來將一個文件讀入,這個行為稱為 「sourcing」,英文原意為「一次性(試)採購」、「尋找供應商」、「獲得」等,考慮到 Bash 的語境和發音,我建議可以翻譯為「援引」,或有不當,供大家討論參考 —— wxy)
例如,創建一個名為 example.sh
的文件,並輸入以下內容:
#!/bin/sh
greet opensource.com
echo "The meaning of life is $var"
運行這段代碼,看見失敗了:
$ bash ./example.sh
./example.sh: line 3: greet: command not found
The meaning of life is
Bash 沒有一個叫 greet
的命令,所以無法執行那一行,也沒有一個叫 var
的變數記錄,所以文件沒有意義。為了解決這個問題,建立一個名為 include.sh
的文件:
greet() {
echo "Hello ${1}"
}
var=42
修改你的 example.sh
腳本,加入一個 source
命令:
#!/bin/sh
source include.sh
greet opensource.com
echo "The meaning of life is $var"
運行腳本,可以看到工作了:
$ bash ./example.sh
Hello opensource.com
The meaning of life is 42
greet
命令被帶入你的 shell 環境,因為它被定義在 include.sh
文件中,它甚至可以識別參數(本例中的 opensource.com
)。變數 var
也被設置和導入。
在 Bash 中解析文件
另一種讓數據「進入」 Bash 的方法是將其解析為數據流。有很多方法可以做到這一點. 你可以使用 grep
或 cat
或任何可以獲取數據並管道輸出到標準輸出的命令。另外,你可以使用 Bash 內置的東西:重定向。重定向本身並不是很有用,所以在這個例子中,我也使用內置的 echo
命令來列印重定向的結果:
#!/bin/sh
echo $( < include.sh )
將其保存為 stream.sh
並運行它來查看結果:
$ bash ./stream.sh
greet() { echo "Hello ${1}" } var=42
$
對於 include.sh
文件中的每一行,Bash 都會將該行列印(或 echo
)到你的終端。先用管道把它傳送到一個合適的解析器是用 Bash 讀取數據的常用方法。例如, 假設 include.sh
是一個配置文件, 它的鍵和值對用一個等號(=
)分開. 你可以用 awk
甚至 cut
來獲取值:
#!/bin/sh
myVar=`grep var include.sh | cut -d'=' -f2`
echo $myVar
試著運行這個腳本:
$ bash ./stream.sh
42
用 Bash 將數據寫入文件
無論你是要存儲用戶用你的應用創建的數據,還是僅僅是關於用戶在應用中做了什麼的元數據(例如,遊戲保存或最近播放的歌曲),都有很多很好的理由來存儲數據供以後使用。在 Bash 中,你可以使用常見的 shell 重定向將數據保存到文件中。
例如, 要創建一個包含輸出的新文件, 使用一個重定向符號:
#!/bin/sh
TZ=UTC
date > date.txt
運行腳本幾次:
$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:06 UTC 2021
$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:12 UTC 2021
要追加數據,使用兩個重定向符號:
#!/bin/sh
TZ=UTC
date >> date.txt
運行腳本幾次:
$ bash ./date.sh
$ bash ./date.sh
$ bash ./date.sh
$ cat date.txt
Tue Feb 23 22:25:12 UTC 2021
Tue Feb 23 22:25:17 UTC 2021
Tue Feb 23 22:25:19 UTC 2021
Tue Feb 23 22:25:22 UTC 2021
Bash 輕鬆編程
Bash 的優勢在於簡單易學,因為只需要一些基本的概念,你就可以構建複雜的程序。完整的文檔請參考 GNU.org 上的 優秀的 Bash 文檔。
via: https://opensource.com/article/21/3/input-output-bash
作者:Seth Kenlon 選題:lujun9972 譯者:geekpi 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive