ksh:如果条件问题:如果测试..则vs vs如果..然后



如果我放置test或不带test在.ksh文件中有什么区别?

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

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

非常感谢

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

  1. 外壳中的每个命令返回true(0)或false Exit代码
  2. 外壳中的控制结构不需要比较

外壳中的每个命令返回出口代码

外壳中的任何正确编码的命令将返回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

外壳中的控制结构不需要比较

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

if compound-list
then
    compound-list
fi

有关完整语法,请参阅第2.9.4节"开放组基本规格"外壳命令语言的复合命令。

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

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

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

结论

在if/then/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

最新更新