Linux新手生存笔记[9]——shell脚本基础2-条件测试及控制流

来源:互联网 发布:c 程序员简历 知乎 编辑:程序博客网 时间:2024/04/23 18:51

回到全局目录

--------------------------------------------

1.条件测试1
A.文件条件测试 2
B.字符串测试 3
C.数值测试 3


2.控制流 4
A.if-else 4
B.case语句 6
C.for循环 7
D.until循环 9
E.while循环 10
F.补充break&continue 11




1.条件测试

Test

命令用于测试字符串、文件状态和数字,也同控制流相结合

 

文件状态判断;

字符串比较;

数字比较;

逻辑判断;

 

语法

两种格式:  test condition 

 或  [ condition ] 注意两边加了空格

 

中括号([])、参数之间必须有一个空格

 

逻辑运算符

-a

逻辑与

-o

逻辑或

!

逻辑否

&&, ||

 

示例:

1.       测试两文件是否均可读

$[ -w result.txt –a –w scores.txt ]

$echo $?

2.       测试两文件中其中一个是否可执行

$[ -x dream –o –x dream2 ]

3.       判断是否可写可执行

$[ -w dream –a –x dream ]

$echo $?

4.       判断文件是非可执行文件

$[ ! –x dream ]

5.       [条件判断表达式1]&& [条件判断表达式2]|| [条件判断表达式3]

 

A.文件条件测试

文件条件测试

-d

目录

-f

普通文件(Regular file)

-L

符号链接

-r

Readable(文件、目录可读)

-b

块专用文件

-e

文件存在

-g

如果文件的set-group-id位被设置则结果为真

-s

文件长度大于0,非空

-z

文件长度=0

-w

Writable(文件、目录可写)

-u

文件有suid位设置

-x

Executable(文件可执行、目录可浏览)

-c

字符专用文件

-L

符号链接

示例

Set-uid位授予程序其拥有者的访问权限而不是其使用者的访问权限

Set-gid位授予了程序其所在组的访问权限

 

示例

1.       测试文件是否可写

$test –w dream

$echo $?

 

或者

$[ -w dream ]

2.       测试目录是否存在

$[ -d appsbin ]

3.       测试文件权限是否设置了suid

$[ -u dream]

if test –f fred.c     if [ -f fred.c ]

then

   …..

fi

 

 

 

B.字符串测试

字符串测试

字符串测试是错误捕获很重要的一部分,特别:测试用户输入或比较变量时尤为重要

五种格式:

test “str”

test str_operator “str”

test “str1” str_operator “str2”

[ string_operator str1 ]

[ string string_operator string2 ]

 

String_operator 字符串比较

=

两字符串相等

!=

两字符串不等

-z

空串 [zero]

-n

非空串 [nozero]

示例:

1.       测试环境变量是否为空

$[ -z $EDITOR ]

$echo $?

2.       测试是否为某字符串

$[ $EDITOR = “vi” ]

$echo $?

3.       测试

$TYPE=”/dev/rmt0”

$TYPE2=”/dev/rmt1”

$[ “$TYPE” = “$TYPE2” ]

$echo $?

 

 

C.数值测试

数值测试

格式

“number” numberic_operator “number”

 或     [ “number” numberic_operator “number”]

Numberic_operator 算术比较

-eq

数值相等(equal)

-ne

不等(not equal)

-gt

A>B(greater than)

-lt

A<B(less than)

-le

A<=B(less、equal)

-ge

A>=B(greater、equal)

示例:

1.       比较相等

$NUMBER=130

$[ $NUMBER –eq 130 ]   #$[ “$NUMBER” –eq “130” ]

$echo $?

2.       比较两变量

$SOURCE=13

$DEST=15

$[ “$SOURCE” –gt “$DEST”]

$echo $?

3.       直接比较数值

$[ 990 –le 995 –a 123 –gt 33 ]

 

 

2.控制流

A.if

If then else语句

格式

  if 条件1

  then 

命令1

  elif  条件2

  then 

命令2

  else 

      命令3

  fi

if 条件                                          if 条件;then

then 命令                    等价                  命令

fi                                               fi

示例

1.       简单的if语句

$if [ “10” –lt “12” ]

> then

>     echo “10 is less than 12”

>fi

   2. 直接上命令

      $if grep “dave” data.file > /dev/null 2>&1

      >then

      >    echo “Dave in”

      > else

      >    echo “Dave not in”

      >fi

   3.  测试文件拷贝是否成功

      $if cp myfile myfile.bak

  > then

  >     echo “Good copy”

  > else

  >     echo “basename:$0:could not copy”

  >fi

  4. 当前目录测试

     $DIRECTORY=`pwd`     //反引号

     $if [ “$DIRECTORY” != “/” ]

     >then

     >    echo “Not root”

     >exit 1

     >fi

  5. 文件权限测试

$LOGFILE=test.txt

$if [ ! –w “LOGFILE” ]

>then

>    echo “you cannot write to $LOGFILE” >&2

>fi

  6.变量设置测试

$if [ -z $EDITOR ]

>then

>   echo “Your EDITOR environment is not set”

>else

>   echo “Using $EDITOR as the default editor”

>fi

  7.可以多个if 嵌套,但注意层次

$if [ -d $DIR]

>then

>    cd $DIR

>    if [ $? = 0 ]

>      then

>         do something

