shell知识点浅谈

1、/var/log/messages是Linux下重要的日志文件

清空日志及文件内容的三种方法:
(1) # cat /dev/null > /var/log/messages
(2) # echo > test.log
(3) # > test.log

2、shell在运维工作中的地位

shell脚本适合处理大量纯文本文件,多数启动文件都是纯文本类型的文件,可以运用到配置文件、日志文件的处理

3、shell种类:在UNIX/LINUX中主要有两大类Shell

(1) Bourne shell : 包括bash、ksh、sh,目前已被Bash shell(目前主流)取代

(2) C shell : 包括csh、tcsh

注:查看Linux支持的shell: #cat /etc/shells

4、文件测试表达式

常用文件测试操作符号说明
-f 文件,英文file文件存在且为普通文件为真,即测试表达式成立
-d 文件,英文directory文件存在且为目录时则为真
-s 文件,英文size文件存在且文件大小不为0即为真
-e文件存在则为真
-r/-w/-x判断文件是否可读/可写/可执行
file1 -ef file2判断两个文件是否是统一设备文件或硬链接

file1 -L file2 判断两个文件是否是同意文件的软链接

忘记之后查找:man test

实践:
(1)[ -f filename ]&&echo 1 || echo 0   #判断文件是否存在,存在1,不在0;
(2)file = /root/order  设置变量
     #[ -f $file ]&&echo 1||echo 0  判断变量对应的是否是文件 
方法:高效文件判断
(1)|| :前面不满足才执行后面
   # [ -f filename ]||echo 1
 (2) && :前面满足执行后面
   # [ $1 -eq 3 ] && {
       echo 1;
       echo 2;
       echo 3;
   }

注:学习Shell脚本编程多看系统服务配置文件脚本

5、字符串表达式

查看:man test 查看下方STRING部分

常用字符串测试操作符说明
-z “字符串”若字串长度为0则真,z:zero
-n “字符串”若字串长度不为0则真,no zero
“串1” == “串2”两字串相等为真(==/= 均可)
“串1” != “串2”若两字串不等则真

注:1、以上表格中的字串必须用 ” “引起来

​ 2、比较符号的两端必须有空格

实战:
(1) [ -z "abc" ]&&echo 1||echo 0
    [ ! -z "abc" ] 注:在测试[]中加 !号意为取反,相当于 -n
(2) 定义变量:test="abc"
    # [ -z $test ]&&echo 1||echo 0
    # [ "$test" = "abc" ] 注意:$ 取变量值 ,在字串比较是也需加" "
(3)[ -z $test ]&& test="abc"  #判断test是否长度为0,是的话为变量赋值

另附:linux学习就是字符串的处理

6、Shell整数比较

操作符说明
-eq (==或=)相等
-ne (!=)不等于 not equal
-gt (>)大于 greater than
-ge (>=)大于等于
-lt(<)小于 less than
-le(<=)小于等于
实战:
(1)[ 2 -eq 1 ]&&echo 1||echo 0
(2)[ 2 \> 1 ]&&echo 1||echo 0 单括号用运算符需转义
    若不想转义用双[]  如:[[ 2 > 1 ]]&&echo 1||echo 0

注:1、整数加引号比较也是对的

​ 2、[]用比较符需要转义 >,若不想转义需用[[ ]];

​ 3、工作中用-eq等字符代替,避免是用比较符,可以规避问题

7、逻辑操作符

在[]和test中使用的逻辑操作符在[[]]中使用的操作符说明
-a&&and与,两端都真,才真
-o||or或,一端真就真
not非,相反则真

注:这些符号必须在使用中记忆

实战:
(1)file1=/root/aaa;file2=/root/bbb
   # [ -f $file1 -a -f $file2 ]&&echo 1||echo 0 或
   # [ -f $file1 && -f $file2 ]&&echo 1||echo 0
 (2) # [ -f $file1 -o -f $file2 ]&&echo 1||echo 0 或
     # [ -f $file1 || -f $file2 ]&&echo 1||echo 0

8、综合案列

开发shell脚本分别实现定义变量,脚本传参以及read读入的方式比较两个整数大小,并用条件语句进行判断并以屏幕输出的方式提示用户比较结果。

注:开发三个脚本,当用脚本传参以及read读入的方式需要对变量是否是数字、并且传参个数不对予以提示

