如何用 Bash 讀寫文件
學習 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/shgreet opensource.comecho "The meaning of life is $var"
運行這段代碼,看見失敗了:
$ bash ./example.sh./example.sh: line 3: greet: command not foundThe meaning of life is
Bash 沒有一個叫 greet 的命令,所以無法執行那一行,也沒有一個叫 var 的變量記錄,所以文件沒有意義。為了解決這個問題,建立一個名為 include.sh 的文件:
greet() {echo "Hello ${1}"}var=42
修改你的 example.sh 腳本,加入一個 source 命令:
#!/bin/shsource include.shgreet opensource.comecho "The meaning of life is $var"
運行腳本,可以看到工作了:
$ bash ./example.shHello opensource.comThe meaning of life is 42
greet 命令被帶入你的 shell 環境,因為它被定義在 include.sh 文件中,它甚至可以識別參數(本例中的 opensource.com)。變量 var 也被設置和導入。
在 Bash 中解析文件
另一種讓數據“進入” Bash 的方法是將其解析為數據流。有很多方法可以做到這一點. 你可以使用 grep 或 cat 或任何可以獲取數據并管道輸出到標準輸出的命令。另外,你可以使用 Bash 內置的東西:重定向。重定向本身并不是很有用,所以在這個例子中,我也使用內置的 echo 命令來打印重定向的結果:
#!/bin/shecho $( < include.sh )
將其保存為 stream.sh 并運行它來查看結果:
$ bash ./stream.shgreet() { echo "Hello ${1}" } var=42$
對于 include.sh 文件中的每一行,Bash 都會將該行打印(或 echo)到你的終端。先用管道把它傳送到一個合適的解析器是用 Bash 讀取數據的常用方法。例如, 假設 include.sh 是一個配置文件, 它的鍵和值對用一個等號(=)分開. 你可以用 awk 甚至 cut 來獲取值:
#!/bin/shmyVar=`grep var include.sh | cut -d'=' -f2`echo $myVar
試著運行這個腳本:
$ bash ./stream.sh42
用 Bash 將數據寫入文件
無論你是要存儲用戶用你的應用創建的數據,還是僅僅是關于用戶在應用中做了什么的元數據(例如,游戲保存或最近播放的歌曲),都有很多很好的理由來存儲數據供以后使用。在 Bash 中,你可以使用常見的 shell 重定向將數據保存到文件中。
例如, 要創建一個包含輸出的新文件, 使用一個重定向符號:
#!/bin/shTZ=UTCdate > date.txt
運行腳本幾次:
$ bash ./date.sh$ cat date.txtTue Feb 23 22:25:06 UTC 2021$ bash ./date.sh$ cat date.txtTue Feb 23 22:25:12 UTC 2021
要追加數據,使用兩個重定向符號:
#!/bin/shTZ=UTCdate >> date.txt
運行腳本幾次:
$ bash ./date.sh$ bash ./date.sh$ bash ./date.sh$ cat date.txtTue Feb 23 22:25:12 UTC 2021Tue Feb 23 22:25:17 UTC 2021Tue Feb 23 22:25:19 UTC 2021Tue Feb 23 22:25:22 UTC 2021
Bash 輕松編程
Bash 的優勢在于簡單易學,因為只需要一些基本的概念,你就可以構建復雜的程序。完整的文檔請參考 GNU.org 上的 優秀的 Bash 文檔。

























