linux 有没有一种方法可以创建一个带有下标的脚本,使用与父脚本相同的参数和下标的附加参数?

w6lpcovy  于 2023-05-06  发布在  Linux
关注(0)|答案(1)|浏览(148)

我试图写一个脚本,有一些默认参数和一些下标。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中无效。
该过程需要可扩展到更多的下标,例如userpackage等。
我如何实现这一点?

moiiocjp

moiiocjp1#

我建议将parent和subscript之间的标志分开,而不是在命令的末尾将所有标志放在一起。

./nms -vn system -u

下面是我的解决方案nms.sh,其中-s用于下标,-p用于下标参数。

echo "Execute parent script $0"
while getopts ":s:p:hVvn" OPTION; do
    case $OPTION in
    V) echo "Received parentscript flag -V: version";;
    v) echo "Received parentscript flag -v: debugLevel";;
    n) echo "Received parentscript flag -n: dryrun";;
    s) subscript="$OPTARG";;
    p) subflags="$OPTARG";;
    h|?) echo "Show help message";;
    esac
done

# Execute subscript
if [ -f ./sub/$subscript ]; then
    ./sub/$subscript $subflags
fi

system.sh

echo "Execute subscript $0"
while getopts ":hcu" OPTION; do
    case $OPTION in
    c) echo "Received subscript flag -c: highstateCall";;
    u) echo "Received subscript flag -u: update";;
    h|?) echo "Show help message";;
    esac
done

下面是命令和结果

$ ./nms -vn -s system -p -uc
Execute parent script ./nms
Received parentscript flag -v: debugLevel
Received parentscript flag -n: dryrun
Execute subscript ./sub/system
Received subscript flag -u: update
Received subscript flag -c: highstateCall

相关问题