高级bash编程指南(三)

谁说我不能喝 提交于 2020-01-14 14:31:42
该章从第九章变量访问开始

 一.内部变量

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 typeset
1.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()
{
func
echo $VAR  #func
}
func()
{
declare VAR="func"
}
func1()
{
func
echo $VAR  #null
}
五变量间接引用
1.a=b
 b=c
 eval var=\$$a  #var=c
六 产生随机数
1.$RANDOM
2. %和+的使用,可以产生某一个区间的随机数
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风格的三元操作符











易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!