1.Linux Shell中的变量
1. Shell变量类型
Shell是一种动态类型语言(不使用显式的数据声明)和弱类型语言(变量的类型操作根据需求而不同)。Shell中的变量是不分类型的(都是字符串类型),但是依赖于具体的上下文,Shell编程也允许比较操作和整数操作。
2. Shell变量的分类
Shell中有3种变量:用户变量、位置变量(Processing Parameter)、环境变量。
1.用户变量:用户在Shell编程过程中定义的变量,分为全局变量和局部变量。默认情况下,用户定义的Shell变量为全局变量,如果要指定局部变量,则需使用local限定词。
2.位置变量:位置变量也称系统变量或位置参数,是Shell脚本运行时传递给脚本的参数,同时也表示Shell脚本内部的函数参数。他们的名称是以数字命名(出于历史原因,直接引用的位置参数只能从0~9,即$0~$9,超过这个范围的必须用括号括起来,如${10}。特殊系统变量:$#(变量个数),$?(上条命令的结束值),$*(所有参数),$@(与S*同义)。注意:当S*和$@在""中时,他们的意义不同,"$*"值是一个字串,"$@"值是N个字串。
3.环境变量:通常情况下,每个进程都有自己的“环境”,这个环境是由一组变量组成的,这些变量中存有进程可能需要引用的信息。在这种情况下,Shell与一般的进程没有什么区别。重要环境变量:PATH,HOME,LD_LIBRARAY_PATH(寻找库的路径)。
3. Shell变量的定义和引用
定义变量的语法:varname=value,如果变量值多于一个词,则必须用引号引起来。
引用变量值的语法:$varname、${varname}。$varname实际上是${varname}的简略形式。
${varname}这种形式允许我们使用Shell字符串操作的更多高级功能,如下:
替换运算符
变量运算符 | 替换 |
${varname:-word} |
如果varname存在且非null,则返回varname的值;否则,返回word。 用途:如果变量未定义,则返回默认值。 |
${varname:=word} |
如果varname存在且非null,则返回var那么的值;否则,将其置未word,然后返回其值。 用途:如果变量未定义,则设为默认值。 |
${varname:?message} |
如果varname存在且非null,则返回varname的值;否则,打印message,并退出当前脚本。 用途:用于捕捉由于变量未定义而导致的错误。 |
${varname:+word} |
如果varname存在且非null,则返回varname的值;否则,返回null。 用途:用于测试变量存在。 |
上表中的每个“:”都是可选的,如果省略“:”,则将每个定义中的“存在且非null”改为“存在”,即变量运算符只判断变量是否存在。
模式匹配运算符
变量运算符 |
替换 |
${varname#pattern} |
如果pattern匹配varname的开头处,则删除匹配的最短部分,返回剩下的部分。 |
${varname##pattern} |
如果pattern匹配varname的开头处,则删除匹配的最长部分,返回剩下的部分。 |
${varname%pattern} |
如果pattern匹配varname的结尾处,则删除匹配的最短部分,返回剩下的部分。 |
${varname%%pattern} |
如果pattern匹配varname的结尾处,则删除匹配的最长部分,返回剩下的部分。 |
${varname/pattern/string} ${varname//pattern/string} |
将varname中匹配pattern的最长部分替换为srting。 第一种格式中,只有匹配的第一部分被替换;第二种格式中,varname中所有匹配的部分都被替换。 如果模式以为#开头,则必须匹配varname的开头,如果模式%开头,则必须匹配varname的结尾。 如果string为空,匹配部分被删除。 如果varname为@或*,操作被依次应用于每个位置参数,并且扩展为结果列表。 |
4. 启动文件
Shell使用一些启动文件来协助创建一个运行环境。/etc目录下的文件提供全局设置,如果用户主目录下存在同名文件,它将覆盖全局设置。
不同Shell的启动文件
Korn Shell | C Shell | Bourne Shell | Bourne-again Shell |
/etc/environment /ect/profile
$HOME/.profile $HOME/.kshrc |
/etc/environment /etc/csh.cshrc /etc/csh.login
$HOME/.cshrc $HOME/.login |
/etc/environment /etc/profile
$HOME/.profile
|
/etc/environment /etc/profile /etc/bashrc
$HOME/.bash_profile $HOME/.bashrc |