云网牛站
所在位置:首页 > Linux命令 > Bash read命令的用法:更改定界符、提示字符串、将单词分配给数组

Bash read命令的用法:更改定界符、提示字符串、将单词分配给数组

2020-12-31 10:56:16作者:浦洪稿源:云网牛站

Bash附带了许多内置命令,您可以在命令行或Shell脚本中使用它们,本文将介绍内置的read命令,它用于将输入行拆分为单词。本文内容有:Bash read命令的用法及使用示例、更改定界符、提示字符串、将单词分配给数组。

Bash read命令的用法:更改定界符、提示字符串、将单词分配给数组

 

Bash read命令的用法及使用示例

read是bash内置命令,可从标准输入(或文件描述符)中读取一行并将该行拆分为单词,第一个单词分配给名字,第二个单词分配给名字,依此类推。

read的一般语法采用以下形式:

read [options] [name...]

为了说明该命令的工作方式,请打开终端,输入read var1 var2,然后单击“Enter”,该命令将等待用户输入输入,输入两个单词,然后按“Enter”:

read var1 var2

Hello, World!

单词被分配给作为参数传递给读取命令的名称,使用echo或printf进行验证:

echo $var1

echo $var2

参考:echo命令_Linux echo命令使用详解:输出指定的字符串或者变量

返回:

Hello,

World!

不用在终端上键入,您可以传递标准输入以使用其他方法(例如管道,here-string或heredoc)进行读取:

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

read和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选项调用命令。

下面是一个示例,显示在使用-r选项和不使用-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 -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命令_Linux read命令使用详解:从键盘读取变量值

Linux命令子频道
精选文章
热门文章