【问题标题】:Bash - Wrapping another command's parametersBash - 包装另一个命令的参数
【发布时间】:2017-04-27 08:52:09
【问题描述】:

包装另一个命令的参数

我有一个命令 tool1 以这种方式解析参数:

#!/usr/bin/env bash
# ...
while [[ $# -ge 1 ]]
do
        key="$1"
        case $key in
                -o|--option)
                OPT="$2"
                shift
                ;;  

                -u|--user)
                USR="$2"
                shift
                ;; 

                -*) 
                echo -e "Unrecognized option: \"$key\"" && exit 1 
                ;;  

                *)  
                OTHERS+=("$1")
                ;;  
        esac
        shift
done
# ...

我有tool2 调用tool1。因此tool2 必须将参数传递给tool1。它可能还需要处理相同的参数(--user

tool2 看起来像:

#!/usr/bin/env bash
# ...
while [[ $# -ge 1 ]]
do
        key="$1"
        case $key in
                -O|--option2)
                opt2="$2"
                shift
                ;;  

                -u|--user)
                USR="$2"
                OTHERS+=("-u $2")
                shift
                ;;  

                -*) 
                echo -e "Unrecognized option: \"$key\"" && exit 1 
                ;;  
                *)  
                OTHERS+=("$1")
                ;;  
        esac
        shift
done

## Call tool1 with other parameters to pass
bash tool1.sh ${OTHERS[@]}
# ...

总结 --option2 是仅由 tool2 使用的选项。 --user 对这两种工具都是通用的,tool2 也可以在调用 tool1.sh 之前使用。因此,在此示例中,--user 必须显式传递给 tool1,这要归功于数组 OTHERS

我想了解处理此类参数冗余的可能和/或替代方法。一种方法可以帮助我包装另一个工具的预期参数/选项,而无需复制/粘贴有关解析此类冗余参数/选项的行。

【问题讨论】:

  • 你为什么不使用getopt内置?
  • 针对可移植性问题。 getopt 没有标准化。 getopts 但是不支持长选项。
  • 如果选项在第二个脚本中但不在第一个脚本中怎么办?另外,如果两个脚本都可以作用于一个参数,那么它是多余的吗?
  • 值得edit提出您的问题,以澄清 tool1 是否是在 tool2 之外也被调用的独立命令。如果tool1只被tool2调用,我会把它写成tool2中的一个函数。
  • @123 解析是多余的。我的问题更像是一时兴起做一些优雅的事情。

标签: bash shell parameters


【解决方案1】:

tool2 的方法很好。但是,您没有正确设置OTHERS

-u|--user)
  USR="$2"
  OTHERS+=("-u" "$2")
  shift

-u 及其参数需要保持单独的数组元素,就像它们是 tool2 的单独参数一样。您还需要引用 OTHERS 的扩展名,以保留包含分词字符或 glob 的参数:

bash tool1.sh "${OTHERS[@]}"

最后,全大写的变量名保留给shell本身使用;不要自己定义这样的名称。只需使用others 而不是OTHERS

【讨论】:

  • 感谢您的洞察力。不过,将导出变量的名称大写是可以的,对吧?
  • 如果“大写”,你的意思是Others,当然。但是,不要自己创建任何仅由大写字母组成的变量。是否导出变量无关紧要。
  • OK 因为在一些官方文档中我确实读过声明个人大写变量 (OTHER) 仅在导出上述变量时才相关。
猜你喜欢
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多