条件测试

测试方法

① 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