条件测试 |
测试方法: ① test EXPRESSION ② [ EXPRESSION ] ③ [[ EXPRESSION ]] ④ COMMAND 退出状态码 |
bash中常用测试 |
整数测试: -gt, 大于 -lt, 小于 -ne, 不等于 -eq, 等于 -ge, 大于等于 -le,小于等于 字符串测试: ==, 等于 =, 等于 !=, 不等于 >, 大于 >=, 大于等于 <, 小于 <=, 小于等于 -z, 空 -n,不空 测试条件: ! CONDITION,取反 字符串测试: "$A" =~ PATTERN 如果变量A中保存的字符串能被PATTERN所匹配;即为真;否则为假; 文件测试: -e $file: 是否存在;存在则为真; -a $file: 同上;弃用; -f $file: 文件是否存在,且为普通文件; -d $file: 是否存在且为目录; -h $file: 是否存在且为符号链接文件; -L $file:同上 -b $file: 是否存在且为块设备文件; -c $file: 是否存在且为字符设备文件; -S $file: 是否存在且为套接字文件: -p $file: 是否存在且为管道文件; -r $file: 当前用户对此文件是否拥有读权限; -w $file: 写 -x $file: 执行权限; -u $file: 文件是否拥有suid权限; -g $file:文件是否拥有sgid权限; -k $file: 文件是否拥有sticky权限; -O $file: 当前用户是否为文件的属主; -G $file: 当前用户是否属于文件的属组; -N $file: 文件自从上一次被读取之后,是否被修改过; $f1 -nt $f2: 文件f1是否比文件f2新; $f1 -ot $f2: 文件f1是否比文件f2旧; $f1 -ef $f2: f1和f2是否为同一个文件的硬链接; 组合测试条件: 给条件添加逻辑操作符; 或, -o: [ -z "$hostname" -o "$hostname" == 'localhost' ] 与, -a: [ $uid -gt 0 -a $uid -lt 500 ] 非:[ ! EXPRESSION ] 组合测试条件:短路操作符 与:COMMAND1 && COMMAND2 COMMAND1的退出状态如果为假,则COMMAND2不用运行,即可有最终结果; 或:COMMAND1 || COMMAND2 COMMAND1的退出状态如果为真,则COMMAND2不用运行,即可有最终结果; 非:! COMMAND |
选择 |
if_then语句: if后跟true或false,可用条件测试语句,then后跟执行命令 如果为真,则执行then后的语句 if 条件测试 ;then 命令2 else 命令2 fi else语句不是必须的,如下: if 条件测试 ;then 命令 fi 多分支: if 条件 ;then 命令1 elif 命令2 else 命令3 fi case语句: 简洁版的多分支if语句; 语法格式: case 变量引用 in PATTERN1) 分支1 ;; PATTERN2) 分支2 ;; ... *) 分支n ;; esac |
举例: if [ a -gt b ];then echo the max is $a elif [ a -eq b ];then case $a in 10) echo they're 10 ;; 20) echo they're 20 ;; *) echo they are the same esac else echo the max is $b fi |
循环 |
for循环: for 变量 in 列表;do 循环体 done C语言风格的for循环: for ((变量赋值;循环条件;修正表达式)); do 循环体 done while循环: while CONDITION; do 循环体 循环控制变量的修正表达式 done 当CONDITION为“真”进入循环,直到“假”退出循环; while的特殊用法: while的特殊用法:遍历指定文件的每一行 while read line; do 循环体 done < /path/from/somefile until循环: until CONDITION; do 循环体 循环控制变量修正表达式 done 当CONDITION为“假”时进入循环;为“真”退出循环; 循环嵌套:在循环体中再嵌入循环,几种循环方式可以混用 for 变量 in 列表;do for 变量 in 列表;do 循环体 done done 跳出循环: continue 跳出本轮循环,继续下一轮循环 break 跳出循环体,不再执行循环语句 continue N,break N 在嵌套循环中使用,表示跳出N层循环 |
例1: while [ a -gt 0 ];do until [ b -gt 10];do for ((i=0;i<20;i++));do for [ i -lt 10 ];do if [ i -eq 5 ];then echo hello elif [ i -eq 8 ];then continue else break fi done done b++ done a-- done 例2: #!/bin/bash file=/etc/passwd while read line; do userid=`echo $line | cut -d: -f3` if [ $[$userid%2] -eq 0 ]; then echo $line | cut -d: -f1,3 fi done < $file |
数组 |
声明数组: declare -a ARRAR_NAME 赋值: 声明关联数组: declare -A ARRAY_NAME 数组元素的赋值: (1) 一次只赋值一个元素 ARRAY[index]=VALUE a[0]="hello" (2) 一次赋值全部元素 ARRAY=("mon" "tue" "wed") (3) 指定索引进行赋值 ARRAY=([0]="sun" [1]="mon" [5]="fri") (4) read -a ARRAY 引用数组元素:${ARRAY[index]} 数组的长度:${#ARRAY[*]}, ${#ARRAY[@]} 查看可用索引:${![@]} |
举例: declare -A furit=([apple]=10 [pear]=15) echo ${fruit[apple]} 显示索引apple对应的元素值 10 echo ${#fruit[@]} 显示数组长度 2 echo ${!fruit[@]} 显示数组可用索引 apple pear |
函数 |
语法: function f_name { 函数体 } f_name() { 函数体 } 调用:使用函数名 函数名出现的地方,会被自动替换为函数代码; |
举例: hello(){ echo hello boys } hello 或 function hello{ echo hello boys } hello |