나는 여기에 공백을 그리고 있다. 이 스크립트를 어떻게 작성해야 하나요?
#!/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
함수는 1
or 를 반환해야 하므로 or 0
에 해당합니다 .true
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
수 있으므로 true를 반환합니다.$xyznode
[ '' = '' ]