shell函数的布尔返回值表现奇怪

时间:2014-03-22 08:14:21

标签: linux shell

我已定义此功能(带有一些调试打印输出):

listcontains() {
  for item in $1
  do
    echo $2 = $item ?
    if [ "$2" == "$item" ]; then
      echo YES!
      return 1;
    fi
  done
  echo NO!
  return 0
}

我正在使用它:

list="1 2"
if listcontains "$list" 3; then echo Y; else echo N; fi

我期待N,但结果是Y,调试输出使它更奇怪:

3 = 1 ?
3 = 2 ?
NO!
Y

我做错了什么?

1 个答案:

答案 0 :(得分:1)

在shell中,您使用0来表示true(以及一些正数,即1,以表示false)。这与脚本退出值的概念相同 - 在unix世界中,0表示成功。

所以要修复,只需反转返回值:

listcontains() {
  for item in $1
  do
    echo $2 = $item ?
    if [ "$2" == "$item" ]; then
      echo YES!
      return 0;
    fi
  done
  echo NO!
  return 1
}

示例:

$ list="1 2"
$ if listcontains "$list" 3; then echo Y; else echo N; fi
3 = 1 ?
3 = 2 ?
NO!
N

$ list="1 3"
$ if listcontains "$list" 3; then echo Y; else echo N; fi
3 = 1 ?
3 = 3 ?
YES!
Y