Linux-centos6.5-(第十篇) Shell if else语句 || shell test命令 || Shell [[]]详解:检测某个条件是否成立 || Shell case in语句

目录

 

Shell if else语句

shell test命令

1) 与文件检测相关的 test 选项

2) 与数值比较相关的 test 选​项

3) 与字符串判断相关的 test 选项

4) 与逻辑运算相关的 test 选项

Shell [[]]详解:检测某个条件是否成立

[[ ]] 不需要注意某些细枝末节

[[ ]] 支持逻辑运算符

[[ ]] 支持正则表达式

Shell case in语句

case in 和正则表达式


shell脚本部分参照:Linux Shell脚本学习指南http://c.biancheng.net/shell/

进行学习,过程中对脚本进行编写运行,部分脚本粘贴出执行结果,部分脚本添加注意事项。

Shell if else语句

if 语句

最简单的用法就是只使用 if 语句,它的语法格式为:

if  condition

then

    statement(s)

fi

 

condition是判断条件,如果 condition 成立(返回“真”),那么 then 后边的语句将会被执行;如果 condition 不成立(返回“假”),那么不会执行任何语句。

从本质上讲,if 检测的是命令的退出状态。

注意,最后必须以fi来闭合,fi 就是 if 倒过来拼写。也正是有了 fi 来结尾,所以即使有多条语句也不需要用{ }包围起来。

 

如果你喜欢,也可以将 then 和 if 写在一行:

if  condition;  then

    statement(s)

fi

 

请注意 condition 后边的分号;,当 if 和 then 位于同一行的时候,这个分号是必须的,否则会有语法错误。

案例:

#!/bin/bash

#dev by yjh

a=${1}

b=${2}

if((${a}==${b}));then

echo ${a}

elif((${a}>${b}));then

echo "连个输入值a>b"

elif((${a}<${b}));then

echo "输入值a

fi

exit 0

执行结果:

[root@com ee]# ./ifTest1.sh  2 3

输入值a

[root@com ee]# ./ifTest1.sh 23 444

输入值a

[root@com ee]# ./ifTest1.sh 23 4

连个输入值a>b

[root@com ee]# ./ifTest1.sh 2 4

输入值a

[root@com ee]# ./ifTest1.sh 2 2

2

shell test命令

test 是 Shell 内置命令,用来检测某个条件是否成立。test 通常和 if 语句一起使用,并且大部分 if 语句都依赖 test。

 

test 命令有很多选项,可以进行数值、字符串和文件三个方面的检测。

 

Shell test 命令的用法为:

test expression

 

当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值。

 

test 命令也可以简写为[],它的用法为:

[ expression ]

 

注意[]和expression之间的空格,这两个空格是必须的,否则会导致语法错误。[]的写法更加简洁,比 test 使用频率高。

案例:

#!/bin/bash

#dev by yjh

echo        "请输入年龄"

read age

if test ${age} -le 2;then

   echo "输入年龄判断为婴儿"

#条件判断,每个判断前都需要加test

elif test ${age} -ge 3 && test ${age} -le 12; then

   echo "输入年龄判断为儿童"

elif test ${age} -ge 13 && test ${age} -le 17; then

   echo "判断为少年"

#使用[]进行判断时,判断条件与[]间前后都需要加上空格

elif [ ${age} -ge 18 ] && [ ${age} -le 30 ] ;then

   echo "青年"

else

   echo "中老年"

fi

 

1) 与文件检测相关的 test 选项

表1:test 文件检测相关选项列表

文件类型判断

选 项

作 用

-b filename

判断文件是否存在,并且是否为块设备文件。

-c filename

判断文件是否存在,并且是否为字符设备文件。

-d filename

判断文件是否存在,并且是否为目录文件。

-e filename

判断文件是否存在。

-f filename

判断文件是否存在,井且是否为普通文件。

-L filename

判断文件是否存在,并且是否为符号链接文件。

-p filename

判断文件是否存在,并且是否为管道文件。

-s filename

判断文件是否存在,并且是否为非空。

-S filename

判断该文件是否存在,并且是否为套接字文件。

文件权限判断

选 项

作 用

-r filename

判断文件是否存在,并且是否拥有读权限。

-w filename

判断文件是否存在,并且是否拥有写权限。

-x filename

判断文件是否存在,并且是否拥有执行权限。

-u filename

判断文件是否存在,并且是否拥有 SUID 权限。

-g filename

判断文件是否存在,并且是否拥有 SGID 权限。

-k filename

判断该文件是否存在,并且是否拥有 SBIT 权限。

