如果我将test
或test
放入.ksh文件中会有什么不同?
if test $1 -ne 0 ; then ....
和
if $1 -ne 0 ; then ....
非常感谢
答案 0 :(得分:1)
我实际上认为这是一个重要的问题,因为它突出了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
让我们从最简单的定义开始
if
命令:
if compound-list
then
compound-list
fi
有关完整语法,请参阅2.9.4 Compound Commands的Shell Command Language部分The Open Group Base Specifications。
在关键字if
,then
和fi
之间有两个部分
代码,名为 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