Shell基础

103 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

基础使用语法

文件抬头

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" # 查看运行情况

请添加图片描述