文件比较

选 项

作 用

filename1 -nt filename2

判断 filename1 的修改时间是否比 filename2 的新。

filename -ot filename2

判断 filename1 的修改时间是否比 filename2 的旧。

filename1 -ef filename2

判断 filename1 是否和 filename2 的 inode 号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法

 

案例:

#!/bin/bash

#dev by yjh

echo "请输入文件路径到名称"

read filename

echo "输入写入内容"

read content

if test -e ${filename};then

  echo "文件存在,文件为${filename}"

else

  echo "文件不存在,创建文件${filename}"

  touch ${filename}

fi

if test -w ${filename} && test -n ${content}

then

echo ${content}>${filename}

echo "写入成功"

else

echo "写入失败"

fi

2) 与数值比较相关的 test 选​项

表2:test 数值比较相关选项列表

选 项

作 用

num1 -eq num2

判断 num1 是否和 num2 相等。

num1 -ne num2

判断 num1 是否和 num2 不相等。

num1 -gt num2

判断 num1 是否大于 num2 。

num1 -lt num2

判断 num1 是否小于 num2。

num1 -ge num2

判断 num1 是否大于等于 num2。

num1 -le num2

判断 num1 是否小于等于 num2。

注意,test 只能用来比较整数,小数相关的比较还得依赖 bc 命令

3) 与字符串判断相关的 test 选项

表3:test 字符串判断相关选项列表

选 项

作 用

-z str

判断字符串 str 是否为空。

-n str

判断宇符串 str 是否为非空。

str1 = str2
str1 == str2

===是等价的,都用来判断 str1 是否和 str2 相等。

str1 != str2

判断 str1 是否和 str2 不相等。

str1 \> str2

判断 str1 是否大于 str2。\>>的转义字符,这样写是为了防止>被误认为成重定向运算符。

str1 \< str2

判断 str1 是否小于 str2。同样,\<也是转义字符。

 

案例:

#!/bin/bash

#dev by yjh

#实现输入用户和密码 1.实现用户名称或密码是否未输入进行判断

#判断用户密码是否正确

echo "请输入你的名字 姓名"

read name

echo "请输入密码"

read password

if [ -n "${name}" ] || [ -n "${password}" ];then

  echo "输入参数不能为空"

  exit 0

fi

if [ "yjh" = ${name} ] && [ "123456" = ${password} ];then

 echo 用户密码输入正确

else

 echo 用户或者密码输入错误

fi

exit 0

 

4) 与逻辑运算相关的 test 选项

表4:test 逻辑运算相关选项列表

选 项

作 用

expression1 -a expression

逻辑与,表达式 expression1 和 expression2 都成立,最终的结果才是成立的。

expression1 -o expression2

逻辑或,表达式 expression1 和 expression2 有一个成立,最终的结果就成立。

!expression

逻辑非,对 expression 进行取反。

案例:

#!/bin/bash

#dev by yjh

echo "请输入你的名字 姓名"

read name

echo "请输入密码"

read password

#ex11  -o ex12        逻辑或,表达式 expression1 和 expression2 有一个成立,最终的结果就成立。

if [ -n "${name}" -o  -n "${password}" ];then

  echo "输入参数不能为空"

  exit 0

fi

if [ "yjh" = ${name} ] && [ "123456" = ${password} ];then

 echo 用户密码输入正确

else

 echo 用户或者密码输入错误

fi

exit 0

在 test 中使用变量建议用双引号包围起来, 在 test 命令中使用变量时,我强烈建议将变量用双引号""包围起来,这样能避免变量为空值时导致的很多奇葩问题。

Shell [[]]详解:检测某个条件是否成立

[[ ]]是 Shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立。

 

test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;test 做不到的,[[ ]] 还能做到。可以认为 [[ ]] 是 test 的升级版,对细节进行了优化,并且扩展了一些功能。

 

[[ ]] 的用法为:

[[ expression ]]

 

当 [[ ]] 判断 expression 成立时,退出状态为 0,否则为非 0 值。注意[[ ]]和expression之间的空格,这两个空格是必须的,否则会导致语法错误。

[[ ]] 不需要注意某些细枝末节

[[ ]] 是 Shell 内置关键字,不是命令,在使用时没有给函数传递参数的过程,所以 test 命令的某些注意事项在 [[ ]] 中就不存在了,具体包括:

  1. 不需要把变量名用双引号""包围起来,即使变量是空值,也不会出错。
  2. 不需要、也不能对 >、< 进行转义,转义后会出错。

案例

#!/bin/bash

#dev by yjh

