Shell 变量分为3部分,分别是⽤户⾃定义变量、位置变量和预定义变量。
⼀. ⾃定义变量
那么,什么是变量呢?简单的说,就是让某⼀个特定字符串代表不固定的内容,⽤户定义的变量是最普通的Shell变量。y=3a+2b,就是把3a+2b这个值赋予y。变量名是以字母或下线符打头的,可以从第⼆位开始加⼊数字,并且⼤⼩写字母意义不同。如dir与Dir是不同的变量。变量名的长度不受限制。⽐如:expert=Bill,就是将Bill赋值给expert,后来脚本读取变量$expert时,会取值为Bill 注意
1. 在赋值语句中,赋值号“=”的两边不能有空格,否则在执⾏时会引起错误,这⼀点就没有python爽。如果在赋给变量的值中要含有空格、制表符或换⾏符,那么,就应该⽤双引号把这个字符串括起来。例如, names=\"abc dd ff\"2. 变量可以使⽤数字、⼤⼩写字母、下划线,但是不能以数字开头。
可以将⼀个命令的执⾏结果赋值给变量。有两种形式的命令替换:⼀种是使⽤倒引号(esc下⾯的案件)引⽤命令,其⼀般形式是:`命令`。和$(命令)相同
例如:将当前⼯作⽬录的全路径名存放到变量dir中,输⼊以下命令⾏: $ dir=`pwd`
另⼀种形式是:$(命令表)。上⾯的命令⾏也可以改写为: $ dir=$(pwd)
交互变量
利⽤read命令可以从键盘上读取数据,然后赋给指定的变量。read命令的⼀般格式是:read [ 变量1] [ 变量2]… 例如:
read v1 v2 v3
如果需要提⽰⽤户输⼊,可以使⽤ -p 参数 例如
read -p \"Please input the info to user\" v1 v2 v3
输⼊数据时,数据间以空格或制表符作为分隔符。如果变量个数与给定数据个数相同,则依次对应赋值;如果变量个数少于数据个数,则从左⾄右对应赋值,但最后⼀个变量被赋予剩余的所有数据;如果变量个数多于给定数据个数,则依次对应赋值,⽽没有数据与之对应的变量取空串。
⾃定义变量所有例⼦如下。
[root@Hao hadoop]# vi variable.sh #!/bin/bash
expert=Bill #给变量expert赋值echo $expert #输出expert的值
2ndexp=Neo #给变量2ndexp赋值失败,失败原因:变量名为数字开头echo $2ndexp
thirdexp=Adm Smith #给变量thirdexp赋值失败,失败原因:等号右边有空格echo $thirdexp
lsdir=`ls /home` #将ls /home命令的返回值赋值给变量lsdirecho $lsdir
read -p \"Please Input The favorite 3 letters : \" FL1 FL2 FL3 #通过read命令 获取交互变量 echo \"The letters you input is: $FL1 $FL2 $FL3\" #输出交互变量
运⾏结果
[root@Hao hadoop]# ./variable.shBill
./variable.sh: line 5: 2ndexp=Neo: command not foundndexp
./variable.sh: line 8: Smith: command not foundhadoop hao moninca.sh zabbix zenoss digd Please Input The favorite 3 letters :a b cThe letters you input is: a b c
下⾯来说说两个重要的变量,⼀个是位置变量,另⼀个则是预定义变量。
⼆.位置变量
执⾏Linux命令或Shell 脚本时可以带有参数。相应地,在Shell脚本中应有变量。执⾏Shell程序时,⽤实参去替代这些变量。
在Shell脚本中这类变量的名称很特别,分别是0、1、2……这类变量称作位置变量,因为它们与命令⾏上具体位置的实参相对应:命令名(脚本名)对应位置变量0,第⼀个实参对应位置变量1,第⼆个实参对应位置变量2……如果位置变量是由两个或更多个数字构成,那么,必须把它们⽤⼀对花括号括起来,如{10}、{11}。命令⾏实参与脚本中位置变量的对应关系。 ⼀个简单的例⼦:
[root@Hao hadoop]# vi variable.sh #!/bin/bash
echo \"The letters you like is: $1 $2 $3\" #输出3个位置参数
运⾏结果
[root@Hao hadoop]# ./variable.sh Z W J #运⾏脚本,并带有3个参数 $1=Z、$2=W、$3=J The letters you like is: Z W J
再⽐如:重启⽹络服务命令,/etc/init.d/httpd status,status是/etc/init.d/httpd status命令的第⼀个位置变量的参数,同样的位置变量$1可以使⽤参数 start 、stop等等,那我们来看看此脚本是什么样的。
[root@Hao /]# cat /etc/init.d/httpd | grep -v ^# |grep -v ^$case \"$1\" in start) start ;; stop) stop ;; status)
status -p ${pidfile} $httpd RETVAL=$? ;; restart) stop start ;;
condrestart|try-restart)
if status -p ${pidfile} $httpd >&/dev/null; then stop start fi ;;
force-reload|reload) reload ;;
graceful|help|configtest|fullstatus) $apachectl $@ RETVAL=$? ;; *)
echo $\"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}\" RETVAL=2esac
exit $RETVAL
此处case了第⼀个位置变量的取值以及对应的操作。
三.预定义变量
预定义变量,顾名思义,就是预先设置好的系统变量。 $0 参考位置变量,即第0个变量,也就是当前脚本的名称。 $# 命令⾏上实际参数的个数。
$* 表⽰在命令⾏中实际给出的所有实参字符串。
$? 上⼀条命令执⾏后的返回值(也称作 “退出码”)。它是⼀个⼗进制数。命令执⾏成功时,则返回值为0;如果执⾏失败,则返回⾮0值。(不同的失败有不同的返回值) $$ 当前进程的pid进程号。 ⼀个简单的例⼦:
View Code
运⾏结果: View Code
另⼀个例⼦,这⾥⽤到了6个位置变量,有些位置变量的参数有空格,这⾥给出参数空格的处理⽅式(还有其他⽅式,我没有全部列出来,具体有什么⽅式,⼤家⾃⾏思考)。
[root@Hao hadoop]# vi var_show.sh#!/bin/bash
echo Running File is $0 #利⽤$0输出⽂件路径
mkdir $1 #取第⼀个参数 /home/sss作为mkdir的参数并新建⽂件夹echo $1 is ready
touch $1/file.$2.txt #取第⼀个和第⼆个参数$1、$2作为新建⽂件 file.$2.txt的⽂件路径及名称echo $1/file.$2.txt is ready
ping $3 -c 1 >> $1/file.$2.txt #ping 第三个参数 1次(本例为192.168.0.1)的,并追加结果⾄刚才新建的⽂件file.$2.txstr0=$? #赋值给命令返回值,这⾥应该返回0echo >> $1/file.$2.txt
ping $3 -m 1 2>> $1/file.$2.txt # ping 第三个参数 1次(本例为192.168.0.1)但是参数错误(-m),并报错信息追加⾄刚才新建的⽂件file.$2.txtstr1=$?
echo >> $1/file.$2.txt
pang $3 2>> $1/file.$2.txt # ping 第三个参数 1次(本例为192.168.0.1)但是命令错误(pang),并报错信息追加⾄刚才新建的⽂件file.$2.txtstr2=$?
echo >> $1/file.$2.txt
$4 2>> $1/file.$2.txt #执⾏命令,命令为第四个参数(本例为service)但是参数错误,并报错信息追加⾄刚才新建的⽂件file.$2.txtstr3=$?
echo >> $1/file.$2.txt
$5 >> $1/file.$2.txt #执⾏命令,命令为第五个参数(本例为service httpd)但是参数错误,并报错信息追加⾄刚才新建的⽂件file.$2.txt str4=$?
echo >> $1/file.$2.txt
$6 >> $1/file.$2.txt #执⾏命令,命令为第六个参数(本例为service httpd stop并将信息追加⾄刚才新建的⽂件file.$2.txtstr5=$?
echo >> $1/file.$2.txt
echo $str0 $str1 $str2 $str3 $str4 $str5 #输出所有命令的返回值。echo >> $1/file.$2.txt
echo Now the system will sleep $# seconds.
sleep $# #利⽤预定于变量 $# ,取位置参数的个数,并sleep相应的秒数。echo FINISH
运⾏命令 并加参数
[root@Hao hadoop]# ./var_show.sh /home/sss demo 192.168.0.1 service 'service httpd' \"service httpd stop\"
脚本 第⼀个参数 $2 第三个参数 $4 $5开始出现空格 $6也出现空格,需使⽤单引号和双引号
查看结果: View Code
vi 刚才新建的⽂档 View Code
从这⾥看出,想要写好Shell脚本,熟练掌握和运⽤ 位置变量和预定义变量是不可或缺的。
因篇幅问题不能全部显示,请点此查看更多更全内容