HOWTO · Bash

在 Bash 中讀取檔案或使用者輸入

一篇解釋使用者輸入和 Bash 檔案的文章。

本頁內容

BASH 是 Bourne Again Shell 的簡寫,這是一個智慧名稱,指的是 Bourne Shell(即由 Steven Bourne 建立)。BASH 是由 Brian Fox 開發的一個 shell 程式,是 Bourne Shell 應用程式 sh 的更新版本。

本文將討論 bash 指令碼中的輸入功能以及從標準輸入控制檯和一些特定檔案獲取輸入的方法。此外,我們還將通過多個示例指令碼來說明這個想法。

BASH 指令碼

包含我們通常會在命令列中輸入的指令列表的純文字檔案稱為 Bash Shell 指令碼。當要重複執行一系列任務時,Bash 特別有用。

無需每次都輸入相同序列的指令手冊,只需執行一個預先編寫的 Bash 指令碼檔案即可。因此,這節省了大量的人工工作,也節省了時間。

Bash 指令碼的另一個優點是它的指令式程式設計特性。這意味著它允許編寫程式、條件語句和迴圈結構,如程式語言(例如,C/C++、Javascript 等)。

Bash 指令碼是一個帶有 .sh 副檔名的文字檔案。為了建立它,我們使用副檔名為 .sh 的 touch 命令。

touch myscript.sh

我們可以在任何文字編輯器中開啟它,例如 gedit。要開啟它,請使用以下命令。

命令:

gedit myscipt.sh

我們使用 #!/bin/bash 行來啟動一個 shell 指令碼。在這一行 #!一部分稱為 shebang,其餘部分是作業系統中 bash 直譯器的路徑。

之後,我們將在指令碼中編寫所需的命令集並儲存。要執行 Bash 指令碼,我們使用命令 bash。

命令:

bash myscript.sh

這將執行我們的指令碼併為我們提供指令碼中使用的命令的輸出。

從 Bash 指令碼中的 stdin 輸入

我們還可以從終端或 Bash 指令碼中的 stdin 獲取使用者輸入。我們可以使用內建的 Bash 命令 read 來讀取 Bash 使用者輸入。

它接受使用者的輸入並將其分配給一個變數。它只能從 Bash shell 中讀取一行。

語法:

read <variable>

每個以空格分隔的單詞都儲存在不同的變數中。

Bash 指令碼示例:

#!/bin/bash
echo "Enter your name: "
read userName
echo "Enter your age: "
read userAge;
echo "Enter your 3 Subjects: "
read sub1 sub2 sub3
echo "The user $userName is $userAge years old and is specialized in $sub1, $sub2, and $sub3. "

在此示例中,我們從使用者那裡獲取了他的姓名、年齡和 3 個主題的輸入。主題儲存在單獨的變數中。

輸出:

從 Bash shell 中只讀取一行

使用 read 命令提供變數名稱不是強制性的。如果我們不指定變數名,它預設將值儲存在 REPLY 變數中,以便我們稍後在指令碼中使用它。

Bash 指令碼示例:

#!/bin/bash
echo "Enter a number from 1-10: "
read
echo "You entered: $REPLY"

輸出:

預設情況下將值儲存在 REPLY 變數中

在前面的示例中,我們使用了 2 行來獲取輸入,一行用於提示語句,另一行用於讀取命令。這個過程也可以使用帶有 read 命令的標誌 -p 在單行中執行。

語法:

read -p <Prompt statement> <variable_name>

巴赫指令碼示例:

#!/bin/bash
read -p "Please enter the name of the file: " fileName
echo "The filename you entered is: $fileName"

輸出:

在 read 命令中使用標誌 -p

在某些情況下,出於安全和隱私方面的考慮,我們需要從螢幕上隱藏使用者輸入。例如,當我們需要輸入密碼時,當使用者輸入密碼時,它不應該在螢幕上可見。

為了實現它,我們使用標誌 -s 來使其靜默。

Bash 指令碼示例:

#!/bin/bash
read -p "Enter username: " userName
read -sp "Enter Password: " pass
echo
echo "Hello $userName"

輸出:

使用標誌 -s 使密碼輸入在螢幕上不可見

我們還可以使用 -a 標誌將輸入輸入到陣列中。使用此標誌,一行中的所有單詞都將儲存在陣列的不同索引中,以便以後訪問。

Bash 指令碼示例:

#!/bin/bash
echo "Enter names of 2 students: "
read -a stuNames
echo "The names of students are:${stuNames[0]}, ${stuNames[1]} "

輸出:

使用 -a 標誌在陣列中獲取使用者輸入

Bash 檔案輸入

Bash 指令碼也可以從檔案中獲取輸入。read 命令用於此目的並逐行讀取檔案。我們將討論一些從檔案中讀取資料的示例。

我們可以使用控制檯和指令碼來讀取檔案。首先,我們檢視控制檯命令,然後轉向指令碼。

假設我們有一個檔案 data.txt,其中包含一些文字,如下所示:

LG
Samsung
Bosch
Pel

讀取此檔案的命令:

while read ln; do echo $ln; done < data.txt

輸出:

在 BASH 中讀取 .txt 檔案

我們還可以使用指令碼從檔案中讀取。

Bash 指令碼示例:

#!/bin/bash
fname='data.txt'
a=1
while read ln; do
echo "Reading line $a : $ln"
a=$((a+1))
done < $fname

輸出:

使用指令碼從檔案中讀取

我們也可以從命令列讀取檔名。建立一個 bash 檔案並將下面的指令碼放入其中。

檔名將從該指令碼的命令列輸入中獲取。變數 $1 將儲存檔名以供讀取,讀取第一個引數值。

如果檔案存在於當前位置,while 迴圈將逐行讀取檔案並列印內容,就像前面的示例一樣。

Bash 指令碼示例:

#!/bin/bash
fname=$1
while read ln; do
echo $ln
done < $fname

要執行此指令碼,我們將使用以下命令。

命令:

$ bash myscript.sh data.txt

輸出:

從命令列讀取檔名