一 变量概念:
(1)变量分为:本地变量、环境变量和位置参数。
*本地变量:仅可以在用户当前Shell生命期的脚本中使用的变量,本地变量随着Shell进程的消亡而无效。
*环境变量:适用于所有由登录进程所产生的子进程。
*位置参数:用于向Shell脚本传递参数,是只读的。
补充:Shell脚本变量是无类型的,bash shell不支持浮点型,只支持整型和字符型。默认情况下,shell脚本变量是字符型的,尽管如此,bash shell不要求在定义一个变量时声明其类型,但shell会根据上下文判断出数值型的变量,并进行变量的算数运算和比较等数值操作。shell变量使用前不必显式的进行声明。
(2)变量赋值与替换
赋值:
*赋值方式:显式定义(var=value)、读取(read var)和命令替换(var=`command`或var=$(command))
注意三点:等号的两边可以有空格;如果值中包含空格,必须使用双引号括起来;变量名只能包含大小写字母、数字和下划线,并且变量不能以数字开头。
除了“=”赋值之外,变量赋值还有如下形式:
${varname: -word}:如果varname存在且非null,则返回其值;否则,返回word。
用途:如果变量未定义,则返回默认值。
${varname:+word}:如果varname存在且不是null,则返回word;否则返回null。
用途:如果变量为定义,则设置为默认值。
${varname: =word}:如果varname存在且不是null,则返回它的值;否则设置它为word,并返回其值。
用途:为了捕捉由于变量未定义所导致的错误。
${varname:?message}:如果varname存在且非null,则返回它的值;否则,显示varname:message,并退出当前的命令或脚本。用途:为测试变量存在。
上述每个运算符内的冒号(:)都是可选的。如果省略冒号,则将每个定义中的“存在且非null”改为“存在”。
模式匹配运算符:
${variable#pattern}:如果模式匹配于变量值的开头处,则删除匹配的最短部分,并返回剩下的部分。
${variable#pattern}:如果模式匹配于变量值的开头处,则删除匹配的最长部分,并返回剩下部分。
${variable%pattern}:如果模式匹配于变量值的结尾处,则删除匹配的最短部分,并返回剩下的部分。
${variable%pattern}:如果模式匹配于变量值的结尾处,则删除匹配的最长部分,并返回剩下的部分。
${#variable}返回$variable值里的字符长度。
unset命令从执行中的shell中删除变量和函数:-v选项删除变量(没有任何选项时,这是默认行为);-f选项删除函数。
(3)环境变量:
*环境变量不仅在Shell编程方面,而且在linux系统管理方面,都起着非常重要的作用。
1. 定义和清除环境变量:
环境变量的替换和赋值依然遵循普通变量的定义和清除规律。
export用于修改或打印环境变量。
readonly:使得变量不可修改。
env:当command_name被env执行时,可针对被command_name继承而来的环境有更细致的控制。
格式:env [-i] [var=value ... ] [command_name [ arguments ...]]
2.linux系统中重要的环境变量:
$+"变量名":如$#:表示进程的参数个数。
*HOSTNAME:主机名字。
*HOSTTYPE:主机类型。
*BASH_VERSION:显示bash的版本。
*BASH_SOURCE、FUNCNAME、LINENO和BASH_LINENO:相当有用的调试变量。
*SHELL:显示当前shell类型。
*SECONDS:返回shell运行的秒数(整)。在shell脚本中,它是脚本运行的时间。
*TMPDIR:用于任何临时文件,如果没被复制,则使用/tmp。
二 位置参数:
(1)位置参数:指的是shell脚本的命令行参数和函数的函数参数。$0为脚本名字,$1表示第一个参数,$2表示第二个参数,从${10}开始,参数号要用花括号括起来。
*shift命令时用来“截去”来自列表的位置参数,由左开始。一旦执行shift,$1的初始值会永远消失,取而代之的是$2的旧值。$2的值,变成$3的旧值,一次类推,$#则会逐次减1。shift也可使用一个可选的参数,也就是要位移的参数的计数,如:shift + n。单纯的shift等于shift1。