重擊讀命令

Bash附帶了許多內置命令,您可以在命令行或Shell腳本中使用它們。

在本文中,我們將探討內置的 read 命令。

重擊 read 內置#

read 是bash內置命令,它從標準輸入(或文件描述符)中讀取一行並將該行拆分為單詞。 第一個單詞分配給名字,第二個單詞分配給名字,依此類推。

的一般語法 read 內置採用以下形式:

read [options] [name...]

為了說明命令的工作原理,請打開終端,輸入 read var1 var2,然後按“ Enter”。 該命令將等待用戶輸入輸入。 輸入兩個單詞,然後按“ Enter”。

read var1 var2Hello, World!

單詞被分配給傳遞給 read 命令作為參數。 採用 echo 要麼 printf 驗證:

echo $var1echo $var2
Hello,
World!

您可以將標準輸入傳遞給 read 使用其他方法,例如管道,here-string或heredoc:

echo "Hello, World!" | (read var1 var2; echo -e "$var1 n$var2")

readecho 用括號括起來並在同一子shell中執行。

Hello,
World!

這是一個使用here字符串和 printf

read -r var1 var2 <<< "Hello, World!"printf "var1: %s nvar2: %sn" "$var1" "$var2"
Var1: Hello, 
Var2: World! 

如果沒有提供參數給 read 命令,將整行分配給 REPLY 變量:

echo "Hello, world!" | (read; echo "$REPLY")
Hello, World!

如果提供的參數數量 read 大於從輸入中讀取的單詞數,其餘單詞分配給姓氏:

echo "Linux is awesome." | (read var1 var2; echo -e "Var1: $var1 nVar2: $var2")
Var1: Linux 
Var2: is awesome.

否則,如果參數數量小於名稱數量,則為其餘名稱分配一個空值:

echo "Hello, World!" | (read var1 var2 var3; echo -e "Var1: $var1 nVar2: $var2 nVar3: $var3")
Var1: Hello, 
Var2: World! 
Var3: 

默認, read 將反斜杠解釋為轉義符,有時可能會導致意外行為。 要禁用反斜杠轉義,請使用 -r 選項。

以下是顯示如何 read 在有無 -r 選項:

read <<< "Hello, tWorld!"printf %s "$REPLY"
Hello, tWorld!
read -r <<< "Hello, tWorld!"printf %s "$REPLY"
Hello, tWorld!

通常,您應該始終使用 read-r 選項。

更改定界符

的默認行為 read 是使用一個或多個空格,製表符和換行符作為分隔符,將行拆分為單詞。 要將另一個字符用作分隔符,請將其分配給 IFS 變量(內部字段分隔符)。

echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 n$var2 n$var3")
Linux 
is 
awesome.

什麼時候 IFS 設置為空格或製表符以外的其他字符,這些單詞之間僅用一個字符分隔:

echo "Linux::is:awesome." |   (IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1 nVar2: $var2 nVar3: $var3 nVar4: $var4")

該行分為四個字。 第二個單詞是一個空值,表示定界符之間的段。 之所以創建它,是因為我們使用了兩個相鄰的定界符(::)。

Var1: Linux 
Var2:  
Var3: is 
Var4: awesome.

您可以使用多個定界符來分隔行。 指定多個定界符時,將字符分配給 IFS 變量之間沒有空格。

這是一個使用示例 _ 一個 - 作為分隔符:

echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 n$var2 n$var3")
Linux 
is 
awesome.

提示字符串

編寫交互式bash腳本時,可以使用 read 命令以獲取用戶輸入。

要指定提示字符串,請使用 -p 選項。 提示打印在 read 被執行並且不包含換行符。

這是一個簡單的示例:

read -r -p "Are you sure?"

通常,您將使用 read 裡面的命令 while 循環以強制用戶給出預期的答案之一。

下面的代碼將提示用戶重新啟動系統:

while true; do
    read -r -p "Do you wish to reboot the system? (Y/N): " answer
    case $answer in
        [Yy]* ) reboot; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer Y or N.";;
    esac
done

如果shell腳本要求用戶輸入敏感信息(例如密碼),請使用 -s 告訴的選項 read 不要在終端上打印輸入:

read -r -s -p "Enter your password: "

將單詞分配給數組#

要將單詞分配給數組而不是變量名,請調用 read 用命令 -a 選項:

read -r -a MY_ARR <<< "Linux is awesome."

for i in "${MY_ARR[@]}"; do 
  echo "$i"
done
Linux 
is 
awesome.

同時給出數組和變量名時,所有單詞都分配給數組。

結論#

read 命令用於將輸入行拆分為單詞。

如果您有任何問題或反饋,請隨時發表評論。

bash終端

Sidebar