>    fi

>fi

  8.多个检测值

$if [ “$ANS” = “y” ] || [ “$ANS” = “Y” ]

注意:

if [ “$myvar” == “yes” ]; then

    # do something ...

fi

检查变量

当不确定变量是否存在时,加双引号通常是安全的做法。

 

B.case

Case语句

格式:

case variable in

       pattern [| pattern] …..)

             命令….

             ;;

       模式2)

             命令…..

             ;;

       *)

             …….

             ;;

 esac

注意,每个模式行都以双分号结尾

把最精确的匹配放在最前面

示例:

1.       简单的case语句

read ANS 

case $ANS in

  1)

       echo “1”

       ;;

  2)

       echo “2”

       ;;

  *)

       echo “not right”

       exit 1

       ;;

esac

2.       匹配模式使用

read ANS 

case $ANS in

  v100|v101)

       echo “1”

       ;;

  V102)

       echo “2”

       ;;

  *)

       echo “not right”

       exit 1

       ;;

esac

3.       提示输入y/n

read ANS 

case $ANS in

  y|Y|yes|Yes)

       echo “yes is selected”

       ;;

  n|N)

       echo “no is selected”

       ;;

  *)

       echo “`basename $0` :Unknown response”

       exit 1

       ;;

esac

 

 

C.for

for循环

格式

for 变量名 in 列表

do

      命令1

      命令2

done

示例:

1.       简单的for循环

for loop in 1 2 3 4 5

do

   echo $loop

done

2.       打印字符串列表

for loop in “orange red blue grey”

do

   echo $loop

done

3.       打印当前命令下的所有文件

for loop in `ls`

do

   echo $loop

done

4.       对for循环使用参数

脚本中,for params in “$@”  等价于  for params

for params

do

   echo “You supplied $params in $@”

done

5.       多文件转换

for files in `ls LPSO*`

do

   cat $files | tr “[a-z]” “[A-Z]” >$files

done

6.       循环计数

counter=0

for files in *

do

  counter = `expr $counter + 1`

done

7.       for循环的嵌套

for 变量1 in 列表1

do

   for 变量2  in 列表2

   do

      命令

   done

done

 

8.       bash中的for循环写法

#!/bin/bash

for i in 1 2 3 4 5 6 7 8 9 10; do

         # do something

done

 

for i in `seq 1 10`; do

         # do something

done

 

for i in {1..10}; do

         # do something

done

 

示例:bash的 for 循环写法

for ((i = 1; i <= 10; i++)); do

         # do something

done

 

C语言自诞生那天起就只有一种写法

for (i = 0; i < 10; i++) {

         # do something

}

 

9.       eg

for ((初始值;限制值;限制步长))

do

   程序段

done

 

 

D.until

until循环

执行一系列命令直到条件为真时停止

Until循环与while循环处理方式上刚好相反

如果循环至少要执行一次,使用while,如果可能根本不需要执行,使用until

格式:

until  condition

      do

           命令…..

      done

测试发生在循环末尾,所以至少执行一次

示例:

1.       简单的until测试

IS_ROOT=`who | grep root`

until [ “$IS_ROOT” ]

do

   sleep 5

done

2.       监视文件被删除

LOCK_FILE=”temp”

until [ ! –f $LOCK_FILE ]

do

sleep 1

   done

   echo “file deleted”

3.       监视磁盘空间

LOCK_OUT=`df | grep /logs | awk ‘{print $5}’| sed ‘s/%//g’ `

echo $LOCK_OUT

until [ “$LOCK_OUT” –gt “90” ]

do

echo “File system.Logs is nearly full”

exit

   done

4.       eg

until [condition]&&[condition]||[condition]

do

   程序段落

done

 

 

E.while

while循环

用于不断执行一系列命令,也用于从输入文件中读取数据

格式:

while condition

     do

         命令1

         命令2

done

 

示例:

简单的while命令

COUNTER=0

while [ $COUNTER –lt 5 ]

do

COUNTER=`expr $COUNTER + 1`

echo $COUNTER

    done

1.       循环读文件

while read LINE

do

echo $LINE
done  < dream

2.       读文件不同字段

while read DEPT ITEMS
do

   …..

done < total.txt

3.       每次读一对记录

while read rec1

do

read rec2

echo “$rec1”

echo “$rec2”

   done <record.txt

4.       忽略注释行

while read LINE

do

   case $LINE in

   \#*) ;;

   *)

       echo $LINE

       ;;

   esac

done

5.       无限循环

while [ 1 ]

do

   #dosomething

done

 

6.

while [condition]&&[condition]||[condition]

do

   程序段落

done

 

 

F.补充break&continue

补充;break和continue控制循环

Break

允许跳出循环,通常在进行一些列处理后退出循环或case语句

若多重循环,可指定跳出的循环个数,如跳出两重循环  break 2

命令不执行当前循环体内break下面的语句

从当前循环退出.

在控制条件未满足之前,跳出for,while,until循环,可以为break提供一个额外参数来表明需要跳出的循环层数

默认只跳出一层循环

示例:

1.       跳出case

case $ANS in

1|2|3)

Do something

break;

;;

*)

    ;;

esac

continue

不会跳出循环,只是跳过此循环步

命令是程序在本循体内忽略下面的语句,从循环头开始执行.

跳到下一次循环继续执行


原创粉丝点击