本文已参与「新人创作礼」活动,一起开启掘金创作之路。
基础使用语法
文件抬头
demo.sh
#!/bin/bash
#【告诉系统该脚本为shell脚本】
# This is a shell 【注释】
echo "Is sh!"
运行方式
# 方式1
chmod o+x demo.sh # 添加执行权限
./demo.sh # 运行
# 方式2
/bin/sh demo/sh
测试脚本语法
/bin/bash -n name.sh
引用变量
num=123
echo "Number: $num"
获取命令结果
#!/bin/bash
echo `date +%Y%m%d` # `date +%Y%m%d`获取建立的日期
# 脚本会首先执行``内的命令
常见系统变量
$0 当前程序的名称
$n 当前程序的第n个参数
$* 当前程序的所有参数(不包括程序本身) # 类似于C语言中的命令行参数
$# 当前程序的参数个数(不包括程序本身)
$? 命令或执行完后的状态,一般返回0表示成功
$UID 当前用户的ID
$PWD 当前所在的目录
==打印显示颜色==
echo -e '\033[32m---\033[0m' # ---会显示颜色 0m仅此行 1m以下所有行
条件流程控制语句
逻辑运算符解析
| 参数 | 描述 |
|---|---|
| -f | 判断文件是否存在 |
| -d | 判断目录是否存在 |
| -eq | 等于 【应用于:整形比较】 |
| -ne | 不等于 【应用于:整形比较】 |
| -lt | 小于 【应用于:整形比较】 |
| -gt | 大于 【应用于:整形比较】 |
| -le | 小于或等于 【应用于:整形比较】 |
| -ge | 大于或等于 【应用于:整形比较】 |
| -a | 双方都成立(and) [逻辑表达式] -a [逻辑表达式] |
| -o | 单方成立(or) [逻辑表达式] -a [逻辑表达式] |
| -z | 空字符串 |
==示例==
#!/bin/bash
# 实现判断文件是否存在
FILE=/home/demo.txt
if [ ! -f $FILE ];then
echo "demo" >> $FILE # 如果不存在则新建文件并追加 [>>追加 >覆盖]
else
cat $FILE
fi
IF条件语句
if ((条件));then
语句
else
语句
fi
==示例==
if (($1>10));then # [[$1>10]]和(($1>10)) 是运算的意思 语法一致
echo "True"
else
echo "False"
fi
for循环语句
#!/bin/bash
for i in `seq 1 5` # seq 产生从某个数到另外一个数之间的所有整数
do
echo "The number is $i"
done
#!/bin/bash
j=0
for ((i=1;i<100;i++))
do
j=`expr $j + $i` # expr加法运算
done
echo $j
while循环
while 条件
do
语句
done
==示例==
#!/bin/bash
i=0
while [[ $i -lt 10 ]]
do
echo "This is number is $i"
((i++))
done
Until循环语句
until 条件
do
action
done
# 直到满足条件才退出,否则执行action
==示例==
#!/bin/bash
# 实现基础循环
i=10
until [[ $i -eq 0 ]]
do
echo "i=$1"
((i--))
done
Case选择语句
case $lst in
choice1) # 选择1则运行语句1
语句1
;;
选择2) # 选择2则运行语句2
语句2
;;
*) # 否则运行语句3
语句3
;;
esac
==示例==
#!/bin/bash
# 简单实现菜单栏
case $1 in
one)
echo "You choice one."
;;
two)
echo "You choice two."
;;
three)
echo "You choice three."
;;
*)
echo "None"
esac
Select选择语句
# 一般用于选择菜单的创建
select parm in choice1 choice2 choice3
do
echo "You choice: "$parm
done
==示例==
#!/bin/bash
# 选择最爱的水果
PS3="What's you favorite fruit: "
select fruit in "apple" "pear" "orange" "banana"
do
echo "I like " $fruit
done
==select与case选择语句结合==
#!/bin/bash
# 选择最爱的水果
PS3="What's your favorite fruit:"
select fruit in "apple" "pear" "orange" "banana"
do
case $fruit in
apple)
echo "I like $fruit"
;;
pear)
echo "I like $fruit"
;;
orange)
echo "I like $fruit"
;;
banana)
echo "I like $fruit"
;;
*)
exit # 退出脚本
esac
done
一维数组
# 定义数组
L=(Mike John Tom Lila)
# 获取数组元素 i为数组下标 从0开始
${L[i]}
# 获取数组所有内容
${L[@]}
# 获取数组长度
${#L[@]}
# 替换数组元素[将Ton替换为Jack]
${L[@]/Tom/Jack}
# 删除第i个元素
unset L[i]
函数
==定义函数==
function name()
{
...
...
}
name # 执行函数
自动监控vsftpd运行状态
#!/bin/bash
# filename: monitor.sh
txt="
######################## Error ########################\n########### Server: vsftpd\n########### Time:`date`\n#######################################################\n"
while true
do
report=`systemctl status vsftpd| sed -n '3p'|cut -d ')' -f 1`
status=${report#*(}
if [ $status == "dead" ];then
echo -e $txt | mail -s "Error report" xxxx@xx.com # 发送邮件
# echo -e 内容 | mail -s 标题 地址
exit # 退出脚本
fi
sleep 30m # 间隔30分钟
done
==添加权限==
chmod +x monitor.sh
chmod +x /etc/rc.d/rc/loacl
# 添加到开机自动执行
vim /etc/rc.d/rc.local
.../monitor.sh # 添加内容 ...为脚本路径
# 重启
ps -aux |grep "monitor.sh" # 查看运行情况