算术运算
+ - * / %
+=,-=,*= /= %=
i++,i--
实现算术运算:
(1)let var=算术表达式
[root@server1 bash]# num1=2
[root@server1 bash]# num2=3
[root@server1 bash]# let sum=$num1+$num2
[root@server1 bash]# echo $sum
5
(2)$[算术表达式]
[root@server1 bash]# echo $[1+2]
3
(3)$((算术表达式))
[root@server1 bash]# echo $((1+2))
3
(4)var=$(expr agr1 arg2 arg3, …)
[root@server1 bash]# num1=1
[root@server1 bash]# num2=4
[root@server1 bash]# sum=$(expr $num1+$num2) #注意操作符与各参数之间应该有空格,否则会被认为字符串
[root@server1 bash]# echo $sum
1+4
[root@server1 bash]# sum=$(expr $num1 + $num2)
[root@server1 bash]# echo $sum
5
bash内建的随机数生成器:$RANDOM
生成0-59之间的随机数
传递参数计算/etc/passwd中第$1个用户和第$2个用户的id值和
#!/bin/bash
num1=$(cut -d: -f3 /etc/passwd | head -n $1 | tail -n 1)
num2=$(cut -d: -f3 /etc/passwd | sed -n "$2p")
echo $[$num1+$num2]
sum=$[$num1+$num2]
echo $sum
传递两个参数路径给脚本,计算两个行之和
#!/bin/bash
spaceline1=$(grep "^$" $1 | wc -l)
spaceline2=$(grep "^[[:space:]]*$" $2 | wc -l)
echo $[$spaceline1+$spaceline2]
统计/etc /var /usr 目录公有多少个一级子目录及文件
条件测试
测试命令
test 表达式
[ 表达式 ]
[[ 表达式 ]]
注意:表达式前后必须有空格
-gt :大于为真
-lt:小于为真
[root@server1 bash]# [ 1 -gt 3 ]
[root@server1 bash]# echo $?
1
[root@server1 bash]# [ 1 -lt 3 ]
[root@server1 bash]# echo $?
0
[root@server1 bash]# test 1 -lt 3
[root@server1 bash]# echo $?
0
测试类型
数值测试:
-gt:大于 -ge:大于等于
-lt:小于 -le:小于等于
-eq:等于 -ne:不等于
字符串测试:
==/= :
>:ASCII是否大于
<:
!=
=~:左侧字符串是否能被右侧的模式所匹配,匹配到为真
这里测试要使用[[ ]]
-z:字符串是否空,空为真
-n:字符串是否不空,不空为真
字符串要使用引号。
[root@server1 bash]# name="wtt"
[root@server1 bash]# [[ $name =~ w.* ]]
[root@server1 bash]# echo $?
0
[root@server1 bash]# [[ $name =~ x.* ]]
[root@server1 bash]# echo $?
1
文件测试:
存在性测试
-a/-e file 文件是否存在
-b file 是否存在且为块设备文件
-d file 是否存在且为目录文件
-f file 是否存在且为普通文件。
-S file 是否存在且为套接字文件
-h file 或 -L file 是否存在且为符号链接文件
权限测试:
-r file:对于当前用户来说是否具有读权限
-w file
-x file
文件特殊权限测试:
-g file : 是否存在且拥有sgid权限
-u file :是否存在且拥有suid权限
-k file :是否拥有sticky权限
文件大小测试:
-s file :是否存在且为空
-O file :当前用户是否为文件的属主
-G file:当前用户是否为文件的属组
双目测试
file1 -ef file2 :file1与file2是否指向同一设备的相同inode
组合测试条件:
逻辑运算:
第一种方式:
command1 && command2
command1 || command2
!command
[ -e file ] && [ -r file ]
第二种方式:
表达式1 -a 表达式2 并且
表达式1 -o 表达式2 或者
例1:当前主机的主机名为空或者为server1,输出主机名,否则报错
[root@server1 tmp]# [ -z $HostName ] || [ $HostName=="server1" ] && echo $HostName
server1
[root@server1 tmp]# [ -z $HostName -o $HostName=="server1" ] && echo $HostName
server1
例2:如果cat命令存在并且可执行,则用它打开/etc/fstab文件
[root@server1 tmp]# which cat
/bin/cat
[root@server1 tmp]# [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
自定义退出状态码:
exit n:自定义退出状态码
注意:脚本中一旦遇到exit命令,会立即终止,终止状态取决于exit命令后面的数字
如果未给脚本指定退出状态码,则整个脚本的退出状态码取决于脚本执行过程的最后一条命令的状态码。
写一个脚本,接受一个文件路径未参数,如果参数个数小于1,则提示用户至少应该给一个参数,并立即退出,如果参数个数不小于1,则显示第一个参数所指向的文件的空白行数