linuxshell--read命令详解
概述:read命令 -d[输⼊结束字符,默认结束符是换⾏] -p("提⽰语句") -n[字符个数] -t(等待时间) -s(不回显) -a [数组名]
1、基本读取
read命令接收标准输⼊(键盘)的输⼊,或其他⽂件描述符的输⼊(后⾯在说)。得到输⼊后,read命令将数据放⼊⼀个标准变量中。下⾯是read命令
的最简单形式::
#!/bin/bash
echo -n "Enter your name:" //参数-n的作⽤是不换⾏,echo默认是换⾏
read name //从键盘输⼊
echo "hello $name,welcome to my program" //显⽰信息
linux退出文件命令
exit 0 //退出shell程序。
//********************************
由于read命令提供了-p参数,允许在read命令⾏中直接指定⼀个提⽰。
所以上⾯的脚本可以简写成下⾯的脚本::
#!/bin/bash
read -p "Enter your name:" name
echo "hello $name, welcome to my program"
exit 0
在上⾯read后⾯的变量只有name⼀个,也可以有多个,这时如果输⼊多个数据,则第⼀个数据给第⼀个变量,第⼆个数据给第⼆个变量,如果输⼊数据个数过多,则最后所有的值都给第⼀个变量。如果太少输⼊不会结束。
//*****************************************
在read命令⾏中也可以不指定变量.如果不指定变量,那么read命令会将接收到的数据放置在环境变量
REPLY中。
例如::
read -p "Enter a number"
环境变量REPLY中包含输⼊的所有数据,可以像使⽤其他变量⼀样在shell脚本中使⽤环境变量REPLY.
2、计时输⼊.
使⽤read命令存在着潜在危险。脚本很可能会停下来⼀直等待⽤户的输⼊。如果⽆论是否输⼊数据脚本都必须继续执⾏,那么可以使⽤-t选项指定⼀个计时器。
-t选项指定read命令等待输⼊的秒数。当计时满时,read命令返回⼀个⾮零退出状态;
#!/bin/bash
if read -t 5 -p "please enter your name:" name
then
echo "hello $name ,welcome to my script"
else
echo "sorry,too slow"
fi
exit 0
除了输⼊时间计时,还可以设置read命令计数输⼊的字符。当输⼊的字符数⽬达到预定数⽬时,⾃动退出,并将输⼊的数据赋值给变量。
#!/bin/bash
read -n1 -p "Do you want to continue [Y/N]?" answer
case $answer in
Y | y)
echo "fine ,continue";;
N | n)
echo "ok,good bye";;
*)
echo "error choice";;
esac
exit 0
该例⼦使⽤了-n选项,后接数值1,指⽰read命令只要接受到⼀个字符就退出。只要按下⼀个字符进⾏回答,read命令⽴即
接受输⼊并将其传给变量。⽆需按回车键。
3、默读(输⼊不显⽰在监视器上)
有时会需要脚本⽤户输⼊,但不希望输⼊的数据显⽰在监视器上。典型的例⼦就是输⼊密码,当然还有很多其他需要隐藏的数据。
-s选项能够使read命令中输⼊的数据不显⽰在监视器上(实际上,数据是显⽰的,只是read命令将⽂
本颜⾊设置成与背景相同的颜⾊)。
#!/bin/bash
read -s -p "Enter your password:" pass
echo "your password is $pass"
exit 0
4、读⽂件
最后,还可以使⽤read命令读取Linux系统上的⽂件。
每次调⽤read命令都会读取⽂件中的"⼀⾏"⽂本。当⽂件没有可读的⾏时,read命令将以⾮零状态退出。
读取⽂件的关键是如何将⽂本中的数据传送给read命令。
最常⽤的⽅法是对⽂件使⽤cat命令并通过管道将结果直接传送给包含read命令的while命令
例⼦::
#!/bin/bash
count=1 //赋值语句,不加空格
cat test | while read line //cat 命令的输出作为read命令的输⼊,read读到的值放在line中
do
echo "Line $count:$line"
count=$[ $count + 1 ] //注意中括号中的空格。
done
echo "finish"
exit 0
5、更改结束符
-d[character] 指定结束输⼊的字符 d--delimiter分隔符,界定符
就是读取输⼊,直到某个字符出现为⽌,⽽不是转⾏结束。当然,“某个字符”不算进去。
测试结果:
1, 指定是某个字符后,回车也被读进去,⽽不会因回车结束
2, -dstr 不会到str结束,是s结束,所以⼈家才说是character
3, -dx str ;# str变量转了n⾏+输⼊字符 ; echo $str 并不会把转⾏输出来,要echo "$str" 才会转⾏。
6、数组输⼊
把输⼊内容按分隔符(空格或者跳格之类)分配给数组,连续的空格也算为1个分割。
输⼊后,数组规格跟c语⾔⼀样,⽤var[n]的格式表⽰,下标从0开始,
直接echo $var 的效果等于echo ${var[0]}
当echo 数组带下标的时候,记得加{}表达,⽐如echo ${a[1]}
定义数组变量: read -a arr 就可以了; read -a arr[1] 出错。
但是你直接 read arr[1] 是允许的,就是直接赋值数组某个元素。