Linux中國

用 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 中 「 援引 source 」 一個文件時,你會讓 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 的方法是將其解析為數據流。有很多方法可以做到這一點. 你可以使用 grepcat 或任何可以獲取數據並管道輸出到標準輸出的命令。另外,你可以使用 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&apos;=&apos; -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

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國