04-Shell 基本语法2
Shell表达式¶
Shell 验证操作¶
0表示成立,非0表示不成立
[ 表达式 ]
test 表达式
poplar@PoplarTang:~/Lesson$ [ 1 == 1 ]
poplar@PoplarTang:~/Lesson$ echo $?
0
poplar@PoplarTang:~/Lesson$ [ 1 == 2 ]
poplar@PoplarTang:~/Lesson$ echo $?
1
poplar@PoplarTang:~/Lesson$ test 1 == 1
poplar@PoplarTang:~/Lesson$ echo $?
0
poplar@PoplarTang:~/Lesson$ test 1 == 2
poplar@PoplarTang:~/Lesson$ echo $?
1
表达式对空格的要求极其严格!
Shell 运算符分类¶
算数运算符¶
原生bash不支持数学运算,使用expr
完成表达式的求值
#!/bin/bash
val=`expr 3 + 2`
echo "计算结果: $val"
注意数字和运算符之间严格要求要有空格
表达式使用``包裹
- 支持的运算符及写法如下:假设a=10,b=20
运算符 | 举例 | 说明 |
---|---|---|
+ | expr $a + $b 结果为 30。 |
加法 |
- | expr $a - $b 结果为 -10。 |
减法 |
* | expr $a \* $b 结果为 200。 |
乘法 |
/ | expr $b / $a 结果为 2。 |
除法 |
% | expr $b % $a 结果为 0。 |
取余 |
= | a=$b 把变量 b 的值赋给 a。 |
赋值 |
== | [ $a == $b ] 返回 false。 |
判断相等。用于比较两个数字 |
!= | [ $a != $b ] 返回 true。 |
判断不相等。用于比较两个数字 |
关系运算符¶
支持数字或内容是数字的字符串
运算符 | 举例 | 说明 |
---|---|---|
-eq | [ $a -eq $b ] 返回 false。 |
相等 |
-ne | [ $a -ne $b ] 返回 true。 |
不相等 |
-gt | [ $a -gt $b ] 返回 false。 |
大于 |
-lt | [ $a -lt $b ] 返回 true。 |
小于 |
-ge | [ $a -ge $b ] 返回 false。 |
大于等于 |
-le | [ $a -le $b ] 返回 true。 |
小于等于 |
如果希望直接使用>或<等符号,需要在数值操作符(())中使用
if (( a > b ))
如果a>b
逻辑运算符¶
- -a
(and )等同于&& (注意空格)
if [ $a -gt $b -a $a -lt $c ]
- -o
(or )等同于|| (注意空格)
if [ $a -gt $b -o $a -lt $c ]
- &&
例:命令1 && 命令2
执行传递:命令1成功才执行命令2
两者必须都成功,整个表达式才为成功
- ||
例:命令1 || 命令2
执行传递:命令1失败才执行命令2
两者只要有一个成功,整个表达式即为成功
如果使用逻辑判断父判断条件成立,每个条件必须使用操作符包裹:
- 如果a>b且a<c
if (( $a > $b && $a < $c ))
if (( $a > $b )) && (( $a < $c ))
- 如果a>b或a<=c
if (( a > b || a <= c ))
if (( a > b )) || (( a <= c ))
- 如果a<100且b>100
if [[ $a -lt 100 && $b -gt 100 ]]
空格敏感
- 如果a<100或b>=100
if [[ $a -lt 100 || $b -ge 100 ]]
空格敏感
总结:以大于等于、And为例
[ ] 关系运算符-ge,逻辑运算符-a,空格敏感
(( )) 关系运算符>=,逻辑运算符&&,空格不敏感,取变量值可省略$ (推荐)
[[ ]] 关系运算符-ge,逻辑运算符&&,空格敏感
文件运算符¶
-f
判断输入内容是否是文件
poplar@PoplarTang:~/Lesson$ [ -f test.sh ] && echo "是一个文件"
是一个文件
-d
判断输入内容是否是目录
poplar@PoplarTang:~/Lesson$ [ -d test_dir ] && echo "是一个目录"
是一个目录
-x
判断输入内容是否有执行权限
poplar@PoplarTang:~/Lesson$ [ -x test.sh ] && echo "文件有执行权限"
文件有执行权限
poplar@PoplarTang:~/Lesson$ [ -x test.sh ] && ./test.sh
-e
判断输入的文件或文件夹是否存在
poplar@PoplarTang:~/Lesson/day02$ [ -e test_dir ] && echo "存在"
存在
字符串运算符¶
运算符 | 举例 | 说明 |
---|---|---|
== | [ $a == $b ] 返回 false。 |
相等 |
!= | [ $a != $b ] 返回 true。 |
不相等 |
-z | [ -z $a ] 返回 false。 |
字符串长度是否为0 |
-n | [ -n "$a" ] 返回 true。 |
字符串长度是否不为0 |
$ | [ $a ] 返回 true。 |
字符串是否非空 |
Shell流程控制¶
简单流程控制¶
if语句¶
- python中的if语句:
# 单if语句
if 条件:
执行语句
# 双if语句
if 条件:
执行语句
else:
执行语句2
# 多if语句
if 条件:
执行语句
elif 条件2:
执行语句2
else:
执行语句3
- shell中的if语句
注意:条件没有分号,结尾是fi
使用场景:启动、停止、重启服务
# 单if语句
if 条件
then
执行语句
fi
# 双if语句
if 条件
then
执行语句
else
执行语句2
fi
# 多if语句
if 条件
then
执行语句
elif 条件2
then
执行语句2
else
执行语句3
fi
case多选择语句¶
注意没有分号
- 方式1
case 变量 in
值1)
执行语句
;;
值2)
执行语句
;;
*)
执行语句
;;
esac
- 方式2
case 变量 in
值1|值2|值3)
执行语句
;;
*)
执行语句
;;
esac
- 支持break和continue
常见用于脚本执行参数区分
循环¶
- for循环
for i in array
do
执行语句
done
- eg.
#!/bin/bash
# for 语句示例
nums=$(seq 10)
for i in "${nums}"
do
echo "${i}"
done
- while语句
如果条件满足,就一直循环下去
while 条件
do
执行语句
done
- eg.
#!/bin/bash
# while 循环
a=1
while [ "${a}" -lt 5 ]
do
echo "good -> ${a}"
let a=a+1
done
- until 语句
如果条件不满足,就一直循环下去
util 条件
do
执行语句
done
- eg.
#!/bin/bash
# until 循环
a=1
until [ "${a}" -gt 5 ]
do
echo "good -> ${a}"
let a=a+1
done
- 无限循环
# 方式1
while :
do
command
done
#方式2
while true
do
command
done
#方式3
for (( ; ; ))
do
command
done
复杂流程控制¶
函数使用场景:
- 执行频繁的命令
- 执行命令格式相近的命令
- Python的函数格式
# 定义
def 函数名(参数):
函数体
# 调用
函数名(参数)
- Shell函数格式
参数类似于Shell内置变量中的位置参数
# 定义
函数名(){
函数体 $n
}
# 调用
函数名 参数
- 函数的返回值
函数返回值在调用该函数后通过 $? 获得
Shell计算方法¶
- let方式
a=1
let a=a+1
- $(())方式
a=1
a=$((a+1))
- $[] 方式
a=1
a=$[$a+1]
其他¶
读取用户输入:read¶
- 等待用户输入内容并将结果赋值给name
read name
- 提示用户
read -p "请输入用户名" uname
- 隐藏用户输入的内容
read -p "请输入密码" -s psw
生成一系列数字:seq¶
# seq [选项]... 尾数
echo $(seq 10) # 1-10
# seq [选项]... 首数 尾数
echo $(seq 2 8) # 2-8
# seq [选项]... 首数 增量 尾数
echo $(seq 1 2 8) # 1 3 5 7
列编辑¶
1.光标定位到要操作的地方。
2.CTRL+v 进入"可视 块"模式,上下选取行。
3.SHIFT+i 输入要插入的内容。
4.ESC 按两次,会在每行的选定的区域出现插入的内容。