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. 은 이고 bash, false될 것이고 1, true될 것이다 0. 그래서 나는 다음 'N'으로 대체할 것입니다.1'Y'0

if또한 더 이상 일치하지 않으므로 'Y'문 을 변경할 수 있습니다 0.

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

되어야 한다

if is_xyz_node $1

함수는 1or 를 반환해야 하므로 or 0에 해당합니다 .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[ '' = '' ]

관련 정보