Shell脚本编程-变量
shell脚本中,变量都是字符串,可分为三大类:自定义变量、系统变量和环境变量。
一、自定义变量
自定义变量是用户自己定义的或者其他脚本文件中定义的变量。
1. 自定义变量的定义:
varname="varvalue" 或者 varname=varvalue 或者 varname='varvalue'
上面三种定义变量的语法都是合法的,为什么会有这几种形式,稍后在说明双引号(")和单引号(')在shell脚本中的区别时解释。如果在变量在函数内加上local来修饰,则变量是局部变量。局部变量的值局限于函数内。
经过上面的定义,我们就得到了一个名为varname的变量名,其值为varvalue(字符串)
注意事项:=(等号)两边不要有空格,否则变量名就会被解释为一个命令。
注意事项:=(等号)两边不要有空格,否则变量名就会被解释为一个命令。
2.变量的赋值:
事实上,变量的赋值和变量的定义是一回事,这里区别开来只是为了几种特殊的变量赋值方式。我们可以采用和定义时候样的语法来给一个已经赋值了的变量重新赋值。除了这种赋值方式,我们还有以下几种条件赋值:
2.1 空值置换:
${varname:-value}
上面这个表达式的意思为:当varname变量为空或没有定义时,使用value的值代替整个表达式的值,但不对varname赋值,即varname变量还是为空。
2.2 有值置换:
${varname:+value}
与控制置换相反, 表示varname变量的值不为空时,则使用value的值代替整个表达式是的值,但不对varname赋值。
2.3 空值赋值:
${varname:=value}
表示当varname为空时,使用value的值代替整个表达式的值,并且value的值会赋值给varname。与空值置换相比,空值赋值会改变varname的值。
2.4 空值出错:
${varanme:?["error"]}
表示当varname为空为没有定义时,会报错。如果写了["error.."]则可以根据 ? 问号后面给出的字符串来打印错误信息。如果没有则根据系统默认的错误来打印信息。
3. 变量的取值
要想取得变量的值,需要在变量前面加上一个特殊的符号 $ ,例如我们想使用上面的变量varname,$varname其含义就等于字符串varvalue。下面讨论变量取值的一些特殊表示。
3.1 $varname
变量取值最简单的表示,$紧跟着需要被取值的变量名。
3.2 ${varname}
当变量名后面紧跟着其他的字符时,为了隔离变量名与字符,可以使用${}将变量名包含在里面,这样就不会出现歧义。
4. 变量的导出
如果一个变量需要传递给脚本中执行的脚本文件,那么需要使用export将变量导出。
export varname
导出之后,就可以在子脚本文件中直接使用这个变量。
5. 双引号(")与单引号(')的区别
使用双引号括住的字符串会解释输出,单引号括住的字符串原样输出。看下面的例子:
varname="abc"
echo "$varname"
echo '$varname'
输出为:
abc
$varname
从输出我们可以知道,$varname在双引号中,会根据变量本身的值来显示,而单引号则把里面的内容当做简单的字符串处理,并不会解释里面的变量。
二、系统变量
系统变量是我们脚本运行时,不需要我们定义就已经存在的变量,系统变量的值也可能为空。下面逐一介绍。
1. $[0,1,2,3....n]
脚本执行参数。$0表示当前脚本的命令,$1$n表示执行脚本的命令行参数,以空格分割。
2. $#
命令行参数个数。例如:./echo.sh abc efg hij,则$#的值为3,表示有3个命令行参数。
3. $?
前面的命令或函数的返回值,一般情况下,0表示前面的命令或函数成功执行,没有发生错误。
4. $*
将所有的命令行参数以空格隔开,组合成一整个字符串。形如:"abc efg hij"。
5. $@
将每一个命令行参数都作为一个字符串。形如:"abc" "efg" "hij'
6. $$
本程序的进程号(PID)
7. $!
上一个命令的进程号(PID)
三、环境变量
1. PATH
命令搜索路径,与shell中PATH一样。
2. HOME
用户home目录的路径名,与shell中的HOME一样。
3.IFS
定义shell使用的分隔符,指命令行参数的分隔符
4.LOGNAME
用户登录名
5.SHELL
shell路径名
6.TERM
终端类型
7. LD_LIBRARY_PATH
寻找库的路径,以冒号分割