shell编程(上)

原文链接: https://my.oschina.net/u/3991860/blog/3001066

一、shell是什么

• shell是一种脚本语言   blog.lishiming.net

• 可以使用逻辑判断、循环等语法

• 可以自定义函数

• shell是系统命令的集合

• shell脚本可以实现自动化运维,能大大增加我们的运维效率

 

二、shell脚本结构和执行方法

• 开头需要加#!/bin/bash

• 以#开头的行作为解释说明

• 脚本的名字以.sh结尾,用于区分这是一个shell脚本

• 执行方法有两种

• chmod +x 1.sh; ./1.sh

• bash 1.sh

• 查看脚本执行过程 bash -x 1.sh

• 查看脚本是否语法错误  bash -n 1.sh

 

三、date命令的用法

date    //显示系统当前的日期和时间

d4c6d49dba6911fdf31927e6403a9a280da.jpg

date +%Y             //显示年,四位数

date +%y              //显示年,两位数

edfa963821ffb57c998a8076b32d10d92ce.jpg

date +%m         //显示月

ae5c44865f8f01521efb84393e6ad8260aa.jpg

date +%M       //显示分钟

edfa963821ffb57c998a8076b32d10d92ce.jpg

date +%d       //显示日期

61b51eb1bd128ccd9d2d1edeeed7897f2bc.jpg

date +%D       //显示月日年

ddbcfeb74d04dc93f86867ea06e9f22dab5.jpg

date +%Y%m%d           //显示年月日

date +%F                       //显示年月日

b07b289ef1fe3d6a8aaaaaa6e8ea74bb2df.jpg

date +%H       //显示小时

ac37ad8afcc7c229d5406b331649ac0af82.jpg

date +%S          //显示秒

9358e563c747f29e4db7b953440466722f8.jpg

 

date +%T                        //显示时间

date +%H:%M:%S            //显示时间

da7efc3ff089a050dc49bd05ce065d2e1e9.jpg

date +%w         //显示星期

f94722d303eb8a2193b1716f8ad54b1fcb5.jpg

 

date +%W      //显示今年的第几周

43f6579e0e5179677340e2f964266bc97f4.jpg

cal          //显示日历的格式

shell编程(上)_第1张图片

date -d "-1 day"             //显示一天前的日期

95e7977a98823eddb007a170b56bcd4057b.jpg

date -d "-1 day" +%F           //显示前一天日期

86dc8f255c1aaf207be4162c6886a7d2ad6.jpg

date -d "-1 month" +%F      //显示前一个月的日期

b3aae5a7710529107ae6920753cc7f35c1e.jpg

date -d "-1 year" +%F       //显示前一年的日期

c95ff91220920e1f138647c5cd566e0aac1.jpg

date -d "-1 hour" +%T       //显示一个小时前的时间

1494963d80612a908f87def17e248803710.jpg

date -d "-1 min"          //一分钟前

a57578097a07ce5619a8e82de58621724ec.jpg

date +%s         //显示时间戳

date -d @1547085141         //显示时间戳的时间

d5177d2b27a2a21d5a800f1e7b2534ea890.jpg

date +%s -d "2019-01-10 09:52:21"          //具体日期换算成时间戳

aba083771503b644445b188cfbfa9c2a4e5.jpg

 

 

四、shell脚本中的变量

• 当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替

• 使用条件语句时,常使用变量    if [ $a -gt 1 ]; then ... ; fi

• 引用某个命令的结果时,用变量替代   n=`wc -l 1.txt`

• 写和用户交互的脚本时,变量也是必不可少的  read -p "Input a number: " n; echo $n   如果没写这个n,可以直接使用$REPLY

• 内置变量 $0, $1, $2…    $0表示脚本本身,$1 第一个参数,$2 第二个 ....       $#表示参数个数

• 数学运算a=1;b=2; c=$(($a+$b))或者$[$a+$b]

 

 

五、shell中的逻辑判断

• 格式1:if 条件 ; then 语句; fi

用命令行模式执行

shell编程(上)_第2张图片

脚本执行模式

shell编程(上)_第3张图片

 

• 格式2:if 条件; then 语句; else 语句; fi

shell编程(上)_第4张图片

 

 

• 格式3:if …; then … ;elif …; then …; else …; fi

shell编程(上)_第5张图片

 

• 逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 ,注意到处都是空格

-gt:大于(>)                  -ge:大于等于(>=)

-lt:小于(<)                   -le:小于等于(<=)

-eq:等于(==)              -ne:不等于(!=)

01794524e15ba7712791a07252d040d8ad5.jpg

 

