Linux之shell脚本编程基础(二)
4.8、Bash中的基本程控制语法
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`两种
例子:计算1到100的和
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 脚本到底用在什么地方,可以帮助程序员找出脚本中的错误。