- Shell编程中的if分支语句:
- 伪代码表示:
- 注意符号和表达式之间的空格;
if [ 表达式1 ]
then分支1
elif [ 表达式2 ]
then分支2
elif [ 表达式3 ]
then分支3
else其它
fi
- 按整型的方式,if分支语句比较字符串的大小:
- 等于:
-eq
- 不等于:
-ne
- 小于:
-lt
- 大于:
-gt
- 小于等于:
-le
- 大于等于:
-ge
方括号[ ]内部
逻辑与运算:-a
方括号[ ]外部
逻辑与运算:&&
方括号[ ]内部
逻辑或运算:-o
方括号[ ]外部
逻辑或运算:||
- 逻辑非运算:
!
- 测试代码:
read -p "请输入数值1:" X
read -p "请输入数值2:" Yif [ $X -gt 0 ] && [ $Y -gt 0 ]
thenecho "两个大于0的数值"if [ $X -eq $Y ]thenecho "$X等于$Y"elif [ $X -gt $Y ]thenecho "$X大于$Y"elseecho "$X小于$Y"fi elseecho "两个小于或着等于0的数值"
fi
请输入数值1:88
请输入数值2:99
两个大于0的数值
88小于99
请输入数值1:99
请输入数值2:99
两个大于0的数值
99等于99
请输入数值1:99
请输入数值2:88
两个大于0的数值
99大于88
请输入数值1:-88
请输入数值2:-99
两个小于或着等于0的数值
- if分支语句判断文件的类型:
- 判断文件是否存在:
-e
- 判断文件是否非空:
-s
- 判断文件是否是块设备文件:
-b
- 判断文件是否是套接字文件:
-S
- 判断文件是否是管道文件:
-p
- 判断文件是否是普通文件:
-f
- 判断文件是否是链接文件:
-L
- 判断文件是否是字符设备文件:
-c
- 判断文件是否是目录文件:
-d
- 特别注意:
- 判断文件类型时,若文件既是链接文件,又是普通文件时,优先判断链接文件;
- 测试代码:
read -p "请输入某文件名称:" FEif [ -e $FE ]
thenecho "该文件存在"if [ -s $FE ]thenecho "该文件不是空的"if [ -L $FE ]thenecho "该文件是链接文件"elif [ -f $FE ]thenecho "该文件是普通文件"elif [ -d $FE ]thenecho "该文件是目录文件"fielseecho "该文件是空的"fi
elseecho "该文件不存在"
fi
请输入某文件名称:f5.sh
该文件存在
该文件不是空的
该文件是普通文件
- if分支语句判断文件的权限:
- 判断文件是否有读权限:
-r
- 判断文件是否有写权限:
-w
- 判断文件是否有执行权限:
-x
- 特别注意:
- 判断的是执行脚本者的权限;
- 测试代码:
read -p "请输入文件名:" FEif [ -r $FE ]
thenecho "有读权限"
elseecho "没有读权限"
fiecho "------------------------"
if [ -w $FE ]
thenecho "有写权限"
elseecho "没有写权限"
fi
echo "------------------------"
if [ -x $FE ]
thenecho "有执行权限"
elseecho "没有执行权限"
fi
请输入文件名:f4.sh
有读权限
------------------------
有写权限
------------------------
没有执行权限
- if分支语句判断文件的Inode的异同:
- 所使用的选项:
-ef
- 终端
查看Inode
的命令:stat 文件名
- 特别注意:
- 不同为假,相同为真;
硬链接
文件Inode一致
;- 测试代码:
read -p "请输入文件1名称" FE1
read -p "请输入文件2名称" FE2if [ $FE1 -ef $FE2 ]
thenecho "相同"elseecho "不同"
fi
请输入文件1名称f1.sh
请输入文件2名称f2.sh
不同
请输入文件1名称f1.sh
请输入文件2名称f1.sh
相同
- if分支语句对字符串的判断:
- 判断字符串是否为空:
-z
- 判断字符串是否为非空:
-n
- 判断字符串是否相等:
=
OR ==
- 判断字符串是否不等:
!=
- 判断字符串是否大小:
\<
OR \>
- 特别注意:
- 引用字符串时,要加
双引号" "
; - 测试代码:
read -p "请输入字符串1:" STR1
read -p "请输入字符串2:" STR2if [ -z "$STR1" ]
thenecho "STR1空"elseecho "STR1不空"fiecho "--------------------------"if [ -n "$STR2" ]
thenecho "STR2不空"elseecho "STR2空"fi
echo "--------------------------"if [ "$STR1" == "$STR2" ]
thenecho "STR1 = STR2"elif [ "$STR1" \> "$STR2" ]
thenecho "STR1 > STR2"
elseecho "STR1 < STR2"
fi
请输入字符串1:hello
请输入字符串2:helle
STR1不空
--------------------------
STR2不空
--------------------------
STR1 > STR2
- if分支语句判断文件的时间戳:
- 判断文件1是否比文件2更新:
-nt
- 判断文件1是否比文件2更旧:
-ot
- 特别注意:
- 比较的是文件1和文件2的最后一次修改时间;
- 测试代码:
read -p "输入文件1的文件名:" FE1
read -p "输入文件2的文件名:" FE2if [ $FE1 -nt $FE2 ]
thenecho "文件1比文件2更新"
elseecho "文件1比文件2更旧"
fiecho "---------------------------"if [ $FE1 -ot $FE2 ]
thenecho "文件1比文件2更旧"
elseecho "文件1比文件2更新"
fi
输入文件1的文件名:f1.sh
输入文件2的文件名:f2.sh
文件1比文件2更旧
---------------------------
文件1比文件2更旧
输入文件1的文件名:f3.sh
输入文件2的文件名:f2.sh
文件1比文件2更新
---------------------------
文件1比文件2更新
- 实例要求:
- 1.判断当前路径下是否存在名称为
dir_DIR的文件
,若存在,输入'Y'
清空,若不存在,自动新建目录文件dir_DIR
; - 2.判断当前路径下是否存在名称为
file_DIR的文件
,若存在,输入'Y'
清空,若不存在,自动新建目录文件file_DIR
; - 3.根据提示信息,输入一个路径,将该路径下普通文件和目录文件进行分类,并且复制到目录文件dir_DIR和file_DIR中,需要统计具体多少个普通文件和多少个目录文件,并列举出所复制的所有文件;
- 测试代码:
DIR_PATH=$HOME/xxxx/dir_DIR
FILE_PATH=$HOME/xxxx/file_DIRif [ -e $DIR_PATH ]
thenecho "存在dir_DIR文件"read -p "是否清空,请输入[Y/N]>>" Cif [ $C == "Y" ]thenrm -rf $DIR_PATHelseecho "退出脚本"exitfifi
echo "新建目录文件dir_DIR"
mkdir $DIR_PATHif [ -e $FILE_PATH ]
thenecho "存在file_DIR文件"read -p "是否清空,请输入[Y/N]>>" Cif [ $C == "Y" ]thenrm -rf $FILE_PATHelseecho "退出脚本"exitfifi
echo "新建目录文件file_DIR"
mkdir $FILE_PATHFILE_NUM=0
DIR_NUM=0read -p "请输入一个路径>>" Pafor i in `ls $Pa`
doif [ -f $Pa/$i ]thencp $Pa/$i $FILE_PATH((FILE_NUM++))elif [ -d $Pa/$i ]thencp -r $Pa/$i $DIR_PATH((DIR_NUM++))fi
doneecho "-----该路径下的普通文件和目录文件分类已完成-----"
echo "总共复制了 $FILE_NUM 个普通文件"
echo "分别是:"
ls $FILE_PATH
echo "总共复制了 $DIR_NUM 个目录文件"
echo "分别是:"
ls $DIR_PATH
新建目录文件dir_DIR
新建目录文件file_DIR
请输入一个路径>>/home/linux/xxxx/dir1
-----该路径下的普通文件和目录文件分类已完成-----
总共复制了 4 个普通文件
分别是:
file1 file2 file3 file4
总共复制了 5 个目录文件
分别是:
dir2 dir3 dir4 dir5 dir6
存在dir_DIR文件
是否清空,请输入[Y/N]>>Y
新建目录文件dir_DIR
存在file_DIR文件
是否清空,请输入[Y/N]>>Y
新建目录文件file_DIR
请输入一个路径>>/home/linux/xxxx/dir1
-----该路径下的普通文件和目录文件分类已完成-----
总共复制了 4 个普通文件
分别是:
file1 file2 file3 file4
总共复制了 5 个目录文件
分别是:
dir2 dir3 dir4 dir5 dir6