Bash shell只支持一位数组(不支持多维数组),初始化时不需要定义数组大小,数组元素从0下标开始。
1定义数组
指定元素来定义数组:
array[key] = value
array[2] = 13
declare语句定义数组:
declare -a arrayname
通过元素集合来定义数组:
array = (1 2 3 4 5 )
键值对定义数组:
array = ([0]=value0 [1]=value1...[n]=valuen)
读取数组
“${array[index]}” 获得index下标的元素值
“${array[@]}” 所有元素的值
“${array[*]}” 所有元素的值
“${#array[@]}” 数组元素个数
“${#array[*]}” 数组元素个数
(${array[@]:start:length}) 以切片的方式读取数组,从start开始,读取length长度
${array[@]/source/replace} 把array中source替换为replace
数组和普通变量:
2数组赋值
array[key]=value array[2]=10 这种方式可以扩展(将元素个数增加)
array=(value1 value2 value3 value4..) array=(2 3 4 5 6)
3删除数组
unset array[n] 删除某个元素
unset array 删除整个数组
4其他操作
nwearrar=(“${array[@]}”) 赋值数组
(“${array1[@]}” “${array2[@]}”) 连接数组
加载文件到数组:
content=(`cat test.txt`)
for var in “${content[@]}”
do
...
done
第八章 正则表达式
1行首定位符
str=’ls -a| grep “^test”’ 把ls -a命令结果中以test开头的文件显示出来
echo “$str”
2行尾定位符
str=`ls -a | grep “.sh$”` 把ls -a命令结果中后缀为.sh的文件显示出来
echo “$str”
3精确找到某一文件 把ls -a 命令结果中test开头,.sh结尾的文件显示出来
str=`ls -a | grep “^test.sh$”`
echo “$str”
这种方法也不能唯一找到文件,如下:
运行结果为:
都是以test开头,都是以.sh结尾。
4圆点字符匹配
“.”用来匹配字符或空格,“.”表示这个位置上至少有个空格。
str=`ls -a | grep “test”`
str=`ls -a | grep “test.”`
对比结果如下:
4限定符“*”
str=`ls -a | grep “sss*”` “*”指定前面一个字符(s)重复的次数(包括0次)
echo “$str”
5字符集匹配
str=`ls -a | grep “^rc[0-9]”` 把ls -a结果中以rc开头并且按照rc0、rc1、rc2、....rc9排序显示。
6字符集不匹配
str=`ls -a | gerp “[^test]”` 不匹配其中任意字符
扩展表达式:
1
str=`ls -a | grep “^sss+”` “^s”以s为首的,”ss+”,ss后面的s至少出现一次,即次数>=1
2
str=`ls -a | grep “^sss?”` “^s”以s为首的,”ss+”,ss后面的s至多出现一次,即次数<=1
3
str=`ls -a | grep “(sss|ssh|ssd)”` 匹配含有这三个字符的文件
perl正则表达式
1
str=`ls -a | grep -p “^rc\d”` “\d”匹配0~9任意数字,结果为rc0、rc1、...rc9
2
str=`ls -a | grep -p “^rc\D”` “\D”匹配非数字字符
3
“\s”匹配任何空字符(包括空格、制表符、换页符)
4
“\S”匹配任何非空字符
匹配单个字符:
1
str=`grep “a” test.txt` 把txt文件中含a的行输出
2
str=`grep “\.” test.txt ` 把txt文件中含“.”的行输出
匹配多个字符:
1
str=`grep “abcdef” test.txt` 匹配test文件中的字符串
2
str=`grep “o[ru]” test.txt` 含or或者ou 的行
3
str=`grep “lo*king” test.txt` *为模糊查找,*前面o的个数可以为0、1、..
4
str=`grep “800-[[:digit:]]{3}-[[:digit:]]{4}$” test.txt` 把test文件中800-xxx-xxxx格式电话显示
grep命令
grep options pattern file
具体的操作有以下选项:
grep模式很灵活,可以是字符串、变量、正则表达式(有空格就用“”双引号括起来)
1指定命令解释器:
Linux系统中有多个shell程序,如sh,bash,csh等,当执行一段shell程序时必须确定用哪个shell解析。
#! /bin/bash
#! /usr/local/phps/bin/php
#! /bin/more
2注释方法:
第一种: 第二种:
#! 注释1 :<<BLOCK
#! 注释2 ..........
#! 注释3 BLOCK
3执行shell程序:
需要创建进程来执行脚本
a.授予执行权限(chomod u+x myshell) ./myshell.sh
b.不需要拥有执行权 /bin/bash myshell.sh
不创建进程的source
c.执行结果略不同 source myshell.sh
4Shell程序退出状态
每个命令都会返回一个状态,成功返回0,失败返回0~255之间的一个整数$?保存了最后一条,命令的退出状态。
第三章:
1变量和引用:
程序设计语言根据类型确定的时间分为:静态类型语言和动态类型语言
静态类型语言,在编译期间就确定变量类型的语言(Java、C++、PASCLA),变量使用前,必须先声明。
动态类型语言:在程序执行过程中才能确定变量的数据类型(VBScript、PHP、Python)。
根据是否强制要求类型定义分为:强类型语言和弱类型语言
强类型语言:Java、C++
弱类型语言:VBScript
Shell是一种动态类型和弱类型语言。
全局变量:在脚本中定义的都是全局变量,函数中定义的也是全局变量(生命周期从调用函数的时间点开始,直至shell脚本结束或显示被删除)
局部变量:局部变量范围比较小,在函数内部定义的变量,前面加local即可。但是当global变量与local变量同名时,global变量会屏蔽到local 变量。
用shell实现简单的三个数排序:
如果输入的不是阿拉伯数字,如+,-,%,>,#等会默认转化为ASCII码值来比较大小。