shell脚本编程笔记之函数、test与流程控制(条件 循环 分支)

上一篇文章讲述了脚本编程的基本内容,包括概念,特殊字符,变量与操作符等内容,这相当于基本的操作,但是相比实际的编程还差的是函数和流程控制,以下内容为讲述函数和流控的部分。

  • 简述:脚本也是一个程序,而每一个程序本身都是一个真值表达式,它的真值由其返回值决定。故 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
代码块 2elif 条件 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 终止整个分支结构。

我们都有光明的未来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值