上一篇文章讲述了脚本编程的基本内容,包括概念,特殊字符,变量与操作符等内容,这相当于基本的操作,但是相比实际的编程还差的是函数和流程控制,以下内容为讲述函数和流控的部分。
- 简述:脚本也是一个程序,而每一个程序本身都是一个真值表达式,它的真值由其返回值决定。故 Shell 脚本应该返回一个值,若脚本未显式指定返回值,则自动使用最后一条命令的返回值;如果需要显式指定脚本的返回值,需要用 exit 命令实现。使用了 exit 0 命令显式地返回 0,最终脚本执行结果返回值为 0。但如果删除 exit 0 这一行,将会返回 1。
函数
定义函数的方式:
function_name () {
command...
}
或者:
function function_name {
command...
}
- 推荐采用前者,与C类似,。Bash 中没有类似于 C 中提前“声明”函数的方法,任何函数都应该在其被调用前完整定义。函数调用方法,就像使用命令一样来进行函数调用。
示例:
#!/bin/sh
echo "demo for function and call"
fun() {
echo "I‘am in func()" }
fun
echo "end"
test
-
简述:条件测试是 Shell 编程中很重要的一部分,有外部命令 test(别名“[”),一般还有内建的结构“[]”,而新版本的 bash 还提供了一个更有效率和灵活性的内部实现“[[]]”,使用方法是检测是否达到条件,比如检测是否存在某个文件,
-
文件测试
文件存在(-a 与-e 相同,但-a 已经被弃用,不鼓励再使用)例如:[ -e ~/.bashrc ] 注:/ [ ] /中间是存在空格的,在内部要比较的内容前后都要有 空格,否则报错
-
整数比较
-
字符串比较
注:在Ubuntu中使用bash脚本,执行时,测试出判断字符串是否相等时可以通过“=”判断,且两端需要有空格。if [ “$1” = “weekdays” ],要不然是会出错的。 -
混合比较:test 也支持在多个表达式之间进行逻辑运算然后得到一个真值,其中-a 表示与(AND)运 算,-o 表示或(OR)运算。如程序清单 18.12 所示代码,使用-a 或-o 符合条件来测试参数中的整数是否在 0 到 100之间,若在输出 yes,不在则输出 no。
流程控制
bash提供给我妈们三类控制语句,分别是条件,循环和分支。
- if条件语句:
示例1:
if 条件
then
代码块
fi
示例 2:
if 条件;then
代码块
fi
else 分支:
if 条件;then
代码块 1
else
代码块 2
fi
elif分支:
if 条件 1;then
代码块 1
elif 条件 2; then
代码块 2 …
elif 条件 n; then
代码块 n
else
代码块 n+1
fi
- 循环
bash支持 三种不同的循环类型:for 循环 while循环和 until循环,在以上三种循环之中,循环体中的语句都包含在do-done语句中间。
for循环
- bash支持的for循环实际是 针对一个列表list的for-each 循环,list是一个字符串的列表,由空白字符分隔,list也支持通配符,也可以缺省,如果缺省,则for循环会自动使用 当前的参数列表($x)来作为list
示例:
for arg in [list]
do
命令
done
C风格的 for循环:
for ((表达式 1; 表达式 2; 表达式 3))
do
命令
done
例子1:
#!/bin/bash
if [ $1 = "weekdays" ];then
echo "weekdays"
for wd in monday tuesday wednesday thursday friday
do
echo $wd
done
elif [ $1 = "weekend" ];then
echo "weekend"
for wd2 in saturday sunday
do
echo $wd2
done
else
echo "wrong"
echo "wrong inputs"
fi
C风格
#!/bin/bash
for ((i=0; i < 7; i++))
do
echo $i
done
while循环
while为判断条件是否 达到,如果达到了就反复执行 ,直到为假 时结束:
while [条件]
do
命令
done
C风格:
while ((表达式))
do
命令
done
示例:
#!/bin/bash
i=0
while [ "$i" -le "$#" ]
# $# 代表命令行参数的个数
do
eval tmp=\$$i # 以变量 i 的值为变量名再取值
echo "$tmp"
i=`expr $i + 1`
done
echo
j=0
while ((j++ <= i))
do
eval tmp=\$$j
echo "$tmp"
done
这里所说的C风格,是指条件表达式内是这样的
until循环
until 循环与 while 结构类似,但 util 循环的语义是条件为假时反复执行循环体,直到条
件变为真时才结束。
until [条件]
do
命令
done
C风格:
until ((表达式))
do
命令
done
在所有的shell循环结构内,都可以使用break或者continue跳出循环,语义和C语义相同,不同点在于,break或continue内可以带一个数字,表示跳出几重循环,默认为1
- 只有bash支持这种风格,如果使用sh解释器 会出问题
case 分支结构
Shell 中的分支结构主要就是 case-esac 语句。该结构与 C 语言中的 switch-case 结构非常
类似。
case " $var" in
" $cond1")
命令
;;
" $cond2")
命令
;;
esac
其中每个条件行都用“)”结尾,每个条件块都以双分号结尾,esac 终止整个分支结构。