Linux命令行与shell脚本编程大全笔记(使用结构化命令 if case)

if-then语句

# if 根据 后面命令执行的退出状态码决定是否执行后面的语句,只有退出码为0时,才会执行;
# 命令执行出错的提示也会显示在终端--这个问题待解决
if pwd
then
	echo "pwd is success"
fi
# 另一种形式
if pwd; then
	echo "pwd is success"
fi

if-then-else语句

# if后面的命令执行失败后会执行else后面的语句
if pwd
then
	echo "pwd is success"
else
	echo "pwd is failure"
fi

嵌套if

if pwd
then
	echo "pwd is success"
else
	if who
	then
			echo "who is success"
	fi
fi
#另外一种形式的嵌套, 注意在elif语句中,后面的else属于elif 代码块,而不属于之前的if-then
if pwd
then
	echo "pwd is success"
elif who
then 
	echo "who is success"
else
	echo "who is failure"
fi

test命令
测试命令状态退出码之外的条件

# 如果不写test后面的内容,直接智选哪个else部分
if test
then
	echo a
else
	echo b
fi
# 测试变量时,若变量值为空则执行else中的语句 var=""
if test $var
then
fi
# 另外一种测试方法,无需声明test命令,用 [ ] 代替,但要注意的是方括号前后要加空格!!!
if [ somethint ];
then
	echo a
fi

test命令可以判断三类条件:数值比较字符串比较文件比较

数值比较

比较 描述
n1 -eq n2 相等
n1 -ge n2 大于等于
n1 -gt n2 大于
n1 -le n2 小于等于
n1 -lt n2 小于
n1 -ne n2 不等于

*注意单词缩写,方便记忆
*bash shell 只能处理整数,处理浮点数时会报错

if [ $var1 -lt 5 ];
then
fi

if [ $var1 -lt $var2 ];
then
fi

字符串比较
*字符串比较时需要对 > 和 < 进行转义
*大于和小于顺序和sort顺序相反,test中大写字母小于小写字母,sort中相反
*test用标准的ASCII顺序,sort用系统的本地语言设置中定义的排序顺序
*空的和未初始化的变量会对shell脚本测试造成灾难性的影响!!!

比较 描述
str1 = str2 相等
str1 != str2 不相等
str1 < str2 小于
str1 > str2 大于
-n str2 字符串长度是否非0
-z str2 字符串长度是否为0
if [ $var1 \> $var2 ];
then
fi
var1=test
var2=''
if [ -n $var1 ];then
	echo not empty
fi
if [ -z $var2 ]; then
	echo empty
fi
# 对于未定义的变量,长度仍然为0
if [ -z $var111 ]; then
	echo empty
fi

文件比较

比较 描述
-d file 检查是否存在并是一个目录
-e file 检查file是否存在
-f file 检查file是否存在并是一个文件
-s file 检查file是否存在并非空
-w file 检查file是否存在并可写
-r file 检查file是否存在并可读
-x file 检查file是否存在并可执行
-O file 检查file是否存在并属于当前用户所有
-G file 检查file是否存在并且默认组与当前用户相同
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧

-nt 和 -ot 检查是如果文件不存在,可能会返回一个错误的结果,所以使用是必须保证两个文件都是存在的

if [ -d file1 ]; then
fi

符合条件测试
使用布尔逻辑来组合测试

if [ -d $HOME ] && [ -w $HOME/testing ]; then
fi
if [ -d $HOME ] || [ -w $HOME/testing ]; then
fi

if-then的高级特性
用于数学表达式的 双括号

符号 描述
val++ 后增
val– 后减
++val 先增
–val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左移位
>> 右移位
& 位布尔和
| 位布尔或
&& 逻辑和
|| 逻辑或
# 不需要将双括号内的符号转义, 这是另一个高级特性
if (( $val ** 2 > 90 ));then
fi

用于高级字符串处理的 双方括号

# 可以使用test命令的标准字符串比较
if [[ $var = "hahah" ]];then
fi
# 高级特性,模式匹配, 双等号将右边的字符串视为一个模式
if [[ $USEER == ro* ]];then
fi

case命令

case $var in
tra2 | tra4)
	echo "it's me"  #此处没有双 ;; 号
	echo "2,4";;
tar1)
	echo "1";;
*)
	echo "you are not allowed here";;
esac

猜你喜欢

转载自blog.csdn.net/qq_34595352/article/details/93204181