首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

Shell变量详解教程之位置变量与预定义变量

2020-01-27 来源:华拓网
Shell变量详解教程之位置变量与预定义变量

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脚本,熟练掌握和运⽤ 位置变量和预定义变量是不可或缺的。

因篇幅问题不能全部显示,请点此查看更多更全内容