【Linux shell脚本知识记录】

一、基础语法

【重要】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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值