一、条件测试
1、条件测试:test或[
命令test可以测试一个条件是否成立,若测试结果为真,则退出码为0,若测试结果为假,则为1
- 字符串比较时:
-
- 用==或=或 !=(建议用==)表示比较两字符相同或不相同
- [ -z string ] 若string的长度为0则为真
- [ -n string ] 若string的长度不为0则为真
*在比较两个字符串是否相等时,建议加上双引号,且在表达式两边均加上相同的一个字母:test "X$data" == "Xhello"
*注意命令和变量的空格,重要重要重要!命令后面加空格,变量不能加空格
- 整形的比较:
-
- -eq表示相等
- -ne表示不相等
- -gt表示大于
- -lt表示小于
- -le表示小于等于
- -ge表示大于等于
-
-
- 目录或文件的比较
-
- [ -d dir ] 若dir存在且为一个目录,则为真
- [ -f file ] 或file存在且为一个普通文件则为真
- 与或非运算
-
- [ ! exp ] ! 表示取反
- [ exp1 -a exp2 ] -a表示逻辑与(and)
- [ exp1 -o exp2 ] -o 表示逻辑或(or)
-
二、语句1、if/then/elif/else/fi注意:- if、then、fi是三条命令,若两条命令写一行要用; 隔开,此外,命令和参数之间必须用空格隔开,then后面有换行。
- if后面跟一条子命令,若该子命令的退出码为0(表示真),则执行then后面的子命令,若退出码为假,则执行elif、else、fi后面的命令。if后的子命令常是测试命令。
- fi表示if语句块的结束。
- 命令后不能有空语句,若必须写空语句,则用 : 代替,冒号是一个空命令,不做任何事,但是退出状态为真
-
read命令表示等待用户输入字符串,将这个字符串保存到shell变量中。同时,&&和||也可以表达条件
-
- &&表示“if...then...”
- || 表示"if not ....then"
- &&和||均用于连接两个命令,上面的-a和-o仅用于连接两个测试条件
-
-
2.case语句shell脚本中的case语句可以匹配字符串和wildcard,每个匹配分支有若干条命令,末尾以;;结束,结束后直接跳出esac。
-
$1表示特殊变量,是在执行脚本时自动取值为第一个命令行参数
3、循环语句- 1、for/do/done
-
注意:do done之间不能不写语句,若没有语句,则加冒号
- 2、while/do/done
例1:
-
例2
-
-
shell还有until循环,相当于do..while循环
-
-
三、位置参数与特殊变量
- $0 相当于c语言main函数的argv[0]
- $1,$2.. 相当于main函数的argv[1]、argv[2]....
- $# 相当于argc -1
- $@ 表示参数列表“$1”“$2”...
- $? 上一条命令的退出状态
- $$当前shell的进程号
*注意在shell脚本的$$的进程号是子bash的进程号,若在执行脚本之前加上 . 或者source,则不派生子bash,$$表示当前shell进程号
-
- shift 命令左移:例如shift 3表示原来的$4变成$1,原来的$5变成$2... 原来的$1、$2、$3丢弃,$0不移动
四、函数- shell中的函数没返回值也没有参数列表
- shell在函数调用时不写括号
- 函数必须先定义在调用
- 传递参数时,在调用函数的同时传任意多个参数,函数内用$0 $1等来提取参数,这些函数中的参数相当于局部参数。不会影响函数外面的变量
- 函数可以用return返回退出状态
-
2、调试函数
- 解释器后加-n 表示读一遍脚本命令但不执行,用于检查脚本是否有语法错误
- 解释器后加-x 提供跟踪执行信息,在执行每一条命令和结果打印出来
- 在代码中要调试某部分时,将这部分前后加set -x和set +x
四、数组bash支持一维数组(不支持多维),并且没有限定的大小,从0开始数据之间用空格隔开
初始化:arr=('a' 'b' 'c') #数组元素为abc,三个元素echo ${arr[0]} #一定要加花括号例:进度条小脚本 -
- 例二:读文件内容,文件每一行放一个数,计算这个文件的最大数、最小数、平均数以及总数