我试图写一个脚本,有一些默认参数和一些下标。parent-script的参数需要与下标的参数结合使用,如下所示:
./parentscript subscript -vned
下面是parent-script:nms.sh
#!/bin/bash
TEMP=$(getopt -o v --long verbose -n 'nms' -- "$@")
if [ "$?" != 0 ]; then
echo "Aborting..." >&2
exit 1
fi
eval set -- "$TEMP"
if [[ $# -gt 0 ]]; then
if [[ "$1" =~ ^-.+ ]]; then
while true; do
case "$1" in
-v | --verbose)
echo "debuglevel 4"
;;
--)
shift
break
;;
*)
echo "$1 is not a valid parameter."
break
;;
esac
shift
done
else
method="$1"
shift
source ./$method
$method "$@"
fi
fi
现在在下标中:system.sh
#!/bin/bash
TEMP=$(getopt -o u --long update -n 'nms' -- "$@")
if [ "$?" != 0 ]; then
echo "Aborting..." >&2
exit 1
fi
eval set -- "$TEMP"
while true; do
case "$1" in
-u | --update)
echo "system update"
exit 0
;;
--)
shift
break
;;
*)
echo "$1 is not a valid parameter."
;;
esac
done
我的目标是实现这样的脚本调用:
./nms system -vu
-v
- verbose(nms.sh)-u
- update(system.sh)
脚本首先检查是否有参数传递,然后检查第一个参数是否以-
开头,例如-v
或--verbose
。如果是这样,进入while循环。如果不是,则从第一个参数中过滤下标,并将其余参数传递给下标。
不幸的是,它并不像预期的那样工作。
脚本失败,因为getopt
现在没有-u
参数,然后退出。取出$? != 0
时,检查其内部的exit 1
,打印:
nms: invalid option -- 'u'
-v -- system.sh
删除eval set -- "$TEMP"
和$? != 0
时,会显示:
nms: invalid option -- 'u'
system.sh -vu
nms: invalid option -- 'v'
Aborting...
在最后一步中,可以清楚地观察到,system.sh
脚本正在获取源代码,因为-v
选项在system.sh
中无效。
该过程需要可扩展到更多的下标,例如user
、package
等。
我如何实现这一点?
1条答案
按热度按时间moiiocjp1#
我建议将parent和subscript之间的标志分开,而不是在命令的末尾将所有标志放在一起。
下面是我的解决方案
nms.sh
,其中-s
用于下标,-p
用于下标参数。而
system.sh
下面是命令和结果