KSH:IF条件问题:如果测试....那么vs如果......那么

时间:2016-11-23 04:04:08

标签: ksh

如果我将testtest放入.ksh文件中会有什么不同?

if test $1 -ne 0 ; then ....

if $1 -ne 0 ; then ....

非常感谢

1 个答案:

答案 0 :(得分:1)

我实际上认为这是一个重要的问题,因为它突出了shell编程中的一些重要规则:

  1. shell中的每个命令都返回一个true(0)或false退出代码
  2. shell中的控件结构不需要比较
  3. shell中的每个命令都返回退出代码

    shell中任何正确编码的命令都会返回0表示成功, 失败的非零。虽然只有一种方法可以成功,但总是失败。

    示例:

    $ no-such-command || echo no $?
    ksh[1]: no-such-command: not found [No such file or directory]
    no 127
    $ 
    

    命令的退出状态在伪变量$?中捕获,并且在您完成另一个命令之前可用。

    此退出状态用于if ... then ... fi等控制结构 或until ... do ... done

    failing(){ return 2; }
    failing &&
        echo "It works" ||
        echo "It failed with exit code $?"
    

    结果

    It failed with exit code 2
    

    shell中的控件结构不需要比较

    让我们从最简单的定义开始 if命令:

    if compound-list
    then
        compound-list
    fi
    

    有关完整语法,请参阅2.9.4 Compound CommandsShell Command Language部分The Open Group Base Specifications

    在关键字ifthenfi之间有两个部分 代码,名为 compound-list

    这是在脚本中有效的任何代码序列的简写。列表的退出状态将等于列表中最后一个命令的退出状态。

    两个列表的重要区别在于,第一个将确定控制流,而第二个确定整个表达式的退出状态,执行时。

    结论

    任何命令都可以用作if / then / else / fi结构中的 test 。 由于我们经常要明确地测试内容,因此我们经常使用实际的test命令或其衍生产品[ ... ][[ ... ]]

    if [[ -n $1 ]]; then
        echo "'$1' is a non-empty string"
    fi
    

    对于复杂表达式,始终首选将它们包装在一个表达式中 函数来应用一些抽象。

    另一个简单的例子:

    non_empty_files_present(){
      (path=${1:?directory expected}
        (find ${path} -type f -size +0 | read line) 2> /dev/null
      )
    }
    
    if non_empty_files_present /var/tmp; then
      echo "Some files have content"
    fi