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是否存活
- 想好该脚本的功能,作用
- 写伪代码
- 先定义变量,用于存储变化的值,便于后期脚本维护
- 安装服务
- 启动服务
- 修改配置文件
- 重启服务
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支持模式匹配功能
两个特殊符号
- 冒号(:)计算字符串的字符数量
- .* 任意字符串,重复0次或多次
语法:
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文件
思路:
- 先明白expr命令的模式匹配功能,字符串匹配上了就统计其长度,匹配不上就返回0。
在shell中,0表示假,非0表示真,可以使用if else 语句对其判断。
- 脚本开发
- 测试脚本
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语句的比较式:
-ne表示不等于;-ge表示大于等于;-le表示小于等于;-lt 小于
比较式 |
含义 |
-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