重击读命令

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