Linuxshell脚本编程基础(二)

 

4.8Bash中的基本程控制语法

1.       if……then……else

if语句用于判断和分支,在linux中的具体结构用法如下:

if [expression]; then

  statements

fi

例子:

if [ -e /etc/shells ]; then

  file `cat /etc/shells` | tr ‘a-z’ ‘A-Z’

fi

-e判断/etc/shells是否存在,如果存在则把shells文件中的小写替换成大写

If [ expression ]; then

   statements

else

  statement

fi

例子:

If [ num1 –gt num2 ];then

 Echo “the max num is num1 ”

Else

Echo “then max num is num2”

Fi

对两个数的大小进行判断,如果num1大于num2则输出num1 否则输出num2

If [ expression ]; then

Statement

elseif, [ expression ];then

statement

else

statement

fi

例子:

If [ $1 –gt 90 ];then

 echo “$1 is best”

elif [ $1 –gt 70 ];then

 echo “$1 is good”

else

 echo “$1 is bad”

fi

这个例子中的$1就是上面变量中提到的地址变量,可以接受传递过来的参数。

2.       for循环结构

for 变量 in 列表; do

  statement1

  statement2

  ………..

done(结束)

其中列表表示法:{1….100}`seq 1 100`两种

例子:计算1100的和

declear  -i SUM=0

for NUM in {1…100};do

 SUM=$[$SUM+$NUM]

 done

echo “the sum is $SUM”

简单介绍一下这个程序,declear SUM=0表示先把存放和的值赋空,因为一个变量没有初始值时,会存放一个随机的初始值。然后利用for循环从1开始计算并依次把和存放到SUM变量中,直到NUM=100时条件结束,SUM变量中存放最终的结果。

3.       while循环和untile循环

while循环的借本结构是:

while [ condition ]; do

 statements

done

until循环的基本结构是:

until [ condition ];do

  statements

done

这里把while循环和until循环放到一块说明,是因为他们结构大体一致,只是循环条件又些许差异。While循环是当条件满足时进入循环体,直到条件不满足时退出循环,而until循环则是当条件不满足时进入循环体,条件满足时退出循环。大家来看一个例子就能明了的直到他们的区别了。

我们还以计算100以内的整数之和为列。

 declear –i SUM=0

 declear –I COUNT=1

while [ $COUNT –le 100 ];do

  SUM=$[$SUM+$COUNT]

  let COUNT++

done

这是while循环,表示只要变量COUNT不大于100就一直执行循环体。那大家可以想想如果换成until循环,条件该如何控制,这里我就不做说明了。

4.       case语句

bash中的case结构可以进行多项分支控制,其基本结构是:

case 变量 in

condition1)

statement1

;;

condition2)

statement2

;;

….

*)

default statements

;;

esac

特别提醒:每一个分支后面一定要有;;结束

下面这个程序是运用case结构进行分支执行的例子

#!/bin/bash 
#
echo "Hit a key, then hit return." 
read Keypress 


case "$Keypress" in 
[a-z] ) echo "Lowercase letter";; 
[A-Z] ) echo "Uppercase letter";; 
[0-9] ) echo "Digit";; 
* ) echo "Punctuation, whitespace, or other";; 
esac

上面例子中的read语句表示从键盘上读取输入。

5.       break/continue

break语句是停止循环,而continue语句则是跳出当次循环而提前进入下一次循环。这里就不再举例子说明了。

6. 函数的使用

函数的定义是为了方便程序的结构化设计,可以把一个很复杂而常用的一段代码写到一个函数体中,使用时直接调用这个函数体即可。

函数的定义如下:

function myfunctionname{ code block}

或者myfunctionname(){code block}

需要说明的是函数的定义必须要放在函数使用之前。那么如何给函数传递参数和获得返回值呢?

传递参数:在函数体中可以用保留变量$1 $2..来引用调用时传递过来的参数即可。

获得返回值:可以用return语句来指定返回值,这个值是一个0-255的一个整数,如果没有使用return特定返回一个值得话,则以最后一条语句执行的结果作为返回值。下面举一个例子

FUSER(){

if id $1 &>/dev/null;then

 echo “UID:`id –u $1`”

else

echo “no such user”

return 1

fi

}

read MYUSER

FUSER $MYUSER

这是一个显示用户ID的例子,在循环体中我们用到了前面提到的if语句,在函数体中先判断用户是否存在,如果存在则输出用户ID,否则输出没有该用户并return返回一个值。然后最后直接使用函数名来调用这个函数,并传递参数MYUSER给函数体。

一.         BASH 程序的调试

            bash –n bash-script 命令可以测试你写的脚本是否有语法错误,然后再 bash -x bash-script 命令查看一个出错的 BASH 脚本到底用在什么地方,可以帮助程序员找出脚本中的错误。