条件测试分为整数测试、字符测试、文件测试
[ echoes ]
[[ echoes ]]
test echoes
-eq 测试两个整数是否相等
-ne 测试两个整数是否不等
-gt 测试一个数是否大于另一个数
-lt 测试一个数是否小于另一个数
-ge 大于或小于
-le 小于或等于
== 等值比较,检查两边的内容是否一致,切记 == 两边要有空格
!= 检查两边内容是否不一致,不一致为真,一致为假
=~ 左侧字符穿能否被右侧的所匹配到,此表达式应用于双中括号[[]]中
-z “string” 测试指定字符串是否为空,空则为真,不空则为假
-n “string” 测试指定字符串是否不空,不空则为真,空则为假
# 存在性测试
-e 测试文件是否存在
# 存在性及类别测试
-b 测试文件是否为块设备文件
-c 测试文件是否为字符设备文件
-f 测试文件是否为普通文件
-d 测试指定路径是否为目录
-h 测试文件是否为目录
-l 测试文件是否为符号链接文件
-p 测试文件是否为命名管道文件
-s 测试文件是否为套接字文件
# 文件权限测试
-r 测试当前用户对指定文件是否有读权限
-w 测试当前用户对指定文件是否有写入权限
-x 测试当前用户对指定文件是否有执行权限
# 文件特殊权限测试
-g 测试文件是否有sgid权限
-u 测试文件是否有suid权限
-k 测试文件是否有sticky权限
# 文件大小测试
-s 测试文件是否非空
# 文件是否打开测试
-t fd fd表示的文件描述是否已经打开并且与某终端相关
# 双目测试
file1 -ef file2 测试文件1与文件2是否为同一文件
file1 -ef file2 测试文件1是否比文件2新
file1 -ef file2 测试文件1是否比文件2旧
# 无分类
-N 测试文件自从上一次被录取之后是否被修改过
-O 测试文件是否存在并且被当前用户拥有
-G 测试文件是否存在并且默认组是否为当前用户组
-a 与关系
-o 或关系
! 非关系
例如
# 总计个数 大于 1 与 总计个数 小于 3
[ $# -gt 1 -a $# -le 3 ]
# 总计个数 大于 1 后再次统计 总计个数 小于 3
[$# -gt 1 ] && [$# -le 3]
if 判断条件;then
陈述1
陈述2
........
fi
if 判断条件;then
陈述1
陈述2
.........
else
陈述1
陈述2
.........
fi
# ----------------猜数字-----------------
#!/bin/bash
num=50
read -p "请输入你所猜到的数字:" user_num
if [ $num -eq $user_num ];then
echo "哇瑟!好厉害!"
else
echo "你猜错了,哈哈哈"
fi
if 判断条件1;then
陈述1
陈述2
.........
elif 判断条件2;then
陈述3
陈述4
.........
else
陈述5
陈述6
.........
fi
case $变量名 in
value1)
陈述
...
;;
value2)
陈述
...
;;
*)
陈述
...
;;
esac
另:case支持glob风格的通配符:
* 任意长度任意字符
? 任意单个字符
[] 指字范围内的任意单个字符
abc|bcd abc或bcd
循环语句通常需要有一个进入条件和一个退出条件
for循环当列表不为空时进入循环,否则退出循环
for 变量 in 列表; do
循环体
done
for ((expr1;expr2;expr3))
{
循环体
}
for (( expr1 ; expr2 ; expr3 ));do
循环体
done
expr1 //用于指定初始条件,给控制变量一个初始值
expr2 //判定什么时候退出循环
expr3 //修正expr1指定的变量的值
//如何生成列表:
{1..100}
seq [起始数] [步进长度] 结束数
#------取出/etc/passwd的用户以及UID---------
#!/bin/bash
Fa=/etc/passwd
for (( i=1;i<=$(cat $Fa | wc -l);i++ ));do
user_name=$(awk -F ':' "NR==$i {print $ 1}" $Fa)
user_UID=$(awk -F ':' "NR==$i {print $ 3}" $Fa)
echo "hello!$user_name,you UID is $user_UID."
done
echo "一共有$(cat $Fa | wc -l)个用户."
while循环适用于循环次数未知的场景,注意要有退出条件。
条件满足时进入循环,条件不满足了退出循环。
while 条件; do
陈述
...
done
//while循环特殊用法一:死循环
while :;do
陈述
...
done
//这里的冒号可以改成任何非空值
while循环特殊用法二:逐行读取某文件,将值存入line变量中
while read line;do
陈述
...
done < /etc/passwd
#####while循环脚本
#-----while特殊用法二取用户-------
#! /bin/bash
Fa=/etc/passwd
while read line;do
user_name=$(echo $line | awk -F ':' 'NR==1 { print $1 }')
user_UID=$(echo $line | awk -F ':' 'NR==1 { print $3 }')
echo “hello! $user_name 您的UID是 $user_UID”
echo -------------------------
done < $Fa
#-------用while循环猜数字-------
#!/bin/bash
i=0
num=$[$RANDOM %100]
while :;do
((i++))
read -p "请输入一个数字" user_num
echo $user_num | egrep '^[0-9]+$' &> /dev/null
if [ $? -ne 0 ];then
echo "您输入的不是数字!请重试!"
exit
fi
if [ $user_num -gt $num ];then
echo "您输入的数字大了!"
elif [ $user_num -lt $num ];then
echo "您输入的数字小了!"
else
ehco "您输入正确!"
echo "您一共回答了$i次."
exit
fi
done
条件不满足时进入循环,条件满足了退出循环。
until 条件; do
陈述
...
done
break [num]:提前退出循环。当循环语句中出现break时,将提前退出循环,不再执行循环后面的语句
continue [num]:提前结束本轮循环而进入下一轮循环。当循环语句执行到continue时,continue后面的语句将不再执行,提前进入下一轮循环
//exit命令用于定义执行状态结果
exit # //此处的#号是一个数字,其范围可以是0-255
如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止