我有port.sh
作为独立脚本的函数,我想知道是否可以将此函数放在 getopts 所在的同一个脚本中,并将值传递到OPT_B
函数中并获取它的输出?
OPT_B=B
while getopts :a FLAG; do
case $FLAG in
b) #set option "b"
OPT_B=$OPTARG
;;
esac
done
shift $((OPTIND-1))
!!-->> port $1 <<--!! -> OPT_B=$(port $1) ??
function port()
{
if [ "$1" = 'B' ]; then
set $1=8000
echo "declared value: $1"
elif [[ "$1" =~ ^[0-9]+$ ]] && [ "$1" -ge 1 -a "$1" -le 10000 ]; then
echo "chosen value: $1"
else echo "chosen value $1 is not in '1 - 10000'"
fi
return 0;
}
答案1
不要使用function port()
——它实际上没有任何意义。当使用命令声明bash
orksh
函数时function
,您不使用 the()
但 shell 接受它作为可原谅的语法哎呀,并且表现得就像您function
根本没有使用过一样。所以不要。
port()
case ${1:--} in (B) OPT_B=8000;; (*[!0-9]*)
! printf 'chosen value %s not in %s\n' \
"${1:-''}" "'1 - 10000'" ;;
(*) [ "$(( $1>0 && $1<10001 ))" -ne 0 ] &&
echo "chosen value '$1'" ||
port "'$1'" ;;
esac
这是编写函数的 POSIX 正确方法(除了上面出错时返回正确的情况)。如果以上内容在 shell 脚本中,并且$0
我无论如何都想调用该函数,我可能会这样做:
eval "$(sed '/^port()/,$!d;/esac/q' /path/to/script_containing_port.sh)"
port B #or whatever
...如果我可以确定^port()
该脚本中第一次出现 肯定表示我想要声明的函数的开始。否则,如果该函数位于自己的脚本中,我会这样做:
. /path/to/port.fn.sh; port B
最后,您可能不应该命名脚本文件某事.sh除非它们确实是sh
脚本 - 也就是说,如果您编写一个bash
脚本,请将其命名为something.bash
.否则就没有意义。