Linux Shell脚本编程


继续...

感觉之前博客每篇内容太长了,以后为了便于阅读,把每一篇博客拆分一下。


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

输出:

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值