let命令效果等同于双括号,但效率较低。
实例:
lidapeng@X61s:~/shell_program$ num=5
lidapeng@X61s:~/shell_program$ let num=num+4
lidapeng@X61s:~/shell_program$ echo $num
9
lidapeng@X61s:~/shell_program$ num2=5
lidapeng@X61s:~/shell_program$ echo $((num2=num2+4))
9

检测nginx是否存活

  1. 想好该脚本的功能,作用
  2. 写伪代码
    1. 先定义变量,用于存储变化的值,便于后期脚本维护
    2. 安装服务
    3. 启动服务
    4. 修改配置文件
    5. 重启服务
mysql_version=5.8
apt install mysql-${mysql_version}
while是无限循环
while true; do echo "测试"; sleep 1; done

if判断中 -ne 表示不等于;-ge 表示大于等于。

实例:
lidapeng@X61s:~/shell_program$ cat checknginxstatus.sh
#!/bin/bash
# 版本变量

# 以下函数确认某网站是否存活
CheckUrl(){
 timeout=5  #设置超时次数
 fails=0    #初始化失败次数
 success=0  #初始化成功次数
 while true #while循环
 do
        #以下命令尝试连接一个url,若超过5次失败则返回执行失败码,否则返回成功码0。注意里面选项是大写字母O,不是数字0
        wget --timeout=${timeout} --tries=1 http://dapeng.li/ -q -O /dev/null
         
        # 如果上句执行出错,$?会返回非零数值,以下判断$?是否为0,-ne表示不等于;-ge表示大于等于;-le表示小于等于;-lt 小于
        # 如果$?不等于0表示上面一句执行错误,则fails的值加1,否则($?等于0)则success的值加1
        if [ $? -ne 0 ]
        then
                let fails=fails+1
        else
                let success+=1
        fi
        
        # 如果success的值大于等于1,表示wget句执行成功,网站正常,退出并返回状态码0
        if [ ${success} -ge 1 ]
        then
                echo "该网站正常连接"
                exit 0
        fi
        
        # 如果fails的值大于等于2,表示wget句执行失败,网站不正常,退出并返回状态码2
        if [ ${fails} -ge 2 ];then
                echo "该网站挂了"
                exit 2
        fi

done
}
# 调用上面定义的函数
CheckUrl

lidapeng@X61s:~/shell_program$ bash checknginxstatus.sh
该网站正常连接
lidapeng@X61s:~/shell_program$ echo $?
0
# 若将上面程序中的网址改为一个存在的网址,则运行结果如下:
lidapeng@X61s:~/shell_program$ bash checknginxstatus.sh
该网站挂了
lidapeng@X61s:~/shell_program$ echo $?
2
lidapeng@X61s:~/shell_program$

expr

必须传入参数,数值与运算符之间必须要有空格。元字符等有特殊含义的字符会被shell解析,需要转义。
lidapeng@X61s:~/shell_program$ expr 5 + 3
8
lidapeng@X61s:~/shell_program$ expr 5 * 3
expr: 语法错误:未预期的参数 “calculation2.sh”
lidapeng@X61s:~/shell_program$ expr 5 \* 3
15
lidapeng@X61s:~/shell_program$ expr length 1234567     length计算长度
7
lidapeng@X61s:~/shell_program$ expr 8 \> 6             逻辑判断,返回1表示真,返回0表示假
1
expr支持模式匹配功能
两个特殊符号 语法:
expr 字符串 ":" ".*" 单引号也可以
lidapeng@X61s:~/shell_program$ expr abce ":" ".*"
4
lidapeng@X61s:~/shell_program$ expr abce : ".*"      :可以加引号,也可以不加,严谨的要加
4
lidapeng@X61s:~/shell_program$ expr abce : .*        .*必须要加引号
expr: 语法错误:未预期的参数 “..”
lidapeng@X61s:~/shell_program$ expr abce ':' ".*c"
3
lidapeng@X61s:~/shell_program$ expr abce ':' .*c
3
lidapeng@X61s:~/shell_program$ expr yc.png ':' '.*\.jpg'
0
lidapeng@X61s:~/shell_program$ expr yc.jpg ':' '.*\.jpg'
6
lidapeng@X61s:~/shell_program$ expr yc.jpggggggg ':' '.*\.jpg'       匹配到.jpg之后结束,不理后面
6
lidapeng@X61s:~/shell_program$ expr yc.jpggggggg ':' '.*\.jpg*'      由于最后加了通配符*,会继续向后统计(通配符?不适用)
12
实例:执行脚本,传入一个文件名,判断其是否为jpg文件
思路:
  1. 先明白expr命令的模式匹配功能,字符串匹配上了就统计其长度,匹配不上就返回0。
  2. 在shell中,0表示假,非0表示真,可以使用if else 语句对其判断。
  3. 脚本开发
  4. 测试脚本