read命令:Linux中提示输入的语句

(1)  c1.sh
#!/bin/bash
read -p "please input two num:" num1 num2
a=$num1
b=$num2
#判断个数
[ -z "$a" -0 -z "$b" ]&&{
    echo "usage:num not eq 2"
    exit 1  #退出
}
#判断是否是整数
[ "`echo "$a"|sed -r 's#[^0-9]##g'`" = "$a" ] ||{
    echo "first num must be int"
    exit 2
}
[ "`echo "$b"|sed -r 's#[^0-9]##g'`" = "$b" ] ||{
    echo "secord num must be int"
    exit 2
}
#两整数比较
[ $a -lt $b ] &&{
    echo "$a < $b"
    exit 0
}
[ $a -eq $b ]&&{
    echo "$a = $b"
    exit 0
}
[ $a -gt $b ]&&{
    echo "$a > $b"
    exit 0
}

9、综合案列–打印一级菜单一键安装web服务

#!/bin/bash
menu(){
cat << END
    1.[ install lamp ]
    2.[ install lnmp ]
    3.[ exit ]
    pls input the num you want:
END
}
memu0
read num
[ "$num" == 1 ]&&{
    echo "start installing lamp"
    [ -x /root/lamp.sh ] || exit 2
    /root/lamp.sh
    exit 0
}
[ "$num" == 2 ]&&{
    echo "start installing lnmp"
    [ -x /root/lnmp.sh ] || exit 3
    /root/lnmp.sh
    exit 0
}
[ "num" == 3 ]&&{
    echo ""bey."
    exit 0
}
echo "input error"
exit 0

分支与循环结构

1、if 条件语句

(1) 单分支结构
if [ 条件 ]
  then
    指令
fiif [ 条件 ];then
   指令
fi
(2)双分支结构
if [ 条件 ]
  then
    指令集1
else
    指令集2
fi
(3)多分支结构
if [ 条件1 ]
   then
     指令集1
elif [ 条件2 ]
   then
     指令2
else
     指令3
fi

2、案列实践

开发一个shell脚本判断系统剩余的内存大小,如果低于100M就报告给管理员,并且加入系统的定时任务每三分钟执行一次检查

第一步:去内存值,并发邮件
Free=`free -m|awk 'NR==3 {print $NF}'`
if [ "$Free" -lt 100 ]
   then
   mail -s "System space is not sufficient 100MB" >2462108717@qq.com
fi
第二步:设置定时任务
#crontab -l
*/3 * * * * /bin/bash /root/anlie.sh > /dev/null 2>&1

3、监控Web、MySQL的办法

案列:监控MySQL、web
1、根据端口监控
本地监控(同一机器上):netstat、ss、lsof
lsof -i :3306|grep mysql |wc -l
netstat -ntlp|grep 3306(或者mysqld)|wc -l       监控MySQL
netstat -ntlp|grep 80(httpd)|wc -l      监控web
远程监控(不在同一机器上):telnet/nmap/nc
echo -e "\n" | telnet baidu.com 80|grep connected
nnmap www.baidu.com -p 80 | grep open |wc -l (常用,若没有yum 安装)

2、根据进程判断
ps -ef  |grep mysql|wc -l

3、监控MySQL的脚本
vim check_db.sh

#!/bin/bash
if [ "netstat -ntlp|grep 3306|awk -F "[ :]+" '{print $5}'" = "3306" ]
# if [ `nmap 10.0.0.7 -p 3306 2>/dev/null|grep open|wc -l` -gt 0 ]
then
  echo "MySQL is running"
else
  echo "MySQL is stopped"&&{
      systemctl start mysqld
      systemctl enable mysqld
  }
fi
  
4、监控web的脚本(正确返回中有: HTTP/1.1 200 OK) 200|302|301都是正确的
vim check_web.sh

#!/bin/bash
if [ "curl -s http://10.0.0.7 &>/dev/null &&echo $?" = "0" ]
# if [ `curl -I http://10.0.0.7 > /dev/null|head -1|grep 200|wc -l` -eq 1 ]
then
  echo "Httpd is running"
else
  echo "Httpd is stopped"&&{
      systemctl start httpd
      systemctl enable httpd
  }
fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Star星屹程序设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值