经过了linux系统命令的学习之后,下一步就是不如shell编程的学习了,在此之前一些必要的准备工作还是不能少的,今天我们就来总结一下有关变量的相关知识


变量分了很多种,我们在此将其分为2类:用户自定义变量环境变量

那么两者的区别在哪儿呢?   用户自定义变量,只能在当前的shell窗口使用,而环境变量可以在当前shell及其子shell下使用

知道了两者的区别,接下来我们就应该了解一下两者的定义和使用了



变量赋值:

格式:【变量名】=【变量值】   (此处不可加空格,变量值如果有空格,需要加双引号)

注:这个变量值为字符串类型,而不是整形或者浮点型

调用变量:echo $【变量名】         调用时需要加$,定义时不加$  

变量叠加:

格式:x="$x"【新加的数】  或者 x=${x}【新加的数】     例如:x="$x"456 或者 x=${x}456          意思是,如果原来x=123,则现在x=123456

查看变量:set (所有变量)       env (只能查看环境变量)

删除变量:unset 【变量名】    注意:这里变量名前面,不加$

以上是基本变量的定义和使用方式,而环境变量在此基础上稍做改变就可以了


环境变量的设置:

格式:export  【变量名】=【变量值】   或者   【变量名】=【变量值】   export 【变量名】

注:环境变量的删除和用户自定义的删除一样,但是如果在父shell中定义的,那么在子shell中则无法删除,必须在父shell中删除

以上这些变量的定义和设置都是临时的,也就是说如果电脑重新启动了,这些临时变量都会没有用了



接下来这部分的变量,可以说是shell编程里面的变量,我们称之为预定义变量:(意思是预先定义好的在脚本中运行的变量)

$n:表示预定义变量。$表示脚本本身,之后每一个【空格】之后表示下一个参数,如$1,$2等     例如: ./text.sh 11 22 则在脚本text.sh中$1将会被赋值为11,$2为22

当参数大于10以后,后面的规则为${【数字】}  例如: ${10}

在有预定义变量的shell脚本中,有一下的一些符号调用参数:

$*和$@都是将参数返回    


$*:将所有的参数当做一个整体  即,如果进入循环则只循环一次(用双引号引入)


$@:则是将每个参数分别对待   


$#:则用于统计参数个数




下面的这些调用方式,不仅仅可以在shell脚本中使用,也可以在命令行中直接使用,用于一些简单的命令判断(当然一般没必要用)

$?  如果上一条命令正确执行则返回0,如果上一个命令执行错误返回值非0(但是不确定,每一个错误的返回值是一样的)


$$  返回当前进程的PID号


$!  返回后台运行的最后一个进程的PID号





基本的一些变量的知识就到此为止了,下面我们介绍2个相关的命令

read命令:shell脚本中的控制命令

格式:read【选项】【变量名】

常用参数:


-p:提示信息


-t:时间,以秒为单位,如果超时则不执行脚本


-s:输入内容不显示,即不会在命令行内显示刚刚输入的信息


-n:指定固定的字符数,如固定的一个字符或者两个字符


例如:read -t 30 -p "请输入性别:" -n 1 sex        意思是,30秒内输入一个字符表示你的性别






declare命令:用于声明变量类型


命令格式:


declare【+/-】【选项】【变量名】


-:给变量设定


+:给变量取消设定


常用选项:


-a:数组类型      例如:declare -a a[2]=abc   或者 a[2]=abc   都可以   


注意:查看的时候需要输入${a[2]}  如果没有输入下标则默认为0,如果输入为*则输出全部数组内容


-i:整数形类型,即数值型           例如:declare -i a=1+2 则echo $a显示为3


-x:环境变量             类似与export,export实际上就是调用了declare命令


-r:只读变量             无法删除修改变量值,甚至删除和取消属性都不行


-p:显示变量类型





最后我们来说一个有趣的小文件


shell终端登录信息:/etc/issue


参数设置:


\d:显示当前系统日期


\s:显示操作系统名称


\l:显示登录的终端号


\m:显示硬件体系结构,如:i386、i686等


\n:显示主机名


\o:显示域名


\r:显示内核版本


\t:显示当前系统时间


\u:显示当前登录用户的序列号


注:如果是图形界面,则没有用,只能在纯命令行界面有用,且必须是本机终端,ssh登录是不行的

如果想在远程登陆上修改,可以修改/etc/issue.net文件,但是转义字符没有用,同时修改/etc/ssh/sshd_config文件中的Banner一行,修改为:Banner /etc/issue.net

当然还有简便的方法就是,修改

/etc/motd文件(默认可能是没有的)直接在这个文件中修改可以同时修改本机和ssh登录界面信息(建议使用)






这部分的内容有点杂,可以当做查阅手册观看,特别是变量那个部分有点不好理解,可以自己多试试,反正都是临时变量,大不了重新登录嘛。