目录
会定义变量,会使用系统变量,会捕捉命令的返回值,还不够,
有了变量,还要有表达式和控制结构,才能叫”程序”。
进阶部分将多以案例来说明。
1.Shell流程控制
流程控制与条件判断一般要结合使用,通过实例代码可以更好的理解:
1.1 if else if
# 格式
if condition
then
command1
command2
...
commandN
fi
# ----------------分割线---------------------
# 以下为案例:创建一个目录 dir1, 如果创建成功,则显示 ok;如果失败,则显示 fail
#!/bin/bash
if mkdir dir1
then
echo ok
else
echo fail
fi
1.2 if else:
if condition
then
command1
command2
...
commandN
else
command
fi
1.3 if else-if else
if else-if else 语法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
1.4 for 循环
列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。
in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。
# -------------------语法----------------
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
#!/bin/bash
# -------------------案例----------------
list="rootfs usr data data2"
for i in $list;
do
echo $i is appoint ;
done
# -------------------输出结果----------------
rootfs is appoint
usr is appoint
data is appoint
data2 is appoint
循环还有while,break,continue等关键字的用法,功能和其他高级语言一致,不过多的进行演示。
2. Shell 函数
说明:
- 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
下面的例子定义了一个函数并进行调用:
#!/bin/bash
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
# ------------分割线:输出结果---------------------------
-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----
下面定义一个带有return语句的函数:
#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
#-----------------分割线:输出结果----------------------------
这个函数会对输入的两个数字进行相加运算...
输入第一个数字:
1
输入第二个数字:
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 !
函数返回值在调用该函数后通过 $? 来获得。
注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
$? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得。
3. Shell test 命令
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
数值测试
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
字符串测试
参数 | 说明 |
---|---|
= | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
4. shell脚本隔几秒执行sleep命令
shell中可以调用其他的启停脚本,有的脚本执行需要等其他的启动完成才可以,因此有必要增加时间控制,进行等待,使用sleep命令,后面直接跟秒数。如下:
cmd(shell 命令)
sleep x(x为秒数)
5.书写规范
- 脚本文件名称以.sh结束
- 脚本开头一定要指定解释器
- 脚本中#代表注释,#后的内容不会执行,不用的命令等可以用#注释掉,脚本中尽量不要出现中文注释以免出现因字符集不同产生乱码
- 代码符号书写规范
1.成对的符号一定要都写出来再添加内容,避免遗忘漏写;如 "" '' []等, []里面两端必须有空格,中间写内容
2.流程控制语句一次书写完,再添加内容;(if 条件 ; then 内容;fi)
3.书写的代码符号都是英文输入法格式
4.通过缩进让代码易读
6. 常用函数
6.1 shell脚本获取当前路径
#方法一
#!/usr/bin/env bash
Cur_Dir=$(pwd)
echo $Cur_Dir
#方法二
#!/usr/bin/env bash
basedir=cd $(dirname $0); pwd -P
echo $basedir
其中,
dirname $0,取得当前执行的脚本文件的父目录
cd dirname $0
,进入这个目录(切换当前工作目录)
pwd,显示当前工作目录(cd执行后的)
参考资料:
Alan.Zhang:https://www.cnblogs.com/zeq912/p/9501915.html
菜鸟教程:https://www.runoob.com/linux/linux-shell.html