如何在bash中编写函数?

如何在bash中编写函数?

我在这里画空白。我应该如何编写这个脚本?

#!/bin/sh

XZY_NODES="\
vl-ocnt-1 \
vl-ocnt-2 \
vl-onet-1 \
vl-onet-2 \
vl-ocmp-1 \
vl-oomp-2 \
"

is_xyz_node () {
        host=$1
        for xyznode in $XZY_NODES
        do
                if [ $host == $xyznode ]
                then
                        return 'Y'
                fi
        done
        return 'N'
}

if [ 'Y' == $(is_xyz_node $1) ]
then
        echo "$1 is a xyz node"
else
        echo "$1 is NOT a xyz node"
fi 

当我运行这个脚本时,我得到这个输出......

$ ./test.sh not-xyz
./test.sh: line 22: return: N: numeric argument required
./test.sh: line 25: [: Y: unary operator expected
not-xyz is NOT a xyz node

$ ./test.sh vl-ocnt-2
./test.sh: line 19: return: Y: numeric argument required
./test.sh: line 25: [: Y: unary operator expected
vl-ocnt-2 is NOT a xyz node

答案1

返回需要是一个整数,所以10。在bashfalse将是1true将是0。所以我会替换'N'1'Y'0

另外,您还可以更改语句,if因为您将不再匹配'Y',您将匹配0

if [ 'Y' == $(is_xyz_node $1) ] 

应该成为

if is_xyz_node $1

因为函数应该返回1or ,0它对应于trueor false

答案2

您可以稍微更改一下代码:

is_xyz_node() {
  host="$1"
  for xyznode in $XZY_NODES; do
    if [ -n "$xyznode" ] &&
       [ "$host" = "$xyznode" ]; then
      return 0
    fi
  done
  return 1
}

if is_xyz_node "$1"; then
  printf '%s is a xyz node\n' "$1"
else
  printf '%s is NOT a xyz node\n' "$1"
fi

有一些事情需要注意:

  • return在 bash 中,其可选参数需要整数类型;它会导致函数以该整数作为其状态退出,$?如果未提供,则以 的值退出。所以你必须使用整数而不是字符串。整数必须介于 0 和 0 之间;return 0意味着成功,任何其他值都意味着失败。

  • 您应该通过将变量用双引号括起来来保护它们。

  • $xyznode您应该添加一个不为空的测试。正如 @mikeserv 在他的评论中指出的那样,$1和可能$xyznode都是空字符串,因此[ '' = '' ]返回 true。

相关内容