• 可以使用 && || 结合多个条件

&&:并且

||:或者

• if [ $a -gt 5 ] && [ $a -lt 10 ]; then

• if [ $b -gt 5 ] || [ $b -lt 3 ]; then

 

 

六、if 判断文件、目录属性

• [ -f file ]判断是否是普通文件,且存在

shell编程(上)_第6张图片

shell编程(上)_第7张图片

 

• [ -d file ] 判断是否是目录,且存在

shell编程(上)_第8张图片

 

• [ -e file ] 判断文件或目录是否存在

shell编程(上)_第9张图片

目录和文件都可以使用touch

如果文件或目录不存在,touch会创建一个文件

如果文件或目录存在,touch会改变文件的atime、mtime、ctime

 

• [ -r file ] 判断文件是否可读

shell编程(上)_第10张图片

 

• [ -w file ] 判断文件是否可写

shell编程(上)_第11张图片

 

• [ -x file ] 判断文件是否可执行

shell编程(上)_第12张图片

 

判断文件是否存在,存在就删除该文件

efea748866e81bea2b4d7a47f02a21655d5.jpg

等同于

shell编程(上)_第13张图片

 

当这个文件不存在,才会执行后面这条命令

03c6bb5dcf5b3de1065bd67cd39e5f2ef57.jpg

等同于

shell编程(上)_第14张图片

 

七、if判断的一些特殊用法

• if [ -z "$a" ]  这个表示当变量a的值为空时会怎么样

 

判断一个文件的行数,如果文件不存在,或者没数值,执行脚本会报错

shell编程(上)_第15张图片

此时就需要嵌套一个逻辑判断

shell编程(上)_第16张图片

等同于

shell编程(上)_第17张图片

完整的脚本

shell编程(上)_第18张图片

 

 

• if [ -n "$a" ] 表示当变量a的值不为空

变量需要双引号,文件不需要

可以判断一个文件是否不为空

f62b703da5cc8dfdfdd7ef471782364a305.jpg

判断一个变量是否为空

0f5471c3314b01430abb9f9f11f48b5a560.jpg

 

• if grep -q '123' 1.txt; then  表示如果1.txt中含有'123'的行时会怎么样

判断某一个文件中是否包含哪些字符串(例:判断系统用户是否有user1)

27c242667295d9762286cc4e4113257b286.jpg

判断如果用户存在,则输出user1 exist

shell编程(上)_第19张图片

 

如果user1不存在,则创建user1

ca1420ea72c29afb91bd836f97ba15cb886.jpg

 

• if [ ! -e file ]; then 表示文件不存在时会怎么样

• if (($a<1)); then …等同于 if [ $a -lt 1 ]; then…

• [ ] 中不能使用<,>,==,!=,>=,<=这样的符号

 

八、shell中的case判断

• 格式 case  变量名 in

                     value1)

                          command

                          ;;

                     value2)

                          command

                          ;;

                      *)

                        commond

                            ;;

                      esac

•在case程序中,可以在条件中使用|,表示或的意思, 比如    

2|3)

    command

    ;;

 

read -p的用法

shell编程(上)_第20张图片

 

shell脚本案例

shell编程(上)_第21张图片

 

测试

shell编程(上)_第22张图片

 

九、for循环

• 语法:for 变量名 in 条件; do …; done

打印出1到100

shell编程(上)_第23张图片

• 案例1,求出1到100的和

shell编程(上)_第24张图片

 

 

案例2,文件列表循环

列出/etc/底下的所有目录

shell编程(上)_第25张图片

 

for循环中的对象

shell编程(上)_第26张图片

 

for循环,命令形式默认会将空格或者回车作为分隔符

shell编程(上)_第27张图片

 

 

十、while循环

• 语法 while 条件; do … ; done

shell编程(上)_第28张图片

 

shell编程(上)_第29张图片

 

shell编程(上)_第30张图片

 

shell编程(上)_第31张图片

 

5edc5ac49a74b1c965fc3a0fb1b0c126850.jpg

 

每隔30秒检查系统的负载,当系统的负载大于10的时候就发一份邮件

shell编程(上)_第32张图片

 

执行脚本,休眠30秒检查一次

shell编程(上)_第33张图片

 

while循环案例2

shell编程(上)_第34张图片

 

 

 

十一、break跳出循环

shell编程(上)_第35张图片

 

 

 

十二、continue结束本次循环

shell编程(上)_第36张图片

 

 

十三、exit直接退出脚本

shell编程(上)_第37张图片

 

转载于:https://my.oschina.net/u/3991860/blog/3001066

你可能感兴趣的:(shell编程(上))