可选参数的 Case 语句不扩展某些变量
Case statement for optional parameters not expanding some variable
基于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 in
-v|--valgrind) VALGRIND="valgrind --track-origins=yes"; shift ;;
-t|--test) TEST="mickey goofy" shift ;;
*) ARGS+=() 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
s。
即:
case in
-v|--valgrind) VALGRIND="valgrind --track-origins=yes";;
-t|--test) TEST="mickey goofy";;
*) ARGS+=( "" );;
esac
当您正在处理的选项采用 option-argument 并且您需要从参数向量中删除 option-argument 时,您应该只在个别情况下执行额外的 shift
在处理可以继续之前。
基于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 in
-v|--valgrind) VALGRIND="valgrind --track-origins=yes"; shift ;;
-t|--test) TEST="mickey goofy" shift ;;
*) ARGS+=() 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
s。
即:
case in
-v|--valgrind) VALGRIND="valgrind --track-origins=yes";;
-t|--test) TEST="mickey goofy";;
*) ARGS+=( "" );;
esac
当您正在处理的选项采用 option-argument 并且您需要从参数向量中删除 option-argument 时,您应该只在个别情况下执行额外的 shift
在处理可以继续之前。