一、基础语法
【重要】shell脚本中的赋值语句,前后不能出现空格。
例如:
num1 = “ABC” #这是错误的写法,不能有空格
num1=“ABC” #这是正确的写法
1.shell中彩色输出
- echo -e 扩展
#!/bin/bash
# This is echo color shell
# by author rivers 2021.09-23
# 字体颜色
for i in {31..37}; do
echo -e "\033[$i;40mHello world!\033[0m"
done
# 背景颜色
for i in {41..47}; do
echo -e "\033[47;${i}mHello world!\033[0m"
done
# 显示方式
for i in {1..8}; do
echo -e "\033[$i;31;40mHello world!\033[0m"
done
1.1 if 条件语句
# if条件判断语句,通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断
# 单分支语句 ---比较大小
if [条件表达式];then
语句1
fi
# 双分支if 语句
if [表达式]
语句1
else
语句2
fi
# 多支条件语句 ---判断成绩
if [表达式]
语句1
elif
语句2
elif
语句2
fi
常见逻辑判断符
-f 判断文件是否存在 eg: if [ -f filename ];
-d 判断目录是否存在 eg: if [ -d dir ];
-eq 等于,应用于整型比较 equal;
-ne 不等于,应用于整型比较 not equal;
-lt 小于,应用于整型比较 little;
-gt 大于,应用于整型比较 greater;
-le 小于或等于,应用于整型比较;
-ge 大于或等于,应用于整型比较;
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式;
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式;
-z 空字符串;
-x 是否具有可执行权限
|| 单方成立;
&& 双方都成立表达式。
使用if 分支判断croud进程是否在运行
#!/bin/bash
# this is check crond
# by author rivers on 2021-9.23
# 定义一个变量名
name=crond
num=$(ps -ef|grep $name|grep -vc grep)
:<<EOF
Linux实现长注释的一种方法:以什么开始,就以什么结束,这里是用的EOF,别的也可以。
ps -ef 查看当前的所有进程
-e:等价于 ‘-A’ ,表示列出全部的进程
-f:显示全部的列(显示全字段)
grep $name 查找进程中叫croud的进程
#grep -vc grep 因为grep进程中查找了croud,所有肯定有它本身,这里排除掉了它本身的影响
#grep -v grep 这里的-v是反向选择
#grep -c 表示匹配到的行的数量
EOF
temp=$(jps)
echo "现在的进程有这些:$temp"
#打印出来了所有的进程
if [ $num -eq 1 ];then
echo "$num running!"
else
echo "$num is not running!"
fi
ps aux | head -1 && ps aux | grep proc | grep -v grep
ps aux:显示所有的进程。
head -1:打印标头。
grep proc:显示proc进程。
grep -v:反向查询,显示不含-v参数后指定字符的信息。
grep -v grep:显示不包含grep的进程。
整条指令的作用就是,显示包含"proc"关键字的进程。
判断系统目录是否存在
#!/bin/bash
# this is check directory
# by author rivers on 2021-9.27
if [ ! -d /data/rivers -a ! -d /tmp/rivers ];then
mkdir -p /data/rivers
fi
在这里,我们将使用’! -d’来验证目录是否存在,如果目录不存在,则紧随其后的是逻辑与操作符(&&),打印出目录不存在,如果目录存在,则紧随其后的是逻辑或操作符(||),打印出目录存在。
逻辑是,当[ ! -d /home/linuxmi/linuxmi.com ]的输出为0时,它将执行逻辑与之后的内容,否则它将转到逻辑或(||)并执行逻辑或之后的内容。
$ [ ! -d /linuxmi.com ] && printf '\n no such /linuxmi.com directory exist\n' || printf '\n /linuxmi.com directory exist \n'
类似于上面的条件,但是如果所需目录不存在,它将退出命令。
$ [ ! -d /home/linuxmi/linuxmi.com] && exit
在脚本语言中的一般实现,如果所需目录不存在,它将创建一个目录。
判断学生成绩等级
# if 语句可以直接对命令状态进行判断,就省去了获取$?这一步!
# 如果第一个条件符合就不再向下匹配
#!/bin/bash
# this check grade shell
# by author rivers on 2021-09-27
grade=$1
if [ $grade -gt 90 ];then
echo "Is's very good!"
elif [ $grade -gt 70 ];then
echo "Is's is good!"
elif [ $grade -ge 60 ];then
echo "pass"
else
echo "no pass"
fi
1.2 for循环语句
:<<EOF
格式:for name [ [ in [ word ... ] ] ; ] do list ; done
EOF
for [变量名 in [取值列表]]; do
语句 1
done
1.2.1 检查多台主机存活情况(同一局域网下)
#!/bin/bash
# check hosts is on/Off
# by rivers on 20219-23
Network=$1
for Host in $(seq 1 254)
do
ping -c 1 $Network.$Host > /dev/null && result=0 || result=1
if [ "$result" == 0 ];then
echo -e "\033[32;1m$Network.$Host is up \033[0m"
echo "$Network.$Host" >> /tmp/up.txt
else
echo -e "\033[;31m$Network.$Host is down \033[0m"
echo "$Network.$Host" >> /tmp/down.txt
fi
done
1.3 for循环语句
# While循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于需要循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以while…do开头,done结尾与
#while 关联的还有一个 until 语句,它与 while 不同之处在于,是当条件表达式为 false 时才循环,实际使用中比较少,这里不再讲解。
while (表达式)
do
语句1
done
break和continue语句
# break 和 continue 语句
break 是终止循环。
continue 是跳出当前循环。
#示例 1:在死循环中,满足条件终止循环
while true; do
let N++
if [ $N -eq 5 ]; then
break
fi
echo $N
done
输出: 1 2 3 4
#示例 2:举例子说明 continue 用法
N=0
while [ $N -lt 5 ]; do
let N++
if [ $N -eq 3 ]; then
continue
fi
echo $N
done
输出: 1 2 4
# 打印 1-100 数字
i=0
while ((i<=100))
do
echo $i
i=`expr $i + 1`
done
while循环求1-100的总和
#!/bin/bash
# by author rivers on 2021-9-27
j=0
i=1
while ((i<=100))
do
j=`expr $i + $j`
# expr 是数学计算,
((i++))
done
echo $j
每10秒循环判断系统登陆
[root@web-server01~/script]# vim login.sh
#!/bin/bash
#Check File to change.
#By author rivers 2021-9-27
USERS="hbs"
i=0
while ((i<10))
do
echo "The Time is `date +%F-%T`"
sleep 10
NUM=`who|grep "$USERS"|wc -l`
if [[ $NUM -ge 1 ]];then
echo "The $USERS is login in system."
fi
((i++))
done
1.4 case 选择语句
#Case选择语句,主要用于对多个选择条件进行匹配输出,与if elif语句结构类似,通常用于脚本传递输入参数,打印出输出结果及内容,其语法格式以Case…in开头,esac结尾。语法格式如下:
case 模式名 in
模式 1)
命令
;;
模式 2)
命令
;;
*)
不符合以上模式执行的命令
esac
# 每个模式必须以右括号结束,命令结尾以双分号结束。
1.4.1 使用case编写一个httpd服务启动脚本
[root@web-server01~/script]# vim httpd_start.sh
# check http server start|stop|starus
# by author rivers on 2021-9-27
while true
do
echo -e "
\033[31m start \033[0m
\033[32m stop \033[0m
\033[33m status \033[0m
\033[34m quit \033[0m
"
read -p "请输入你的选择start|stop|quit:" char
case $char in
start)
systemctl start httpd && echo "httpd服务已经开启" || echo "开启失败"
;;
stop)
systemctl stop httpd && echo "httpd服务已经关闭" || echo "关闭失败"
;;
restart)
systemctl restart httpd && echo "httpd服务已经重启" || echo "重启失败"
;;
status)
systemctl status httpd && echo -e "
httpd 的服务状态
;;
quit)
1.5 select语句
具体语法:
#select 是一个类似于 for 循环的语句
#Select语句一般用于选择,常用于选择菜单的创建,可以配合PS3来做打印菜单的输出信息,其语法格式以select…in do开头,done结尾:
select i in (表达式)
do
语句
done
# 选择mysql 版本
#!/bin/bash
# by author rivers on 2021-9-27
PS3="Select a number: "
while true; do
select mysql_version in 5.1 5.6 quit;
do
case $mysql_version in
5.1)
echo "mysql 5.1"
break
;;
5.6)
echo "mysql 5.6"
break
;;
quit)
exit
;;
*)
echo "Input error, Please enter again!"
break
esac
done
done
1.5.1 打印lnmp菜单栏
#!/bin/bash
#by author rivers on 2021-9-27
PS3="Please enter you select install menu:"
select i in http php mysql quit
do
case $i in
http)
echo -e "
\033[31m Test Httpd \033[0m"
;;
php)
echo -e "\033[32m Test PHP\033[0m"
;;
mysql)
echo -e "\033[33m Test MySQL.\033[0m"
;;
quit)
echo -e "\033[32m The System exit.\033[0m"
exit
esac
done
二、常用语法
2.1 grep 【重要】
语法格式:
grep 【options】【pattern】【file】
grep [参数] [匹配模式] [查找的文件]
注意:
1.grep 是 Linux 系统中最重要的命令之一,其功能是从文本文件或管道数据流中筛选匹配的行及数据。
2.grep 命令里的匹配模式或模式匹配,都是你要好找的东西,可以是普通的文字符号也可以是正则表达式。
参数 说明
-c 计算找到‘搜索字符串’的行数
-o 指数出匹配的内容
-i 不区分大小写
-n 显示匹配内容的行号
-r 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作
-v 反向选择,即没有‘搜索字符串’内容的行
-l 列出文件内容符合指定的范本样式的文件名称
-E 扩展 grep,即 egrep,可以使用扩展正则表达式
–color=auto 搜索关键词显示颜色
-V 显示软件版本信息
案例文件:
案例一:
参数举例
参数 -c、-o、-i 举例
grep参考链接:
https://blog.csdn.net/weixin_42408447/article/details/121015806