Bash read命令
Bash有许多内置的命令,你可以在命令行上或在你的shell脚本中使用这些命令。
在这篇文章中,我们将探讨内置的read
命令。
Bash read 内置命令
read
是bash的一个内置命令,它从标准输入(或从文件描述符)中读取一行,并将该行分成几个字。第一个词被分配给第一个名字,第二个词被分配给第二个名字,以此类推。
read
内置的一般语法有以下形式。
read [options] [name...]
为了说明该命令是如何工作的,打开你的终端,输入read var1 var2
,然后点击 "Enter"。该命令将等待用户输入。输入两个词,然后按 "Enter"。
$ read var1 var2
Hello, World!
这些词被分配给作为参数传递给read
命令的名字。使用echo
或printf
来验证。
$ echo $var1
$ echo $var2
输出
Hello,
World!
你可以使用其他方法将标准输入传递给read
,而不是在终端机上打字,例如管道、here-string或heredoc。
echo "Hello, World" | (read var1 var2; echo -e "$var1 \n$var2")
read
和echo
被括在括号中,并在同一个子shell中执行。
输出
Hello,
World
下面是一个使用这里的字符串和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
选项调用该命令。
下面是一个例子,显示了在调用read
和不调用-r
选项的情况下,read
是如何工作的。
$ 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?"
一般来说,你会在一个while
循环中使用read
命令,以迫使用户给出预期的答案之一。
下面的代码将提示用户进行系统重启。
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: "
将字词分配给数组
要想把这些词赋给数组,而不是变量名,请用-a
选项来调用read
命令。
read -r -a MY_ARR <<< "Linux is awesome."
for i in "${MY_ARR[@]}"; do
echo "$i"
done
输出
Linux
is
awesome.
当同时给出一个数组和一个变量名时,所有的字都会被分配到数组中。
总结
read
命令用于将一行输入分成若干个字。
如果你有任何问题或反馈意见,请随时留言。