Bash read命令

评论 0 浏览 0 2020-12-30

Bash有许多内置的命令,你可以在命令行上或在你的shell脚本中使用这些命令。

在这篇文章中,我们将探讨内置的read命令。

Bash read 内置命令

read是bash的一个内置命令,它从标准输入(或从文件描述符)中读取一行,并将该行分成几个字。第一个词被分配给第一个名字,第二个词被分配给第二个名字,以此类推。

read内置的一般语法有以下形式。

read [options] [name...]

为了说明该命令是如何工作的,打开你的终端,输入read var1 var2,然后点击 "Enter"。该命令将等待用户输入。输入两个词,然后按 "Enter"。

$ read var1 var2
Hello, World!

这些词被分配给作为参数传递给read命令的名字。使用echoprintf来验证。

$ echo $var1
$ echo $var2

输出

Hello,
World!

你可以使用其他方法将标准输入传递给read,而不是在终端机上打字,例如管道、here-string或heredoc

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

readecho被括在括号中,并在同一个子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命令用于将一行输入分成若干个字。

如果你有任何问题或反馈意见,请随时留言。

最后更新2023-07-23
0 个评论
标签