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

复杂流程控制

函数使用场景:

  1. 执行频繁的命令
  2. 执行命令格式相近的命令

  • 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 按两次,会在每行的选定的区域出现插入的内容。