可选参数不扩展某些变量的案例说明

问题描述

基于on this answer,我编写了一些简单的可选参数解析器

#!/bin/bash
TEST_PATH=pluto
if [ $# -eq 0 ]; then
    echo "Usage:"
    echo "./run.sh [--valgrind|-v] [--test|-t] <mesh.dat> <csv_points_file>"
else
    . config.sh
    while [[ "$#" -gt 0 ]]; do
        case $1 in
            -v|--valgrind) VALGRIND="valgrind --track-origins=yes"; shift ;;
            -t|--test) TEST="mickey goofy" shift ;;
            *) ARGS+=($1) shift ;;
        esac
        shift
        echo $TEST
    done
    echo ${VALGRIND} ${TEST_PATH} "${ARGS[*]:-$TEST}"
fi

除了执行./somescript.sh -v时,输出是正确的,而使用-t参数时,TEST_PATH的正确值除外 预期的行为是

$./somescript.sh -t
pluto mickey goofy

$./somescript.sh daffy duck
pluto daffy duck

我在做什么错了?

解决方法

取出多余的shift

也就是说:

        case $1 in
            -v|--valgrind) VALGRIND="valgrind --track-origins=yes";;
            -t|--test) TEST="mickey goofy";;
            *) ARGS+=( "$1" );;
        esac

当要处理的选项带有选项参数时,仅应在个别情况下额外执行shift,并且需要先从参数向量中删除该选项参数,然后才能继续处理。 / p>