考虑以下代码以解析bash脚本参数(假设为example.sh
:]
#!/bin/bash
positional=()
while [ $# -gt 0 ]
do
arg="$1"
case ${arg} in
-h|--help|\?) show_usage; exit 0 ;;
-v|--verbose) verbose=1; shift ;;
-f|--file) theFile="$2"; shift; shift;;
*) positional+=("$1"); shift ;;
esac
done
set -- "${positional[@]}"
arg1a="${positional[0]}"; arg1b="$1" # same result, $arg1a == $arg1b
arg2a="${positional[1]}"; arg2b="$2" # same result, $arg2a == $arg2b
使用以下脚本调用:
./example.sh pos1 -v -f toto.txt pos2
"$1" == "pos1"
和"$5" == "pos2"
set --
,$1
,$2
和$5
未定义之前set --
,"$1" == "pos1"
和"$2" == "pos2"
之后而且,在set --
,${positional[0]} == "pos1"
和${positional[1]} == "pos2"
之后。
set -- "${positional[@]}"
的实际意义是什么?我们确实可以按照提供的顺序获得位置自变量的值(使用${positional[i]}
),而无需将其恢复为$1
和$2
。因此,我不明白使用set --
的意义。如果我们不在这里使用它,那么$# -eq 0
就这样...
[请提供一个真实的示例,其中即使使用此set --
数组,也必须使用${positional[]}
。
在“ while”循环之后,“位置”数组将捕获所有命令行选项和参数,除了“ -v”,“-verbose”,“-f”和“ --file”(以及-f /-文件的参数)。
那时,脚本的其余部分将继续运行而没有这些参数。
这种编码的可能原因是,以上代码块将脚本的原始行为扩展为包括两个其他选项(详细和文件),脚本的其他部分不支持这些选项。
[如果脚本随后将执行另一个命令(例如ls),该命令不支持冗长/文件选项,并且具有用户提供的命令行参数,这将非常有用。
# Code to strip verbose/file command line options
while
do
...
done
set --
# Do something above $verbose, $theFile
...
# Original script here - use any unprocessed parameters from command line
ls "$@"