1. 运算符
1.1 算数运算符
用法
参数
操作符 | 说明 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取模 |
= | 赋值 |
!= | 不等 |
== | 等于 |
注意
条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b]
是错误的,必须写成 [ $a == $b ]
。
demo
# expr 只能计算整数
xiaox@xiaox:~/study/shell$ echo `expr 1.1 + 1.0`
expr: 非整数参数
xiaox@xiaox:~/study/shell$ echo `expr 1 + 1`
2
# bc 能计算整数和小数
xiaox@xiaox:~/study/shell$ echo "1 + 2"|bc
3
xiaox@xiaox:~/study/shell$ echo "1.1 + 2"|bc
3.1
# 赋值不能有空格
xiaox@xiaox:~/study/shell$ a = 1
a:未找到命令
xiaox@xiaox:~/study/shell$ a=1
# 中括号内侧要有空格
xiaox@xiaox:~/study/shell$ [1 == 2] && echo 1 || echo 0
[1:未找到命令
0
xiaox@xiaox:~/study/shell$ [ 1 == 2 ] && echo 1 || echo 0
0
# 此处注意,等号两侧要有空格,猜测将"1==2"当做了一个不为null的字符串,返回1
xiaox@xiaox:~/study/shell$ [ 1==2 ] && echo 1 || echo 0
1
# 针对上例的一个小测试,猜测是对的
xiaox@xiaox:~/study/shell$ a=1==2
xiaox@xiaox:~/study/shell$ echo $a
1==2
1.2 整数关系运算符
用法
在[]
中或与test
一起使用
参数
操作符 | 说明 |
---|---|
-eq | equal |
-lt | less than |
-le | less equal |
-gt | great than |
-ge | great equal |
demo
# 相等
xiaox@xiaox:~/study/shell/menu$ test 1 -eq 2 && echo 1 || echo 0
0
xiaox@xiaox:~/study/shell/menu$ test 1 -eq 1 && echo 1 || echo 0
1
# 小于
xiaox@xiaox:~/study/shell/menu$ test 1 -lt 0 && echo 1 || echo 0
0
xiaox@xiaox:~/study/shell/menu$ test 0 -lt 1 && echo 1 || echo 0
1
# 小于等于
xiaox@xiaox:~/study/shell/menu$ test 0 -le 1 && echo 1 || echo 0
1
xiaox@xiaox:~/study/shell/menu$ test 0 -le 0 && echo 1 || echo 0
1
xiaox@xiaox:~/study/shell/menu$ test 1 -le 0 && echo 1 || echo 0
0
# 大于
xiaox@xiaox:~/study/shell/menu$ test 1 -gt 0 && echo 1 || echo 0
1
xiaox@xiaox:~/study/shell/menu$ test 0 -gt 1 && echo 1 || echo 0
0
# 大于等于
xiaox@xiaox:~/study/shell/menu$ test 1 -ge 0 && echo 1 || echo 0
1
xiaox@xiaox:~/study/shell/menu$ test 1 -ge 1 && echo 1 || echo 0
1
xiaox@xiaox:~/study/shell/menu$ test 0 -ge 1 && echo 1 || echo 0
0
# 在[]中使用, 与test相似
xiaox@xiaox:~/study/shell/menu$ [ 0 -eq 1 ] && echo 1 || echo 0
0
xiaox@xiaox:~/study/shell/menu$ [ 0 -eq 0 ] && echo 1 || echo 0
1
1.3 字符串
参数
操作符 | 说明 |
---|---|
= | 相等返回True |
!= | 不等返回True |
-z | 长度为0返回True |
-n | 长度不为0返回True |
str | 字符串不为空返回True |
demo
# =
xiaox@xiaox:~$ [ "a" = "a" ] && echo 1 || echo 0
1
xiaox@xiaox:~$ [ "a" = "b" ] && echo 1 || echo 0
0
# !=
xiaox@xiaox:~$ [ "a" != "a" ] && echo 1 || echo 0
0
xiaox@xiaox:~$ [ "a" != "b" ] && echo 1 || echo 0
1
# -z
xiaox@xiaox:~$ [ -z "" ] && echo 1 || echo 0
1
xiaox@xiaox:~$ [ -z "a" ] && echo 1 || echo 0
0
# -n
xiaox@xiaox:~$ [ -n "" ] && echo 1 || echo 0
0
xiaox@xiaox:~$ [ -n "a" ] && echo 1 || echo 0
1
# str
xiaox@xiaox:~$ unset a
xiaox@xiaox:~$ echo $a
xiaox@xiaox:~$ [ "$a" ] && echo 1 || echo 0
0
xiaox@xiaox:~$ a="a"
xiaox@xiaox:~$ [ "$a" ] && echo 1 || echo 0
1
xiaox@xiaox:~$
1.4 文件
说明
操作符 | 说明 |
---|---|
-d file | 是目录返回True |
-f file | 是普通文件(不是目录或者设备文件)返回True |
-r file | 可读返回True |
-w file | 可写返回True |
-x file | 可执行返回True |
-s file | 文件不为空(文件大小大于0)返回True |
-e file | 文件(目录)存在返回True |
demo
# -d
xiaox@xiaox:~/study$ test -d shell && echo 1 || echo 0
1
xiaox@xiaox:~/study$ touch myfile
xiaox@xiaox:~/study$ test -d myfile && echo 1 || echo 0
0
# -f
xiaox@xiaox:~/study$ test -f myfile && echo 1 || echo 0
1
xiaox@xiaox:~/study$ test -f shell && echo 1 || echo 0
0
# -r
xiaox@xiaox:~/study$ ll
总用量 12
drwxrwxr-x 3 xiaox xiaox 4096 10月 29 14:01 ./
drwxr-xr-x 21 xiaox xiaox 4096 10月 29 12:05 ../
-rw-rw-r-- 1 xiaox xiaox 0 10月 29 14:01 myfile
drwxrwxr-x 3 xiaox xiaox 4096 10月 29 12:05 shell/
xiaox@xiaox:~/study$ test -r shell && echo 1 || echo 0
1
xiaox@xiaox:~/study$ chmod -r myfile
xiaox@xiaox:~/study$ ll
总用量 12
drwxrwxr-x 3 xiaox xiaox 4096 10月 29 14:01 ./
drwxr-xr-x 21 xiaox xiaox 4096 10月 29 12:05 ../
--w--w---- 1 xiaox xiaox 0 10月 29 14:01 myfile
drwxrwxr-x 3 xiaox xiaox 4096 10月 29 12:05 shell/
xiaox@xiaox:~/study$ test -r myfile && echo 1 || echo 0
0
# -w
# -x
# -s
xiaox@xiaox:~/study$ clear
xiaox@xiaox:~/study$ ll
总用量 12
drwxrwxr-x 3 xiaox xiaox 4096 10月 29 14:01 ./
drwxr-xr-x 21 xiaox xiaox 4096 10月 29 12:05 ../
--w--w---- 1 xiaox xiaox 0 10月 29 14:01 myfile
drwxrwxr-x 3 xiaox xiaox 4096 10月 29 12:05 shell/
xiaox@xiaox:~/study$ test -s myfile && echo 1 || echo 0
0
xiaox@xiaox:~/study$ echo "text" >> myfile
xiaox@xiaox:~/study$ ll
总用量 16
drwxrwxr-x 3 xiaox xiaox 4096 10月 29 14:01 ./
drwxr-xr-x 21 xiaox xiaox 4096 10月 29 12:05 ../
-rw-rw-r-- 1 xiaox xiaox 5 10月 29 14:08 myfile
drwxrwxr-x 3 xiaox xiaox 4096 10月 29 12:05 shell/
xiaox@xiaox:~/study$ test -s myfile && echo 1 || echo 0
1
# -e
xiaox@xiaox:~/study$ test -e myfile && echo 1 || echo 0
1
1.5 布尔运算符
说明
在test或[]中使用
操作符 | 说明 |
---|---|
! | 非 |
-o | 或 |
-a | 与 |
demo
# !
xiaox@xiaox:~/study$ [ ! 1 -eq 1 ] && echo 1 || echo 0
0
xiaox@xiaox:~/study$ [ 1 -eq 1 ] && echo 1 || echo 0
1
# -o
xiaox@xiaox:~/study$ [ 1 -eq 1 -o 1 -eq 0 ] && echo 1 || echo 0
1
# -a
xiaox@xiaox:~/study$ [ 1 -eq 1 -a 1 -eq 0 ] && echo 1 || echo 0
0
1.6 逻辑运算
说明
在[[]]
中使用
操作符 | 说明 |
---|---|
&& | 逻辑与 |
` |
demo
# ||
xiaox@xiaox:~/study$ [[ 1 -eq 1 || 1 -eq 0 ]] && echo 1 || echo 0
1
# &&
xiaox@xiaox:~/study$ [[ 1 -eq 1 && 1 -eq 0 ]] && echo 1 || echo 0
0
2. 流程控制
2.1 分支
2.1.1 单分支
# 第一种写法
if [ 条件 ]
then
fi
# 第二种写法
if [ 条件 ]; then
fi
2.1.2 双分支
if 条件1
then
指令1
elif 条件2
then
指令2
else
指令3
fi
3. 函数
3.1 定义
[ function ] funname [()]
{
action;
[return int;]
}
说明
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
3.2 调用
# 只用函数名,不用括号,定义函数必须在调用函数的前面
funname
3.3 函数传参
传参方式和脚本一致,只是参数名换成脚本名
# 使用
funname 1 2 3
# 函数内部
使用$1,$2...
唯一注意的是$0取的是脚本名
4. 特殊字符
参数处理 | 说明 |
---|---|
$# | 传递到脚本参数的个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示shell使用的当前选项,与set命令功能相同 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
demo
参考:
Linux命令大全