只要会写Linux命令,就可以写shell脚本。
之前基本上写的shell脚本都是Linux命令的组合,最多加入if else或while循环,连函数都没过。
最近发现shell函数还是有必要的,而且函数一般是抽象后的,可以反复调用,大大简化了脚本。
先上个模板,然后依依拆解,后续如何套用模板。
简单模板
#!/usr/bin/bash
function funname(){
echo "第一个参数 $1"
echo "第一个参数 ${10}"
action
return int
}
function ifelse(){
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
}
function whiledone(){
while condition
do
command
done
}
function caseesac(){
case 值 in
模式1)
command1
...
commandN
;;
模式2)
comman1
...
commandN
;;
esac
}
funname test robot boy
简单示例
#!/usr/bin/bash
contain=("test" "robot" "boy")
function query(){
echo " 这是第一个参数 $1 "
if [ $1 == "test" ]
then
echo "输入参数$1 是test"
num=`docker ps | grep $1 | wc -l`
name=`docker ps | grep $1 | awk -F ' ' '{print $NF}'`
elif [ $1 == "robot" ]
then
echo "输入参数$1 是robot"
num=`docker ps | grep $1 | wc -l`
name=`docker ps | grep $1 | awk -F ' ' '{print $NF}'`
else
echo "输入参数$1 既不是test,也不是robot"
num=`docker ps | grep $1 | wc -l`
name=`docker ps | grep $1 | awk -F ' ' '{print $NF}'`
fi
}
function main(){
for i in ${contain[*]}
do
query $i
echo $num
echo $name
done
}
main
shell 定义一个数组
Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。数组元素的下标由 0 开始。
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下
array_name=(value1 value2 ... valuen)
获取数组中所有元素${array_name[*]}或${array_name[@]}
获取数组长度的方法${#array_name[*]}或${#array_name[@]}
a=(f1 f2 f3 f4)
for i in ${a[*]}或for i in ${a[@]}
shell定义一个函数
function funname(){
echo "第一个参数 $1"
echo "第一个参数 ${10}"
action
return int
}
return后跟数值n(0-255),如果不加,将以最后一条命令的运行结果作为返回值。
函数传参:在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值。注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
$# 传递到脚本或函数的参数个数
$* 以单字符串显示向脚本传递的所有参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
if elif else fi条件
if condition
then
command1
...
commandN
fi
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
for循环
for i in itm itm2 itm3
do
echo $i
done
while循环
while condition
do
command
done
break命令允许跳出所有循环(终止执行后面的所有循环)。continue命令与break命令类似,它不会跳出所有循环,仅仅跳出当前循环。
case ... esac
多选择语句,与其他语言中的switch ... case语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(是case反过来)作为结束标记。
case 值 in
模式1)
command1
...
commandN
;;
模式2)
comman1
...
commandN
;;
esac
Shell 文件引用
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
Shell 文件包含的语法格式如下:
. filename # 注意点号(.)和文件名中间有一空格
或source filename