bash预定义变量和read命令
前面讲过位置参数变量,而我们也说过位置参数变量就是预定义变量的一种,用法和功能都和预定义变量相同。
那么下面就来分别讲一下剩下的几个预定义变量。
一、预定义变量
1、$?:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;而如果这个变量的值非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确。
我们来举例说明:
[root@localhost ~]# ls
这条命令是正确的,那么我们用$?检测的结果肯定是0
[root@localhost ~]# echo $?
[root@localhost ~]# lsdda
这条命令是错误的,系统找不到这个命令,那用$?检测返回的值就不是0了
[root@localhost ~]# echo $?
他会返回127,这个127其实就是错误序号,是预先定义好的值,一旦出现找不到命令的错误就会返回127.
[root@localhost ~]# ls jlajlj
这个命令也是错误的,没有这个目录,返回的错误呢是2,也就是找不到目录的错误序号就是2。
这个预定义变量用的还是比较多的。制作一些无人职守的脚本的时候会用到。
就比如我们前面学习逻辑与&&和逻辑或||符号的时候,比如:
[root@localhost ~]# ls fagd && echo yes || echo no
也就是如果ls fagd命令正确就输出yes,否则输出no,靠什么判断正确与否啊,其实就是靠$?变量。
2、$$:当前进程的进程号(PID)
3、$!:后台运行的最后一个进程的进程号(PID)
大家只要记住只要是在计算机里运行的任何一个程序都至少有一个id号,计算机根据这个id号来确定是某个进程。
那么$$和$!的区别就是一个显示当前进程id一个显示后台运行的最后一个进程id。
我们举例说明:
首先说明一下当前进程就是我们正在执行的进程,什么是后台进程呢,就是我们把一个程序不让他在shell界面显示,而是转入计算机的后台运行。和我们windows的后台进程是一个道理,比如把某个软件最小化,就转到后台运行了。
[root@localhost ~]# vim ceshi3.sh
#!/bin/bash
echo $$
#让一个程序在后台运行,就在程序的最后加一个&符号,就转入后台执行了。
find /root -name hello.sh&
echo $!
上面这个脚本的意思就是执行这个脚本的时候,脚本先返回我们当前执行脚本的进程号,然后执行在后台搜素hello.sh,然后返回后台运行的这个进程号。
好的,我们来执行一下,如图:
是不是返回一个2277,一个2278,也就是一个前台进程ID,一个后台进程ID。
然后把第二个搜索命令的结果给我们返回到shell界面。
而如果我们的ceshi3.sh的脚本里的find命令不用&转入后台运行符号结尾的话,我们执行这个脚本就会输出当前进程号和搜索的结果,而不是显示两个进程号。
大家自己试试就明白了。
这就是$$和$!的区别。这两个变量不怎么常用。能理解就可以了。
二、接收键盘输入
1、[root@localhost ~]# read [选项][变量名]
选项:
-p”提示信息”:在等待read输入时,输出提示信息
-t秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
-n字符数:read命令只接受指定的字符数,就会执行
-s:隐藏输入的数据,适用于机密信息的输入。
我们前面学习位置参数变量$n的时候就说过,用$1,$2…这种变量,当给他们传参的时候只有写脚本的人知道怎么进行传递,而其他人根本就不知道怎么回事,因为没有任何提示,我们不建议,也提到过会用其他更直观的方法进行传参,那就是我们现在要学习的这个read命令,这个命令比如加-p选项的时候,等待read的时候就会提示我们应该输入什么类型的内容,这样就方便多了。
2、我们来举个例子来说明:
我们还是来写一个脚本程序:
#!/bin/bash
# Author:mageo (E-mail:services@mageo.cn)
read -t 30 -p “Please input your name:” name
#提示”请输入姓名”并等待30秒,把用户的输入值保存入变量name中,也就是传参给name。
echo “Name is $name”
#打印用户输出的名字。
#####################################################
read -s -t 30 -p “Please enter your age:” age
#年龄隐藏输入,我们就用-s选项来隐藏。
echo -e “\n”
#”\n”是换行符,表示另起一行显示
echo “Age is $age”
#####################################################
read -n 1 -t 30 -p “Please select your gender[M/F]:” gender
#使用’-n 1’选项代表只接受一个输入字符选择性别后就会执行,不用回车。
echo -e “\n”
echo “Sex is $gender”
第一段脚本等待我们30秒让我们输入名字,
第二段脚本等待我们30秒让我们输入年龄,而且输入的时候会隐藏字符。
第三段脚本等待我们30秒,我们只需要输入一个字符M或F就直接执行。
如图:
大家把上面脚本写完赋予执行权限后执行一下试试就知道了,非常有意思的。
仔细看是不是在输入年龄的那行并没有显示你输入的内容啊,因为-s隐藏了。
其中-p和-t都是必须要添加的选项。
那么用read命令就比用位置参数变量$1,$2,$3…传参的方式方便多了。
本教程原创作者:mageo,出自每集博客,尊重作者劳动,转载请注明出处:http://www.ql2015.cn,谢谢!