该章从第九章变量访问开始
一.内部变量
1.内建变量 $FUNCNAME,当前函数的名字
func()
{
echo "$FUNCNAME" #func
}
2.$IFS内部字段分割符
当shell读取输入时,它给出来分割单词的一组字符,它通常是空格,制表符和换行符。
$* 所有的参数用环境变量$IFS的第一个字符分割开
$@则不是用$IFS中的字符分割变量。
3.$LINENO表示在脚本中该变量出现时的所在的行数
4.$SECONDS脚本已运行的秒数,sleep num ,程序停止num秒
5.$TMOUT,经错$TMOUT后,shell提示符会超时,这将使此shell退出登录
6.在使用$*时一定要用引号引起,否则在某一些情况下会出错
$!在后台运行的最后一个作业的PID
$_保存迁移个命令最后一个参数的变量值
$?一个命令,函数或脚本自身的退出码
$$脚本本身的PID
二.操作字符串
1.字符串长度
${#string},expr length $string,expr "$string" : ‘.*’(单引号)
2.匹配字符串开头的字串的长度
expr match "$string" '$substring'
expr "$string" : '$substring' #substring is Resular Expressions
3.索引
expr index $string $substring#substring在string中第一次出现的位置
4.子串提取
(1)${string:position}
把$string中从第$postion个字符开始字符串提取出来.
如果$string是"*"或"@",则表示从位置参数中提取第$postion后面的字符串
(包括$position)
(2)${string:position:length}
把$string中$postion个字符后面的长度为$length的字符串提取出来。
如果$string参数是"*"或"@",则会提取第$length个位置参数开始的
共$length个参数
注意也可以从从右边开始提取
eg.string="abcABC123ABCabc"
echo ${stringZ:-4} # abcABC123ABCabc
echo ${stringZ:(-4)} # Cabc
echo ${stringZ: -4} # Cabc ()和空格发挥了作用
(3)expr substr $string $position $length
提取$string中从位置$postition开始的长度为$length的子字符串。
(4)expr match "$string" '\($substring\)'expr "$string" : '\($substring\)'从$string字符串左边开始提取提取由$substring描述的正则表达式的子串。
(5)expr match "$string" '.*\($substring\)'expr "$string" : '.*\($substring\)'从$string字符串结尾开始提取由$substring描述的正则表达式的子串。5.字串移动(1)${string#substring} 从$string左边开始,剥去最短匹配$substring子串.(2)${string##substring} 从$string左边开始,剥去最长匹配$substring子串.(3)${string%substring} 从$string结尾开始,剥去最短匹配$substring子串。(4)${string%%substring} 从$string结尾开始,剥去最长匹配$substring子串。6.字串替换(1)${string/substring/replacement} 用$replacement替换由$substring匹配的字符串。 ${string//substring/replacement} 用$replacement替换所有匹配$substring的字符串。
1 stringZ=abcABC123ABCabc
2
3 echo ${stringZ/abc/xyz} # xyzABC123ABCabc
4 #用'xyz'代替第一个匹配的'abc'.
5
6 echo ${stringZ//abc/xyz} # xyzABC123ABCxyz
7 # 用'xyz'代替所有的'abc'.
|
(2)${string/#substring/replacement} 如果$string字符串的最前端匹配$substring字符串, 用$replacement替换$substring. ${string/%substring/replacement} 如果$string字符串的最后端匹配$substring字符串, 用$replacement替换$substring。
1 stringZ=abcABC123ABCabc
2
3 echo ${stringZ/#abc/XYZ} # XYZABC123ABCabc
4 # 用'XYZ'替换前端的'abc'.
5
6 echo ${stringZ/%abc/XYZ} # abcABC123ABCXYZ
7 # 用'XYZ'替换后端的'abc'.
|
7.awk简介
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指定的行都被处理。awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。gawk是awk的GNU版本,它提供了Bell实验室和GNU的一些扩展。
三.参数替换1. ${parameter-default},${parameter:-default}如果变量parameter没有赋值,使用默认值。两者之间的差别是:对于前者,当变量已经声明,但是值为NULL,此时也不用默认值。然而对于后者在这种情况下,仍然使用默认值。2.${parameter=default},${parameter:=default},与1中的相应的表达式效果相同3.${parameter+alt_value}, ${parameter:+alt_value},
如果变量parameter设置,使用alt_value作为新值,否则使用空字符串。不同的地方,${parameter+alt_value},当parameter声明且值为空时,依然使用alt_value作为新值,
${parameter:+alt_value}则不会用新值。4.${parameter?err_msg}, ${parameter:?err_msg}
如果变量parameter已经设置,则使用该值,否则打印err_msg错误信息
总结前面的4种情况,可以知道每一种的不带冒号的表达式将null值也作为赋值情况看待,而带冒号的表达式则认为null值不算赋值5.${#var}字符串的长度6.${var#Pattern}, ${var##Pattern删除从$var前端开始的最短或最长匹配$Pattern的字符串。7.
${var%Pattern}, ${var%%Pattern}删除从$var后端开始的最短或最长匹配$Pattern的字符串。8.其实有关变量扩展/字串替换,跟前面讲的字符串的相应操作是类似的。四 Typing variables:declare or typeset1.declare ,typeset内建命令他们是完全相同的,可以用来限定变量的属性。2.(1)declare -r var1 #只读属性(2)declare -i #整数(3)declare -a var1 #数组(4)declare -f funcname #函数,不带参数的话,会列出所有在此脚本本前面已定义的函数出来(5)declare -x var1(=100) #生命一个变量作为脚本的环境变量而被导出,允许同时赋值(6)eg: declare -i var
var=var+1 #不用let,var前不用加#
(7)使用declare来限定变量的范围func(){VAR="func"}func1(){funcecho $VAR #func}
func(){declare VAR="func"}func1(){funcecho $VAR #null}五变量间接引用1.a=b b=c
eval var=\$$a #var=c
六 产生随机数1.$RANDOM2. %和+的使用,可以产生某一个区间的随机数3.number=$((RANDOM%25+6)),产生6和30之间的随机数。 number=$((RANDOM%(max-min)+min))
七。双括号结构1.类似与let命令,(())结构允许算数计算和求值,在bash中双括号也是遵循C风格的变量操作的一种机制2.((a=23))#以C风格来设置一个值,在“=”两边可以有空格((a++)),((a--)),((++a)),((--a))3.((t=a<b?a:b)) #C风格的三元操作符