如果我放置test
或不带test
在.ksh文件中有什么区别?
if test $1 -ne 0 ; then ....
和
if $1 -ne 0 ; then ....
非常感谢
我实际上认为这是一个重要的问题,因为它突出了Shell编程中的一些重要规则:
- 外壳中的每个命令返回true(0)或false Exit代码
- 外壳中的控制结构不需要比较
外壳中的每个命令返回出口代码
外壳中的任何正确编码的命令将返回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节"开放组基本规格"外壳命令语言的复合命令。
在关键字,if
,then
和fi
之间有两个部分代码,名为 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