继续...
感觉之前博客每篇内容太长了,以后为了便于阅读,把每一篇博客拆分一下。
3、脚本编程
3.1 命令、函数与脚本返回值
脚本也是一个程序,而每一个程序本本身都是一个真值表达式,它的真值是由其返回值决定的,故shell脚本应该返回一个值,若脚本未显示指定返回值,则自动使用最后一条命令的返回值;如果需要显示指定脚本的返回值,则需要用exit命令实现。
#!/bin/sh
echo "hello,shell!"
false #false命令返回值恒为1;
exit 0 #显示指定脚本返回0
3.2 函数
Bash脚本中也可以定义函数,Bash里的函数行为像一个独立的子脚本,故对于调用者来说,shell中函数和一个独立命令区别并不大。
Bash中有两种定义函数的方法
1. 通过关键字function来定义
fuction function)name{
command...
}
2. 直接定义
fun(){
echo "hello,Shell!"
}
注意:
- 推荐使用后一种方法,可移植性更好
- Bash中没有类似于C中提前“声明”函数的方法,任何函数都应该在其被调用前完整定义
- 函数调用方法就像使用命令一样来运行
#!/bin/sh
echo "next is fun()"
fun(){
echo "i am ztt";
}
fun
输出:
3.3 test
3.3.1 文件测试
文件测试通常基于文件属性进行判断,在系统管理脚本或者启动脚本中很常用。
3.3.2 整数比较
test测试可以对整数进行测试,对整数测试,有时候也可以使用双小括号结构(( ))
3.3.3 字符串比较
test提供了一些字符串比较,在启动脚本或者系统管理脚本中很常见。
3.3.4 混合比较
test也支持多个表达式之间进行逻辑运算得到一个真值,其中-a表示“与”(AND),-o表示“或”(OR)运算
3.4 流程控制
Bash通常提供三类流程控制语句,分别是条件、循环和分支。
3.4.1 条件
1. 最常用的流程是条件,基本结构如下:
#case 1
if 条件
then
代码块
fi
#case 2
如果if和then写在同一行,需要加分好
if 条件;then
代码块
fi
if命令需要使用fi来表示结束。
2. 条件也可以带一个else分支,当条件不成立的时候执行:
#if 条件;then
代码块
else
代码块
fi
3. 如果有多个并列且互斥的条件,则可用多个elif来依次判断条件:
if 条件;then
代码块1
elif 条件2;then
代码块
...
elif 条件n;then
代码块n+1
fi
3.4.2 循环
Bash中支持三种不同类型的循环:for循环、while循环和until循环,无论何种形式,循环体中的语句都包含在do-done语句之间。
1. for循环
(1)Bash支持通常意义上的for循环,但是默认Bash的循环实际上是针对一个列表的for-each循环,形式通常如下:
for arg in [list]
do
命令
done
list是一个字符串列表,由空白字符分离。list支持通配符,也可以缺省,如果list缺省,for循环则自动使用当前的参数列表($@变量)来作为list。
(2)Bash也支持C风格的for循环条件,在循环变量是整数时会更方便。循环程序结构如下:
for((表达式1; 表达式2; 表达式3))
do
命令
done
表达式1是循环执行前的初始化,表达式2是一个代表循环逻辑测试的逻辑表达式,表达式3是每次循环体执行完后的处理。
2. while循环
while循环是测试一个条件,并反复执行循环体到条件为假时结束,也有Shell和C两种风格。
#Shell风格while循环
while[条件]
do
命令
done
#C风格while循环
while((表达式))
do
表达式
done
3. until循环
until循环与while循环结构类似,但until循环的语义是条件为假时反复执行循环体直到条件变为真才结束。结构如下:
until[条件]
do
命令
done
或者
until((表达式))
do
命令
done
所有Shell循环结构都可以使用break或者continue跳出循环,语义和C语言相同。不同之处在于break或者continue都可以带一个数字指示跳出几重循环,缺省为1。
3.4.3 分支
shell中的分支结构主要就是case - esac语句。该结构与C语言中的switch - case 结构非常相似。
case结构的基本程序结构如下:
case " $ var" in
" $ cond1")
命令
;;
" $ cond2")
命令
;;
esac
每个条件都是用“)”结尾,每个条件块都以双分号结尾,esac终止整个分支结构。
注意:
每个变量使用双引号(" ")并不是强制的。条件中可以使用通配符,可以用 * 适配默认条件。
#!/bin/bash
clear
#this is a if test
echo "#################################"
echo "this is a if-condition test"
ifpar=1;
if [ $ifpar -eq 1 ] ;then
echo "ifpar=${ifpar}"
#else if ${ifpar}==2;then
# echo "ifpar=${ifpar}"
#else
# echo "ifpar=${ifpar}"
fi
#this is a for test
echo "#################################"
echo "this is a for-loop test"
i=1
for((;i<=3;i++))
do
echo "hello";
done
#this is a while test
echo "#################################"
echo "this is a while test"
while((looppar<3))
do
echo "while-loop"
looppar=${looppar}+1;
done
#this is a case test
echo "#################################"
echo this is a case test
echo ${i}
case "$i" in
1)
echo 1
;;
2)
echo 2
;;
3)
echo 3
;;
*)
echo none
;;
esac
输出: