linux shell脚本基础-----2

2.2 条件及控制结构

  条件: test 或 [命令。 当使用[命令时,还需要使用]来结尾。

    test命令的退出码(表明条件是否被满足)决定是否需要执行后面的条件代码。

  例如:

  

if test -f fred.c
then
    echo "test success"
fi

if [ -f fred.c ]
then
    echo "test success"
fi

if [ -f fred.c ]; then
  echo "test success"
fi

  注意:

  1. [和被检查的条件之间必须留出空格 ;

  2. then可和if放在一行,但必须在前面加分号

  条件类型: test命令可以使用的条件类型可以归为3类:字符串比较、算术比较和与文件有关的条件测试

条件类型
字符串比较 结果
string1 = string2 如果两个字符串相同,则结果为真
string1 != string2 如果两个字符串不同,则结果为真
-n string 如果字符串不为空,则结果为真
-z string 如果字符串为null(空串),则结果为真
算术比较  
expression1 -eq expression2 如果两个表达式相等,则结果为真
expression1 -ne expression2 如果两个表达式不等,则结果为真
expression1 -gt expression2 如果expression1>expression2,则结果为真
expression1 -ge expression2 如果expression1>=expression2,则结果为真
expression1 -lt expression2 如果expression1<expression2,则结果为真
expression1 -le expression2 如果expression1<=expression2,则结果为真
! expression 如果表达式为假则结果为真,如果表达式为真则结果为假
文件条件测试  
-d file   如果文件是一个目录则结果为真
-e file 如果文件存在则结果为真(不可移植,常使用-f选项)
-f file 如果文件是一个普通文件则结果为真
-g file 如果文件的set-group-id位被设置则结果为真
-r file 如果文件可读,则结果为真
-s file 如果文件的大小为0则结果为真
-u file 如果文件的set-user-id位被设置则结果为真
-w file 如果文件可写则结果为真
-x file 如果文件可执行则结果为真

 

 

 

控制结构: 

1. if 语句

if condition
then
    statements
else  #或elif
    statements
fi
#!/bin/sh

echo "Is it morning? Please answer yes or no"

read timeofday

if [ "$timeofday" = "yes" ] #注意,如果用if [ $timeofday = "yes" ],可能变成 if [ = "yes" ]
then
     echo "Good morning"
elif [ "$timeofday" = "no" ] ; then
    echo "Good afternoon"
else
    echo "Sorry, $timeofday not recognized. Enter yes or no"
    exit 1
fi

    exit 0

2. for 语句

#/bin/sh

# 固定字符串实例
for foo in bar fud 43
do
    echo $foo
done

# 使用通配符扩展的for循环
for file in $(ls f*.sh); do
    echo $file
done

exit 0

3. while和until语句

# 若condition为真,则执行statements,不满足条件就会终止
while condition do
    statemensts 
done

# 若condition不为真,则执行statements,即条件不满足时执行statements
until condition do
    statements
done

3. case语句

case variable in
    pattern [ | pattern] ... )  statements;;
    pattern [ | pattern] ... )  statements;;
    ...
 esac

注意:

    每个模式行都已双分号(;;)结尾;

    要特别小心,case将使用第一个匹配的模式,即使后续的模式有更加精确的匹配也是如此。

  

#/bin/sh

echo "Is it morning? Please answer yes or no"
read timeofday

case "$timeofday" in
        yes)    echo "Good Morning";;
        no )    echo "Good afternoon";;
        y   )    echo "Good Morning";;
        n  )     echo "Good afternoon";;
        *  )     echo "Sorry, answer not recognized";;       
esac

case "$timeofday" in
        yes | y | Yes | YES)    echo "Good Morning";;
        n* | N* )    echo "Good afternoon";;
        *  )     echo "Sorry, answer not recognized";;       
esac

exit 0

4. 命令列表

statement1 && statement2 && statement3 && ...    #从左到右顺序执行每条命令,直到有条命令返回false或列表中所有命令执行完毕。&&的作用是检查前一条命令的返回值。
statement1 || statement2 || statement3 || ...    #从左到右顺序执行每条命令,直到有条命令返回true或列表中所有命令执行完毕。

5. 语句块
  如果想在某些只允许使用单个语句的地方(比如&&或||列表中)使用多条语句,可以把它们括在{}内来构成一个语句块。

原文地址:https://www.cnblogs.com/wangzhijun/p/3601289.html