我在这里画空白。我应该如何编写这个脚本?
#!/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 ,0
它对应于true
or 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。