lidapeng@X61s:~/shell_program$ cat file_ext.sh
#!/bin/bash
if expr "$1" ":" ".*\.jpg"  > /dev/null
then
        echo "这是个.jpg文件"
else
        echo "这不是.jpg文件"
fi
lidapeng@X61s:~/shell_program$ bash file_ext.sh 1.jpg
这是个.jpg文件
lidapeng@X61s:~/shell_program$ bash file_ext.sh 2.jpeg
这不是.jpg文件
实例:输出一句话中的每个单词(已空格为分界,若标点符号前面没有空格,则标点符号与前面的单词为一体)。
lidapeng@X61s:~/shell_program$ cat length_word.sh
#!/bin/bash
for str1 in I am Lidapeng, I am learning shell.
do
        echo $str1
done
lidapeng@X61s:~/shell_program$ bash length_word.sh
I
am
Lidapeng,
I
am
learning
shell.
找出长度小于5的单词:
lidapeng@X61s:~/shell_program$ cat length_word.sh
#!/bin/bash
for str1 in I am Lidapeng, I am learning shell.
do
        if [ `expr length $str1` -lt 5 ]
        then
                echo $str1
        fi
done
lidapeng@X61s:~/shell_program$ bash length_word.sh
I
am
I
am
lidapeng@X61s:~/shell_program$

if语句的比较式:
比较式 含义
-eq equal,等于
-ne not equal,不等于
-lt less than
-le less than or equal,小于等于
-gt greater than,大于
-ge greater than or equal,大于等于
-f "file" 文件file是否存在
-d "path" 目录是否存在
-n "$var" 变量$var是否为真
-r "file" 判断file是否存在且可读
-x "file" 判断file是否存在且可执行
-w "file" 判断file是否存在且可写
-c "file" 判断file是否存在且为字符特殊文件
-b "file" 判断file是否存在且为块特殊文件
-s "file" 文件大小非0时为真
-t "file" 当文件描述符(默认为1)指定的设备为终端时为真

bc计算器

bc命令当作命令行计算器
lidapeng@X61s:~/shell_program$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1+2
3
12.4*434.3
5385.3
1/2
0
1/2.0
0
1.0/2
0
2.23/2
1
^C
(interrupt) use quit to exit.
exit
0
quit
lidapeng@X61s:~/shell_program$
lidapeng@X61s:~/shell_program$ echo "4.2*4" | bc
16.8
lidapeng@X61s:~/shell_program$ echo "3/2" | bc
1
lidapeng@X61s:~/shell_program$ num=5
lidapeng@X61s:~/shell_program$ result=`echo $num*4 | bc`
lidapeng@X61s:~/shell_program$ echo $result
20
实例:计算1~1000的总和,数学公式:1+2+3+...+999+1000
方法1:
lidapeng@X61s:~/shell_program$ echo {1..10} | tr " " "+"    用tr命令将{1..10}生成的序列中的空格替换成加号
1+2+3+4+5+6+7+8+9+10
lidapeng@X61s:~/shell_program$ echo {1..10000} | tr " " "+" | bc 将以上方法生成的结果传递给bc进行计算
50005000
方法2:
lidapeng@X61s:~/shell_program$ seq -s "+" 10                使用seq命令生成1到10,-s参数指定分隔符为加号
1+2+3+4+5+6+7+8+9+10
lidapeng@X61s:~/shell_program$ seq -s "+" 10000 | bc        将以上方法生成的结果传递给bc进行计算
50005000
方法3:
lidapeng@X61s:~/shell_program$ echo $((`seq -s "+" 10000`)) 使用双括号运行命令计算
50005000
方法4:
lidapeng@X61s:~/shell_program$ seq -s " + " 10              seq -s替换分隔符时,指定分隔符的加号前后各加一个空格,构造出来的序列就编程数字和加号之间有空格分隔
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
lidapeng@X61s:~/shell_program$ seq -s " + " 10000 | xargs expr 使用xargs将前面的结果传递给expr作为参数
50005000

awk支持数值计算

awk也支持小数计算
lidapeng@X61s:~/shell_program$ echo "3.2 2.2" | awk '{print $1+$2}'
5.4
lidapeng@X61s:~/shell_program$ echo "3.2 2.2" | awk '{print $1+4*$2}'
12

中括号运算

$[表达式]
lidapeng@X61s:~/shell_program$ num=5
lidapeng@X61s:~/shell_program$ res=$[num+4]
lidapeng@X61s:~/shell_program$ echo $res
9