#测试[[]]使用

echo 输入第一个str变量

read str

echo 输入第二个变量

read str2

if [[ -z ${str} ]] || [[ -z ${str2} ]]; then

    echo "输入的参数不能为空"

elif [[ ${str} = ${str2} ]]; then

    echo "str1==str2"

else

    echo "str1!=str2"

fi

[[ ]] 支持逻辑运算符

对多个表达式进行逻辑运算时,可以使用逻辑运算符将多个 test 命令连接起来,例如:

[ -z "$str1" ] || [ -z "$str2" ]

你也可以借助选项把多个表达式写在一个 test 命令中,例如:

[ -z "$str1" -o -z "$str2" ]

但是,这两种写法都有点“别扭”,完美的写法是在一个命令中使用逻辑运算符将多个表达式连接起来。我们的这个愿望在 [[ ]] 中实现了,[[ ]]  支持 &&、|| 和 ! 三种逻辑运算符。

使用 [[ ]] 对上面的语句进行改进:

[[ -z $str1 || -z $str2 ]]

这种写法就比较简洁漂亮了。

[[ ]] 支持正则表达式

在 Shell [[ ]] 中,可以使用=~来检测字符串是否符合某个正则表达式,它的用法为:

[[ str =~ regex ]]

 

str 表示字符串,regex 表示正则表达式。

 

下面的代码检测一个字符串是否是手机号:

案例:

#!/bin/bash

#dev by yjh

#实现[[]]对正则表达式的使用,判断输入的参数是否是手机号码

echo "请输入电话号码"

read tel

if [[ ${tel} =~ ^1[0-9]{10}$ ]];then

  echo "你输入的电话号码为${tel}"

else

  echo "你输入的不是电话号码"

fi

 

  1. 使用 if 判断条件时,用 (()) 来处理整型数字,用 [[ ]] 来处理字符串或者文件。

Shell case in语句

当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了。

基本格式如下:

case expression in
    pattern1)
        statement1
        ;;
    pattern2)
        statement2
        ;;
    pattern3)
        statement3
        ;;
    ……
    *)
        statementn
esac

case、int 和 esac 都是 Shell 关键字expression 表示表达式,pattern 表示匹配模式。

expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以

pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式。


case 会将 expression  的值与 pattern1、pattern2、pattern3 逐个进行匹配:

如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句

如果 expression 没有匹配到任何一个模式,那么就执行*)后面的语句(*表示其它所有值),直到遇见双分号;;或者esac才结束。*)相当于多个 if 分支语句中最后的 else 部分。

如果你有C语言、C++、Java 等编程经验,这里的;;和*)就相当于其它编程语言中的 break 和 default

对*)的几点说明:

Shell case in 语句中的*)用来“托底”,万一 expression 没有匹配到任何一个模式,*)部分可以做一些“善后”工作,或者给用户一些提示。

可以没有*)部分。如果 expression 没有匹配到任何一个模式,那么就不执行任何操作。


除最后一个分支外(这个分支可以是普通分支,也可以是*)分支),其它的每个分支都必须以;;结尾,;;代表一个分支的结束,不写的话会有语法错误。最后一个分支可以写;;,也可以不写,因为无论如何,执行到 esac 都会结束整个 case in 语句。

上面的代码是 case in 最常见的用法,即 expression 部分是一个变量,pattern 部分是一个数字或者表达式。

case in 和正则表达式

case in 的 pattern 部分支持简单的正则表达式,具体来说,可以使用以下几种格式:

格式

说明

*

表示任意字符串。

[abc]

表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。

[m-n]

表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。

|

表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。


如果不加以说明,Shell 的值都是字符串,expression 和 pattern 也是按照字符串的方式来匹配的;本节第一段代码看起来是判断数字是否相等,其实是判断字符串是否相等。

最后一个分支*)并不是什么语法规定,它只是一个正则表达式,*表示任意字符串,所以不管 expression 的值是什么,*)总能匹配成功。

下面的例子演示了如何在 case in 中使用正则表达式:

案例:

#!/bin/bash

#dev by yjh

#当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便

printf "input integer char:"

read -n 1  char

case ${char} in

   [a-zA-Z])

         echo "这个为字符"

         echo "----->${char}"

         ;;#该分支的结束标志

   [0-9])

         echo "该字符为数字"

         echo "----->${char}"

         ;; #必须加入;;

   [,.?!])

        echo "符号"

        ;;

    *)

         printf "没有匹配上,无法识别该字符"

esac #必须要有的结束标志

 

你可能感兴趣的:(linux-centos)