【发布时间】:2016-01-28 22:15:36
【问题描述】:
我有一个条件似乎总是被评估为真。
#!/bin/bash
checkFolder() {
echo "[checkFolder]"
echo "check $1"
[ -n "$1" ] && [ -d "$1" ] && return 0
echo "[/checkFolder]"
return 1
}
rootFolder=$1
echo "check $rootFolder"
checkFolder "$rootFolder"
echo "res: $res" # !! <--- I omitted this test line, as I thought it was irrelevant.
echo "ret: $?"
当我执行我的脚本时,任何路径都会给我一个返回值 0。这意味着我提供的任何字符串似乎都被视为非空以及现有目录。我试过了:
./myScript.sh "."
./myScript.sh ""
./myScript.sh "wqert"
我会得到一个0的返回值。这是怎么回事? 如果我在终端中运行此命令:
param=""
[ -n "$param" ] && [ -d "$param" ] && echo ok
# returns nothing
param="hello"
[ -n "$param" ] && [ -d "$param" ] && echo ok
# returns nothing
param="/home"
[ -n "$param" ] && [ -d "$param" ] && echo ok
# returns "ok"
为什么它在我的脚本中不起作用?
【问题讨论】:
-
您是否认为设置名为
param的变量会导致$1采用该值? -
脚本
./myScript.sh对我来说很好用。 -
对于termianl中的命令,这是一个错误,我刚刚更正了。但是,在我的脚本函数
checkFolder中,$1确实将参数作为值传递。所以我的问题仍然存在。 -
@kaligne 所以,现在你有了答案:
echo行是相关的。它设置了一个退出代码,最后的echo "ret: $?"返回前面echo语句的退出代码。 -
感谢您的提示,我意识到问题出在我省略的一行上,因为我认为这与这里无关。我在我的帖子中添加了它:
echo "res: $res",这是在我打电话给$?之前。所以现在我猜echo在这里返回值0?除了变量$?之外,我还有其他方法可以检索返回值吗?
标签: bash function conditional-statements