Linux Shell 编程基础详解——吐血整理,墙裂推荐! (5)

一般用于整数值,也可以用于字符串;
格式:expr argument operator argument
expr 也是个手工命令行的计数器

$ expr 10 + 10 #注意空格 $ expr 300 / 6 / 5 $ expr 30 \* 3 #注意:乘号必须用反斜线屏蔽其特定含义

expr在循环中用于增量计算,首选,循环初始化为0,然后循环加1,常用的做法:从expr接受输出赋给循环变量
例:

$ LOOP=0 $ LOOP=`expr $LOOP + 1` 3.2.1 数值测试

可以用expr测试一个数,如果对非整数进行计算,则返回错误
例:

$ expr 1.1 + 1 #返回错误 $ expr 1 + 1 #返回2 3.2.2 字符串测试

注 expr 也有返回的状态,但与系统最后返回的值刚好相反,expr返回成功为1,其他值为失败。
例:

$ value=hello $ expr $value = "hello" 1 # 这是expr执行成功的值 $ echo $? 0 # 这是系统返回的成功的值 3.3 if 条件判断

格式:

if 条件1 then 命令1 elif 条件2 then 命令2 else 命令3 fi

注意:使用if语句时,必须将then部分放在新行,否则会产生错误,如果要不分行,必须使用命令分割符,即:

if 条件1; then 命令1 fi

例:$ vi myfile

#!/bin/sh DIRECTORY=$1 if [ "`ls -A $DIRECTORY`" = "" ] ; then echo "$DIRECTORY is indeed empty" else echo "$DIRECTORY is not empty" fi 3.4 for 循环

格式:

for 变量名 in 列表 do 命令1 命令2 done

说明:命令 可为任何有效的shell命令和语句
变量名可以为任何单词
in列表是可选的,如果没有列表,for循环会使用命令行的位置参数
in列表可以包含替换,字符串,文件名

例:

#!/bin/sh for loop1 in 1 2 4 5 6 #数字列表 do echo $loop1 done for loop2 in he is a tall man #字符串列表 do echo $loop2 done for loop3 in `ls` #替换列表 do echo $loop3 done

对for 循环使用参数,当循环中省去in列表选项时,它将接受命令行特定变量做为参数即

for params in "$@" 或者 for params in "$*"

例1:

#!/bin/sh for params in "$@" do echo "You supplied $params as a command line option" done echo $params

例2

#!/bin/sh counter=0 for files in `ls` do counter = `expr $counter + 1` done echo "There are $counter files in `pwd`" 3.5 while和until循环

while循环
格式:

while 命令 do 命令1 命令2 …… done

note:do和done之间命令,只有前一个返回状态为0,后面命令才会被执行;否则则循环中止

until循环
格式:

until 条件 命令1 命令2 …… done

note:until执行一系列命令,只至条件为真时停止,循环至少执行一次。

例1:

#!/bin/sh echo "Type <Ctrl-D> to terminate" echo -n "enter your favorate film :" while read FILM do echo "Yeah,great film the $FILM" done

使用ctrl-D中断脚本的执行,整个循环中止
例2:

#!/bin/sh IS_ROOT=`who | grep root` until [ "$IS_ROOT" ] do sleep 5 IS_ROOT=`who | grep root` done echo "Watch it. Roots in " | mail wuxh

思考:为什么用sleep 5?

3.6 case 条件选择

格式:

case 值 in 模式1) 命令1 …… ;; 模式2) 命令2 …… ;; esac

case 取值后面必须为in,每个模式必须以右括号结束,取值可以为变量或者常数,找到匹配模式后,执行相关命令直到;;

模式部分可以包含元字符,与命令行中文件扩展名中使用的匹配类型相符,如 * ? [..]
例:

#!/bin/sh if [ $# != 1 ]; then echo "Usage:`basename $0` [start|stop|help]" exit 1 fi OPT=$1 case $OPT in start) echo "starting..`basename $0`" # code here to start a process ;; stop) echo "stopping..`basename $0`" # code here to stop a process ;; help) # code here to display a help page ;; *) echo "Usage:`basename $0` [start|stop|help]" ;; esac 3.7 Break 和continue

有时需要某些准则退出循环或者跳过循环步,就需要break和continue来实现
break 允许跳出循环或者case语句,在嵌套循环里,可以制定跳出的循环个数,例在两层的嵌套循环内,break 2可以跳出整个循环
continue 类似于break,区别是continue只会跳过当前的循环步,而不会跳出整个循环
例子1:

#!/bin/sh while : do echo -n "Enter any number [1..5] :" read ANS case $ANS in 1|2|3|4|5) echo "great you entered a number between 1 and 5" ;; *) echo "wrong number..bye" break ;; esac done

例子2 :
names2.txt 内容包含雇员名字,部门,及其id,如下所示:
------------------------------内容如下--------------------------------
---LISTING OF PERSONNEL FILE----
--- TAKEN AS AT 06/1999----------------
Louise Conrad:Accounts:ACC8987
Peter James:Payroll:PR489
Fred Terms:Customer:CUS012
James Lenod:Accounts:ACC887
Frank Pavely:Payroll:PR489
-------------------------------------------------------------------------------
要求:读取names2.txt文件,将在职员工的名字,部门,部门id读取打印出来
说明:Peter James已经离职

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydzpj.html