Bash - 包装另一个命令的参数

时间:2017-04-27 08:52:09

标签: bash shell parameters

包装另一个命令的参数

我有一个命令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显式传递给 $time = strtotime($_POST['dateInput']); if ($time != false) { $mydate = date('d-m-Y', $time)); }

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

最后,全大写变量名保留给shell本身使用;不要自己定义这些名字。只需使用others代替OTHERS