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

戻り値は整数でなければならないので、1または0。はでありbashfalseなり1trueなる0。だから私は次のよう'N'に置き換えます。1'Y'0

ifまた、一致しなくなったため、'Y'ステートメントを変更できます0

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

しなければならない

if is_xyz_node $1

関数は1orを返す必要があるため、or0に対応します。truefalse

答え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

注意事項は次のとおりです。

  • returnBashでは、オプションの引数に整数型が必要です。これにより、関数はその整数を状態で終了する$?か、指定されていない場合は値で終了します。したがって、文字列の代わりに整数を使用する必要があります。整数は0から0の間でなければなりません。return 0これは成功を意味し、他の値は失敗を意味します。

  • 変数を二重引用符で囲んで変数を保護する必要があります。

  • $xyznode空でないテストを追加する必要があります。 @mikeservが彼のコメントで指摘したように、両方とも空の文字列である可能性が$1あるため、trueを返します。$xyznode[ '' = '' ]

関連情報