linux命令行及shell脚本学习笔记之if-then,test命令

#!/bin/bash
# testing the if statement
if pwd
then
echo "It worked"
fi
$

如果你在用其他编程语言的if-then语句,这种形式可能会让你有点困惑。在其他编程语言中,if语句之后的对象是一个等式,这个等式的求值结果为TRUE或FALSE。但bash shell的if语句并不是这么做的。 bash shell的if语句会运行if后面的那个命令。如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他值, then语句部分的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。fi语句用来表示if-then语句到此结束。

输出结果:we are outside the if statement

then部分可以执行多条命令

if-then-else语句

if command
then
commands
else
commands
fi

可以可以嵌套

test命令

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

if test condition
then
commands
fi

如果不写condition部分,它会以非0状态码退出,并执行else

if test $variable // 确认变量里面是否有内容

bash shell提供了另外一种条件测试方法:方括号方式

// 注意方括号的 空格
if [ condition ]
then
commands
fi

数值比较

字符串比较


比较等于和不等于很简单,麻烦的是比较大小

两个问题需要注意:
1. 大于号和小于号必须转义,否则shell会把它们当作重定向符号,把字符串值当作文件名
2. 大于和小于顺序和sort命令所采用的不同

注意上面的转移\ 否则就变成了命令输出了,始终走else
比较大小是比较字母的ASCII码值

运行结果:

if [ -n $val1 ]
判断val1变量是否长度非0,而它的长度正好非0,所以then部分被执行了。
if [ -z $var2 ]
判断val2变量是否长度为0,而它正好长度为0,所以then部分被执行了。
if [ -z $val3 ]
判断val3变量是否长度为0。这个变量并未在shell脚本中定义过,所以它的字符串长度仍然为0,尽管它未被定义过

空的和未初始化的变量会对shell脚本测试造成灾难性的影响

文件比较(test命令)

#!/bin/bash
# 判断该目录是否存在
jump_directory=/usr/local
#
if [ -d $jump_directory ]
then
        echo "The $jump_directory directory exists"
        cd $jump_directory
        ls
else
        echo "The $jump_directory directory does not exist"
fi

复合条件测试

[ condition1 ] && [ condition2 ] 
[ condition1 ]||[ condition2 ] 

if-then 的高级特性

双括号 (( expression )):用于数学表达式的双括号


#!/bin/bash
# 使用双括号
#
val1=10
#
if (( $val1 ** 2 > 90 ))
then
(( val2 = $val1 ** 2 ))
echo "The square of $val1 is $val2"
fi

双方括号命令提供了针对字符串比较的高级特性

双方括号里的expression使用了test命令中采用的标准字符串比较。但它提供了test命令未提供的另一个特性——模式匹配(pattern matching)

重复(循环):for,while,until,test

#!/bin/bash
IFS=:
for folder in $PATH
do
  echo "$folder:"
  for file in $folder/*
  do
    if [ -x $file ]
    then
      echo " $file"
    fi
  done
done

shell
作者:张雪飞
出处:https://zhangxuefei.site/p/2321
版权说明:欢迎转载,但必须注明出处,并在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

发表评论

电子邮件地址不会被公开。 必填项已用*标注