在BASH脚本中组合选项和参数

时间:2013-03-08 21:50:31

标签: linux bash

我的Bash-Script应该接受参数和选项。 此外,参数和选项应该传递给另一个脚本。

第二部分我已经解决了:

for argument in "$@"; do
    options $argument
done

another_script $ox $arguments

function options {
  case "$1" in
    -x) selection=1
    -y) selection=2
    -h|--help) help_message;;
    -*) ox="$ox $1";;
    *) arguments="$arguments $1";;
  esac
}

现在我不知道如何实现一个参数“-t”,用户可以在其中指定一些文本

看起来应该是这样的:

function options {
      case "$1" in
        -t) user_text=[ENTERED TEXT FOR OPTION T]
        -x) selection=1
        -y) selection=2
        -h|--help) help_message;;
        -*) ox="$ox $1";;
        *) arguments="$arguments $1";;
      esac
    }

3 个答案:

答案 0 :(得分:3)

您可以将getopts用于此

while getopts :t:xyh opt; do
    case "$opt" in
    t) user_text=$OPTARG ;;
    x) selection=1 ;;
    y) selection=2 ;;
    h) help_message ;;
    \?) commands="$commands $OPTARG" ;;
    esac
done

shift $((OPTIND - 1))

其余参数位于"$@"

答案 1 :(得分:2)

你的问题是,当选项可以接受参数时,仅逐字处理参数是不够的;您需要比提供options功能更多的上下文。将循环置于options内,如下所示:

function options {
    while (( $# > 0 )); do
        case "$1" in
            -t) user_text=$2; shift; ;;
            -x) selection=1 ;;
            # ...
        esac
        shift
    done
}

然后在整个参数列表中调用options

options "$@"

您可能还想查看getopts内置命令或getopt程序。

答案 2 :(得分:0)

我会在for循环中执行case语句,这样我就可以强制转换到第二个下一个参数。类似的东西:

while true
do
  case "$1" in
    -t) shift; user_text="$1";;
    -x) selection=1;;
...
  esac
  shift
done