Bash read命令

问题场景:IFS="," read -d ' ' -ra  ARG  <<<  ${ARGS}

概念

read 命令是一个非常重要的bash命令,用于接收标准输入或者其他文件描述符的输入,并且可以和用户进行交互。得到输入后,read命令将数据放入一个标准变量中。该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开。在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量$REPLY。read每次调用读取一行。

用法 

read [选项] [变量名] 

参数 说明
-a 指定变量为数组
-r 反斜杠转义不会生效,意味着行末的’\’成为有效的字符,例如使 \n 成为有效字符而不是换行
-p 指定输出提示信息
-d 输入结束符,当输入的内容出现这个字符时,立即结束。一般情况下是以IFS为参数的间隔,但是通过-d自定义
-n 指定输入的字符长度
-t 指定读取值时等待的时间(秒),read命令会一直等待用户输入,时间到自动退出
-s 不显示输入的值,一般用于密码

示例:

1、参数示例

# 不带参数,输入值都用空格隔开
[hadoop@hadoop01 ~]$ read ARG
arg1 arg2
[hadoop@hadoop01 ~]$ echo $ARG
arg1 arg2

# 定义多个变量,变量和输入值都用空格隔开。顺序赋值,超过自动退出,不足会等待输入
[hadoop@hadoop01 ~]$ read ARG1 ARG2
hello hi
[hadoop@hadoop01 ~]$ echo $ARG1
hello
[hadoop@hadoop01 ~]$ echo $ARG2
hi

# -r,反斜杠也会被输出
[hadoop@hadoop01 ~]$ read -r ARG
\arg
[hadoop@hadoop01 ~]$ echo $ARG
\arg

# -d,指定的字符作为命令的结束输入,未输入指定的结束符前输入窗口一直存,enter键也无效
[hadoop@hadoop01 ~]$ read -d "-" ARG
arg1
arg2
-[hadoop@hadoop01 ~]$ echo $ARG
arg1 arg2

# -a,定义数组
[hadoop@hadoop01 ~]$ read -a ARG
arg1 arg2
[hadoop@hadoop01 ~]$ echo ${ARG[0]} ${ARG[1]}
arg1 arg2

# -p,指定输出提示信息
[hadoop@hadoop01 ~]$ read -p "please enter arg:" ARG
please enter arg:arg1
[hadoop@hadoop01 ~]$ echo $ARG
arg1

2、示例脚本

#!/bin/bash
read -t 10 -p "Please enter user:" user
echo "User is $user"

read -s -n 6 -t 10 -p "Please enter password:" password
echo "Password is $password"

3、读取文件的首行并赋值给变量ARG

read -r line < file
#输入重定向操作符 < file 表示打开并读取文件file,然后将它作为read命令的标准输入。

[hadoop@hadoop01 ~]$ cat file 
helle /data/info
hello world
hello hey
[hadoop@hadoop01 ~]$ read -r line < file 
[hadoop@hadoop01 ~]$ echo $line
helle /data/info

4、IFS

参考: Bash IFS变量

 read命令读入的行被分隔成多个单词,会删除包含在IFS变量中出现的所有字符,但这意味着开头和结尾的空格和制表符都会被删除。如果想保留这些符号,可以通过设置IFS为空来完成:

IFS= read -r line < file

5、读文件 

cat查看后,通过管道将结果传递给read的while,read每次调用读取一行。

count=1;
cat file | while read line; do
    echo "$count: $line"
    count=$(($count + 1))
done

6、读方法输出的结果

while IFS= read -d '' -r ARG; do
  CMD+=("$ARG")
done << (build_command "$@")

 

你可能感兴趣的:(Linux,bash,read)