【问题标题】:Bash conditions always evaluate true in scriptBash 条件在脚本中总是评估为真
【发布时间】: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


【解决方案1】:

$? 是最后执行命令的退出代码。在您的情况下,最后执行的命令是echo,而不是checkFolder

如果您想在运行命令和检查其状态之间执行其他命令,请将其分配给带有myvar=$?的变量

【讨论】:

    【解决方案2】:

    命令return改变的是函数的“退出代码”。
    添加这个:

     checkFolder "$rootFolder"
     echo "the exit code was $?"
    

    并查看您的return 0return 1 的效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-24
      • 2017-12-18
      • 2018-02-10
      • 1970-01-01
      • 2016-10-03
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      相关资源
      最近更新 更多