文章目录
Shell脚本编程2
数值计算
整数运算
bash
[hxl@server ~ 14:38:25]$ echo $[1+2]
3
[hxl@server ~ 14:39:34]$ echo $[$(echo {1..100} | sed 's/ /+/g')]
5050
[hxl@server ~ 14:39:55]$ echo $(( $(echo {1..100} | sed 's/ /+/g') ))
5050
[hxl@server ~ 14:40:59]$ echo $(( 1+2 ))
3
[hxl@server ~ 14:41:20]$ echo $?
0
[hxl@server ~ 14:41:34]$ let sum=1+2
[hxl@server ~ 14:41:41]$ echo $sum
3
小数运算
使用bc
或awk
工具。
bc
是 Linux 下的计算器工具,支持浮点数运算
bash
[hxl@server ~ 14:42:06]$ echo $[ 1.1 + 2.2 ]
-bash: 1.1 + 2.2 : 语法错误: 无效的算术运算符 (错误符号是 ".1 + 2.2 ")
[hxl@server ~ 14:42:27]$ echo 1.1+2.2 | bc
3.3
推荐使用bc
,它是 Linux 下的计算器工具,支持浮点数运算
条件测试
控制语句:
1.按顺序执行
2.分支执行:满足条件1,执行;不满足条件,执行另外任务;
3.重复执行
文件测试
运算符 | 含义 | 示例 |
---|---|---|
-f |
是普通文件 | [ -f "file" ] |
-d |
是目录 | [ -d "dir" ] |
-r |
可读 | [ -r "file" ] |
-w |
可写 | [ -w "file" ] |
-x |
可执行 | [ -x "file" ] |
-e |
存在 | [ -e "file" ] |
目录判断
如果目录不存在则创建
bash
[hxl@server ~ 15:02:15]$ test ! -d /tmp/zhangsan && mkdir /tmp/zhangsan
[hxl@server ~ 15:03:16]$ echo $?
0
第二次执行,目录已经存储
bash
[hxl@server ~ 15:03:22]$ test ! -d /tmp/zhangsan && mkdir /tmp/zhangsan
[hxl@server ~ 15:03:30]$ echo $?
1
如果目录存在,就提示目录存在
bash
[hxl@server ~ 15:03:35]$ test -d /tmp/zhangsan && echo /tmp/zhangsan is exist.
/tmp/zhangsan is exist.
字符串判断
运算符 | 含义 | 示例 |
---|---|---|
= |
等于 | [ "$a" = "$b" ] |
!= |
不等于 | [ "$a" != "$b" ] |
-z |
长度为0 | [ -z "$a" ] |
-n |
长度不为0 | [ -n "$a" ] |
bash
[hxl@server bin 15:15:41]$ vim ssh_ctl
#!/bin/bash
# 确保脚本以root身份运行
test "$USER" != "root" && echo Pls run as root. && exit
systemctl $1 sshd
[hxl@server bin 15:18:07]$ bash ssh_ctl status
Pls run as root.
[root@server bin 15:18:38]# cd /home/hxl/bin
[root@server bin 15:18:54]# bash ssh_ctl status
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since 四 2025-10-09 11:18:07 CST; 4h 0min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1539 (sshd)
CGroup: /system.slice/sshd.service
└─1539 /usr/sbin/sshd -D
... ...
数值判断
在(( ))
或者[ ]
中比较符号==
=
!
=
>
<
>=
<=
bash
[hxl@server ~ 15:56:53]$ [[ 98 == 99 ]] && echo ture
[hxl@server ~ 15:57:05]$ [[ 98 = 99 ]] && echo ture || echo false
false
[hxl@server ~ 15:57:13]$ [[ 98 = 99 ]] && echo ture
[hxl@server ~ 15:57:37]$ [[ 98 != 99 ]] && echo ture
ture
[hxl@server ~ 15:57:41]$ [[ 98 < 99 ]] && echo ture
ture
[hxl@server ~ 15:57:50]$ [[ 98 > 99 ]] && echo ture
# []中不支持使用<= >= 判断,要使用(())
[hxl@server ~ 15:57:54]$ [[ 98 >= 99 ]] && echo ture
-bash: 条件表达式中有语法错误
-bash: `99' 附近有语法错误
[hxl@server ~ 15:57:59]$ (( 98 >= 99 )) && echo ture
[hxl@server ~ 15:58:37]$ (( 98 <= 99 )) && echo ture
ture
[hxl@server ~ 15:58:43]$ (( 98 != 99 )) && echo ture
ture
# (())中= 表示赋值,判等使用==,[]中可以直接使用= 判等
[hxl@server ~ 15:58:54]$ (( 98 = 99 )) && echo ture
-bash: ((: 98 = 99 : 尝试给非变量赋值 (错误符号是 "= 99 ")
[hxl@server ~ 15:59:00]$ (( 98 == 99 )) && echo ture
[hxl@server ~ 15:59:05]$
示例:编写一个数值判断脚本
bash
[hxl@server ~ 16:05:14]$ cd bin
[hxl@server bin 16:05:27]$ vim test_num.sh
#!/bin/bash
read -p "请输入一个数字:" num
大于 10
(( $num>10 )) && echo "$num > 10"
小于 10
(( $num<10 )) && echo "$num < 10"
等于 10
(( $num==10 )) && echo "$num = 10"
[hxl@server bin 16:05:54]$ bash test_num.sh
请输入一个数字:23
23 > 10
逻辑操作符判断
表达式中逻辑操作符使用说明如下:
[]和test中逻辑操作符 | [[]]和(())中逻辑操作符 | 说明 |
---|---|---|
-a | && | and,与,两端都为真,则结果为真 |
-o | II | or,或 ,两端有一个为真,则结果为真 |
! | ! | not,非,两端相反,则结果为真 |
对于上述操作符,有如下提示:
- 逻辑操作符前后的表达式是否成立,一般用真假来表示。
- "!"的中文意思是反,即与一个逻辑值相反的逻辑值。
- -a的中文意思是"与"(and或&&),前后两个逻辑值都为"真",综合返回值才为"真",反之为"假"。
- -o的中文意思是"或"(or或||),前后两个逻辑值只要有一个为"真",返回值就为"真"。
表达式外:&&或||可用于连接两个含[]、test或[[]]的表达式:
-
使用&&表达式时:
-
当左边为真,右边表达式才会执行。
-
当左边为假,右边表达式不会执行。
-
-
使用||的表达式时:
-
当左边为真,右边表达式不会执行。
-
当左边为假,右边表达式才会执行。
-
判断表达式 test、[]、[[]]、(())的区别总结
判断表达式符号 | [] | test | [[]] | (()) |
---|---|---|---|---|
边界是否需要空格 | 需要 | 需要 | 需要 | 不需要 |
逻辑操作符 | !、-a、-o | !、 -a、 -o | !、&&、|| | !、&&、|| |
整数比较操作符 | -eq、-ne、-gt、-ge、-lt、-le | -eq、-ne、-gt、-ge、-lt、-le | -eq、-ne、-gt、-ge、-lt、-le | =、!=、>、>=、<、<= |
字符串比较操作符 | =、== 、!= | =、== 、!= | =、== 、!= | == 、!= |
是否支持通配符匹配 | 不支持 | 不支持 | 支持(=~) | 不支持 |