算术运算:
1.let VAR= expression
2.VAR=$[expression]
3.VAR=$((expression))
4.VAR=$(expr argu1 argu2 argu3)
注意:有些时候乘法符号需要转义
增强型赋值
变量做某种算术运算后回存至此变量中
let i=$i+#=let i+=#
[root@centos-23 opt]# let i=$i+1
[root@centos-23 opt]# echo $i
2
[root@centos-23 opt]# let i=$i+1
[root@centos-23 opt]# echo $i
3
[root@centos-23 opt]# let i=$i+1
[root@centos-23 opt]# echo $i
4
[root@centos-23 opt]# let i+=1
[root@centos-23 opt]# echo $i
5
自增
VAR=$[$VAR+1]
let VAR+=1|let VAR++
自减
VAR=$[$VAR-1]
let VAR-=1|let VAR--
条件测试
判断某需求是否满足,需要由测试机制来实现
1.执行命令,并利用命令状态返回值来判断
2.测试表达式
test expression|[ expression ]|[[ expression ]]
注:expression前后两端必须有空白字符,否则为语法错误
例:
[root@Centos-7-24 ~]# test 2 >3
[root@Centos-7-24 ~]# echo $?
0
bash的测试类型
1.数值测试:数值比较
-eq:是否等于 [ $sum1 -eq $sum2 ]
-ne:是否不等于[ $sum1 -ne $sum2]
-gt :是否大于 [ $sum1 -gt sum2 ]
-ge:是否大于等于 [ $sum1 -ge $sum2 ]
-le:是否小于等于 [ $sum1 -le $sum2 ]
2.字符串测试:字符比较
==:是否等于 [[ "$sum1" == "$sum2" ]]
>:是否大于 [[ "$sum1" > "$sum2" ]]
<:是否小于 [[ "$sum1" < "$sum2" ]]
!=是否不等于 [[ "$sum1" != "sum2" ]]
=~左侧字符串是否能够被右侧的PATTERN(可以使用正则表达式)所匹配 [[ “sum1” =~ PATTERN ]]
例:
[root@Centos-7-24 ~]# sum1=wei
[root@Centos-7-24 ~]# [[ "$sum1" =~ ^w.*$ ]]
[root@Centos-7-24 ~]# echo $?
0
-z "STRING":判断指定的字串是否为空;空为真,不空则为假
例:
[root@Centos-7-24 ~]# [[ -z "$sum1" ]]
[root@Centos-7-24 ~]# echo $?
1
-n ”STRING"判断指定的字串是否不空,不空为真,空为假
例:
[root@Centos-7-24 ~]# [[ -n "$sum1" ]]
[root@Centos-7-24 ~]# echo $?
1
注:1.字符串比较时变量一定要要"$name"
2.做比较时要使用[[ "a" > "b" ]]
3.文件测试
(1).存在性测试
-a file/-e file
例:
[root@Centos-7-24 ~]# [ -a /etc/fstab ]
[root@Centos-7-24 ~]# echo $?
0
文件存在性测试,存在即为真,不存在即为假;
(2).存在性及类型测试
-b FILE 是否存在并且为块设备文件
-c FILE 是否存在并且为字符设备文件
-d FILE 是否存在并且为目录文件
-f FILE 是否存在并且为普通文件
-h/-L FILE 是否存在并且为符号链接文件
-p FILE 是否存在并且为管道文件
-S FILE 是否存在并且为套接字文件
例:
[root@Centos-7-24 ~]# [ -f /etc/fstab ]
[root@Centos-7-24 ~]# echo $?
0
(3).文件权限测试
-r FILE 是否存在并且对当前用户可读
-w FILE 是否存在并且对当前用户可读写
-x FILE 是否存在并且对当前用户可执行
(4).特殊权限测试
-u FILE 是否存在并且拥有suid权限
-g FILE 是否存在并且拥有guid权限
-k FILE 是否存在并且拥有sticky权限
(5).文件是否有内容
-s FILE 是否有内容,有内容即为真,空为假
例:
[root@Centos-7-24 ~]# [ -s /etc/passwd ]
[root@Centos-7-24 ~]# echo $?
0
(6)时间戳
-N FILE 文件自从上一次读操作后是否被修改过
例:
[root@Centos-7-24 opt]# [ -N /opt/test1.sh ]
[root@Centos-7-24 opt]# echo $?
1
(7).从属关系测试
-O FILE 当前用户是否为文件的属主
-G FILE 当前用户是否为文件的属组
(8).双目测试
FILE1 -ef FILE2 FILE1与FILE2是否为指向同一个文件系统的相同inode的硬链接
FILE1 -nt FILE2 FILE1是否新于FILE2
FILE1 -ot FILE2 FILE1是否旧于FILE2
4.组合条件测试
逻辑运算
第一种方式
[ -O FILE ] && [ -r FILE ]当前用户是否为测试文件的属主且可读
第二种方式
[ expression1 -a expression2 ]
[ expression1 -o expression2 ]
[ !expression ]
例:
[ -z"$hostname" -o "$hostname"=="loaclhost.localdomain" -o "$hostname"=="localhost" ] && hostname
www.magedu.com 如是hostname 为空或不是localhost,localdomain或不是localhost就改主机名为www.magedu.com
脚本的状态返回值
默认脚本中执行的最后一条命令的状态返回值
自定义状态退出状态码
exit[n]:n为自己指定的状态码
注:shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束
例
[ -z $name ] && echo "a username is needed!!!" && exit 2 name为空,输出信息并退出代码为2
向脚本传递参数
位置参数变量:
myscript.sh argu1 argu2
引用方式:
$1,$2...${10}
轮替
shift[n]位置参数轮替
例
echo "Fist pos argu:$1"
shift
echo "Second pos argu:$1"
运行脚本输入one和two 两个整数,正常情况下脚本只会调用$1=one ,但使用了shift之后会自动剔除掉one ,显示结果状态为one,two
位置传递脚本例子
line1=$(grep "^$" $1 | wc -l)
line2=$(grep "^$" $2 | wc -l)
echo "line total:$[ $line1 + $line2 ]"
特殊变量
$0脚本文件路径本身
$#脚本参数的个数
$*所有参数
$@所有参数
例:
"hello" "hi" "toyou"
"hello hi toyou"
脚本
1 #!/bin/bash
2 #
3 echo $1 $2 $3
4 echo $0
5 echo $#
6 echo $*
7 echo $@
输出
"test.sh" 7L, 60C written
[root@centos-23 opt]# sh test.sh hello hi toyou
hello hi toyou
test.sh
3
hello hi toyou
hello hi toyou