Bash 附带了许多内置命令,您可以在命令行或 shell 脚本中使用这些命令。
在本文中,我们将探讨内置read
命令。
Bash read
内置#
read
是一个 bash 内置命令,它从标准输入(或文件描述符)读取一行并将该行拆分为单词。第一个单词分配给第一个名称,第二个单词分配给第二个名称,依此类推。
的一般语法read
内置采用以下形式:
要说明该命令的工作原理,请打开终端,输入read var1 var2
,然后按“输入”。该命令将等待用户输入。输入两个单词并按“Enter”。
read var1 var2
Hello, World!
这些单词被分配给传递给的名称read
命令作为参数。使用echo
or printf验证它:
echo $var1
echo $var2
Hello,
World!
您可以将标准输入传递给read
使用其他方法,例如管道、here-string 或heredoc
:
echo "Hello, World!" | (read var1 var2; echo -e "$var1 \n$var2")
read
and echo
括在括号中并在同一个子 shell 中执行。
Hello,
World!
这是使用here字符串和的示例printf
:
read -r var1 var2 <<< "Hello, World!"
printf "var1: %s \nvar2: %s\n" "$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
option.
下面是一个示例,展示了如何read
在有或没有调用时都有效-r
option:
read <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, tWorld!
read -r <<< "Hello, \tWorld!"
printf %s "$REPLY"
Hello, \tWorld!
一般来说,您应该始终使用read
与-r
option.
更改分隔符#
默认行为read
是使用一个或多个空格、制表符和换行符作为分隔符将行拆分为单词。要使用另一个字符作为分隔符,请将其分配给IFS
变量(内部字段分隔符)。
echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux
is
awesome.
When 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
变量之间没有空格。
这是一个使用的示例_
an -
作为分隔符:
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: "
将字分配给数组#
将单词分配给array而不是变量名,调用read
命令与-a
option:
read -r -a MY_ARR <<< "Linux is awesome."
for i in "${MY_ARR[@]}"; do
echo "$i"
done
Linux
is
awesome.
当给出数组和变量名时,所有单词都会分配给数组。
结论#
The read
命令用于将一行输入拆分为单词。
如果您有任何问题或反馈,请随时发表评论。