shell 判断

First Post:

Last Update:

shell 判断

条件/数值测试

  1. shell 条件测试
    • 数值比较
    • 文件测试
    • 字符串比较
1
2
# 取出变量长度
echo ${#pass}

测试语法:

  • test <条件表达式>
  • [ <条件表达式> ]
  • [[ <条件表达式> ]]

三种语法都可以用做测试

echo $? 返回判断结果
若为真, 判断返回 0
若为假, 判断返回 1

数值比较:

1
2
3
4
5
test <整数1> <操作符> <整数2>; echo $?

[ <整数1> <操作符> <整数2> ]; echo $?

[[ <整数1> <操作符> <整数2> ]]; echo $?

操作符:
-gt 大于
-lt 小于
-eq 等于
-ne 不等于
-ge 大于等于
-le 小于等于


if 语法结构

流程控制:

  1. if 如果
  2. then 那么
  3. else 否则
  4. fi 结束
1
2
3
4
if <条件>
then <指令>
else <指令>
fi
1
2
3
4
5
6
7
8
9
10
#实例:
#!/bin/bash

read -p "请输入您的密码: " ps
if [ ${#ps} -lt 7 ]
then
echo "你的密码太短!"
else
echo "您的密码真长!"
fi

文件测试

操作符:
-f 判断文件是否存在, 是则返回真
-b 判断文件是否是块文件, 是则返回真
-d 判断是否是目录, 是则返回真

-w 判断指定文件或目录是否可写
-x 判断指定文件或目录是否可执行
-e 判断指定文件或目录是否存在
......

文件测试语法

1
2
[ <操作符> <文件> ]
...
1
2
3
4
5
6
7
#示例:
#!/bin/bash
read -p "请输入要备份的目录: " dir1
if [ -d $dir1 ]
then echo "$dir1 存在可以备份"
else echo "$dir1 不存在, 无法备份"
fi

字符串比较

操作符:
= 等于
!= 不等于
-Z 判断字符长度是为 0
-n 判断字符长度不是 0

1
[ <字符串> = <字符串> ]
1
2
3
4
5
6
7
8
9
10
#示例:
#!/bin/bash

read -p "你确定要升级这件装备吗? [yes/no]" select
if [ "$select" = "yes" ]
then
echo "装备升级开始..."
else
echo "感谢你, 欢迎下次光临!"
fi

混合测试

操作符:
&& 逻辑和, 等同于 -a
|| 逻辑与, 等同于 -o

正则表达式
使用正则表达式开始 =~ 模糊查询
判断正则表达式必须使用 [[ ]] 判断
~ [@_!] 表示包含下列字符

1
2
3
4
5
6
7
8
9
10
#示例
#!/bin/bash

read -p "请你输入密码: " pass
if [ ${#pass} -gt 7 ] && [[ $pass =~ [a-z] ]] && [[ $pass =~ [A-Z] ]] && [[ $pass =~ [@_!] ]]
then
echo "你的密码够复杂"
else
echo "你的密码太简单"
fi

##流程控制

if 流程控制

  • 单分支结构
  • 双分支结构
  • 多分支结构
  • 镶套结构
1
2
3
4
5
6
7
8
9
#单分支
if [ <命令> ]; then <命令>; fi

#双分支
if [ <命令> ]; then <命令>; else <命令>; fi

#多分支
if [ <命令> ]; then <命令>; elif [ <命令> ]; then <命令>;......; fi

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
#voilone
#2022-09-12

hour=`date+%H` #date(时间命令) %H

if [ $hour -ge 6 -a $hour -le 10 ] #-a 指and
then echo "现在是早上"

elif [ $hour -ge 11 -a $hour -le 13 ]
then echo "现在是中午"

elif [ $hour -ge 14 -a $hour -le 18 ]
then echo "现在是下午"

else
echo "现在是晚上"

fi

嵌套

1
2
3
4
5
6
if [ <命令> ] then <命令>
if [ <命令> ] then <命令>
else <命令>
fi;
......

调试脚本

bashsh 是一个程序

1
2
3
4
5
6
7
#调试
bash -n <shell脚本>
sh -n <shell脚本>
#无输出则表示无错误

#边调试边执行
sh -xv <脚本文件>

模式匹配 CASE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#如果用户输入y, Y, 则if跳过.
if [ $action = "[yes/no]" ]

#case语法
case <变量> in
<模式1> )
<命令序列>;;

<模式2> )
<命令序列>;;

<模式3> )
<命令序列>;;

#类似于else
*)

esac

例:

1
2
3
4
5
6
7
8
9
10
11
read -p "输入用户名: " name
read -p "确定吗 [yes/no]" action
case "$action" in
Y|y|Yes|YEs|YES|yES|yeS)
id $name
echo "用户为: $name"
;;
*)
echo "thank you"
;;
esac

附加知识点
输入重定向:

1
2
3
4
5
6
7
8
# 可用于打印菜单
# EOF为段落标记
cat << EOF
1.
2.
3.
4.
EOF