当前位置: 首页 > news >正文

shell基础:通过7个实例入门shell编程

编程的学习有两种方式,一种是先学习理论再进行实战,这叫自下而上学习法,第二种是通过实战再学习理论,这叫自上而下学习法,对于shell脚本学习来说,自上而下学习法是最好的学习方式。

实例1:通过脚本检查服务状态:

#!/bin/bash
#set -x
if [ $# -ge 1 ];then
        systemctl status $1 > /dev/null;
        if [ $? -eq  0 ];then
         echo "$1 is `systemctl status $1 | sed -n 3p | awk '{print $2,$3}'`"
        else
         echo "$1未运行,或检查$1是否是有效的服务名称"
        fi
else
        echo "请在此命令后加上参数:sh $0 服务名称"

fi

shell命令都是以#!/bin/bash开头,set -x表示显示代码执行过程,-v表示显示代码

if语句需要以fi结束,当then和if在同一行时,需要加分号,if的条件写在一个中括号中,要注意空格,if和中括号之间有空格,中括号中的参数和中括号也需要有空格。

$# 表示输入的参数个数,$1 表示输入的第一个参数,其他数值同理

-ge表示大于等于;-gt表示大于;-eq表示等于;-le表示小于等于;-lt表示小于;-ne表示不等于

 systemctl status $1 > /dev/null;语句的意思是查询输入的第一个参数的运行状态,并重定向到一个空文件中,不会屏显任何信息。

$?查询前一条命令的执行结果,如果返回0表示前一条命令执行成功,否则表示执行失败,如:

我先查询mysql的执行状态,使用$?命令后显示0,因为前一条命令执行成功。

`systemctl status $1 | sed -n 3p | awk '{print $2,$3}'`这条语句需要注意的是要写在反引号中,“|”为通道,即前面的输出是后面的输入,这条语句的意思为查询参数1的服务状态,选择输出内容的第三行,选择第二列和第三列,即上图中的active(exited)

学习上面的内容后这条脚本的意思就理解清楚了,首先判断参数的个数,如果参数个数等于1,则查询这个参数的状态,如果查询结果成功,则输出结果。

实例2:通过脚本检查多个服务状态:

#!/bin/bash
#set -x
if [ $# -gt 0 ];then
 for i in $@
  do
   systemctl status $i &> /dev/null
   if [ $? -eq 0 ];then
    echo "$i is `systemctl status $i |sed -n 3p|awk '{print $2,$3}'`"
   else
    echo "$i 未正常运行"
   fi
  done
else
 echo "请加参数:bash $0 SERVICE_NAME"
fi

实例2在实例1的基础上增加了一个for循环,shell中的for循环格式如下:

for   do  ...  done

这里还用到了$@,类似于把输入的参数按照空格分隔为数组,通过for循环分别读取参数,其余的操作和实例1类似。

实例3:if的用法

#!/bin/bash
read -p "please input your record" cj
if [ $cj -ge 0 ]&&[ $cj -le 59 ];then
 echo "补考"
elif [ $cj -ge 60 ]&&[ $cj -le 70 ];then
 echo "一般"
elif [ $cj -ge 71 ]&&[ $cj -le 85 ];then
 echo "良好"
elif [ $cj -ge 86 ]&&[ $cj -le 100 ];then
 echo "优秀"
else
 echo "Please input a valid record(0-100)"
fi

read命令读取输入的参数给到自己设置的变量cj,-p表示输出一条提示

实例4:for循环的用法1

#!/bin/bash
s=0
for((i=1;i<=10;i++))
 do 
  s=$[$s+$i]
 done
echo $s

这段代码的意思是求10以内数字的累加之和,当中括号用在运算中时,符号之间不需要加空格

实例5:for循环的用法2

#!/bin/bash
echo "---------------------"
for i in "$*"
 do
  echo "god bless $i"
 done

echo "---------------------"
for j in "$@"
 do
  echo "I love $j"
 done
echo "-------------------"

当不加双引号时,$*$@的作用一样,表示循环读取命令行参数,加了引号之后,“$*”表示输出一个整体,效果如下:

实例6:while循环的用法

#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
 do
  s=$[$s+$i]
  i=$[$i+1]
 done
echo $s

while循环的格式和for循环相似,这段程序表示100以内数字累加之和

实例7:函数的用法

#!/bin/bash
read -t 5 -p "Please input number: " p1
read -t 5 -p "Please input number: " p2
function sum()
{
s=0;
s=$[$1 + $2]
echo $s
}
sum $p1 $p2

shell中的函数和c语言中的函数类似,但是他不需要在括号中输入参数,上面这段代码的意思就是求输入的两个参数之和。read命令在这里多了一个-t参数,表示5秒内如果不操作,就会跳过。

相关文章:

  • activiti学习资料(架构描述)
  • Shell脚本批量添加和删除用户的多种方法
  • 使用shell脚本进行每月定时备份数据
  • 安装Zabbix过程中出现的问题集
  • Shell屏蔽每小时SSH暴力破解超过N次的ip,再也不用担心云服务器被暴力破解了
  • ios 跳转的运用 push和modal
  • 如何优雅的将Thymeleaf集成到SpringBoot
  • 开发基于SpringBoot和BootStrap的全栈论坛网站(一):准备阶段
  • 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能...
  • 开发基于SpringBoot和BootStrap的全栈论坛网站(二):后端人员如何快速使用BootStrap
  • java虚拟机(三)java的垃圾回收机制详解
  • 查看ORACLE的实际执行计划
  • 开发基于SpringBoot和BootStrap的全栈论坛网站(三):登陆注册以及cookies的功能完成
  • 开发基于SpringBoot和BootStrap的全栈论坛网站(四):完成问题发布功能
  • OSChina 周日乱弹 ——冯小牛 我要治愈你!
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Android开源项目规范总结
  • angular2 简述
  • bootstrap创建登录注册页面
  • Consul Config 使用Git做版本控制的实现
  • Elasticsearch 参考指南(升级前重新索引)
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Nodejs和JavaWeb协助开发
  • PHP 的 SAPI 是个什么东西
  • Redis 中的布隆过滤器
  • text-decoration与color属性
  • 从零开始在ubuntu上搭建node开发环境
  • 今年的LC3大会没了?
  • 前端学习笔记之观察者模式
  • 删除表内多余的重复数据
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 微信小程序设置上一页数据
  • 正则学习笔记
  • ​520就是要宠粉,你的心头书我买单
  • #if #elif #endif
  • #Java第九次作业--输入输出流和文件操作
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (06)金属布线——为半导体注入生命的连接
  • (33)STM32——485实验笔记
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二)windows配置JDK环境
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (四)鸿鹄云架构一服务注册中心
  • (一)80c52学习之旅-起始篇
  • (转)c++ std::pair 与 std::make
  • (转)iOS字体
  • (转)项目管理杂谈-我所期望的新人
  • (转)原始图像数据和PDF中的图像数据
  • (转载)Linux网络编程入门
  • (轉)JSON.stringify 语法实例讲解
  • ***监测系统的构建(chkrootkit )
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net 使用ajax控件后如何调用前端脚本
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递