我正在编写一个简单的脚本,它按顺序接受多个命令行参数:
#!/bin/bash
function arg_parser () {
while [[ $# != 0 ]] ; do
case "$1" in
--one)
varone="$2"
;;
--two)
vartwo="$2"
;;
--three)
varthree="$2"
;;
--four)
varfour="$2"
;;
--five)
varfive="$2"
;;
esac
shift
done
}
arg_parser "$@"
echo $varone
echo $vartwo
echo $varthree
echo $varfour
echo $varfive
然后运行它:
./test.sh --one testone --three testthree --two testtwo --five "test five" --four "$$$$"
testone
testtwo
testthree
793793
test five
请注意如何--four
返回“793793”而不是“$$$$”?有谁知道为什么会发生这种情况和/或如何改进脚本以防止这种情况发生?
答案1
$$
是一个特殊变量,它扩展为 shell 的进程 ID,在本例中是在脚本启动之前的命令行上。尝试类似的东西echo $$
。您需要用反斜杠转义美元符号或将它们放在单引号中以免它们扩展,即echo '$$$$'
。
双引号没有帮助,它们只会阻止扩展值的单词分割,就像常规变量($foo
vs. "$foo"
)一样。
另外,在您的循环中,shift
即使您也使用第二个参数,您也只能使用一次。这意味着选项的参数也被作为选项本身处理:
$ ./test.sh --one --two --three --four --five xyz
--two
--three
--four
--five
xyz
如果您不希望这样,则在使用后需要shift
额外的时间$2
:
while [[ "$#" != 0 ]] ; do
case "$1" in
--one)
varone="$2"
shift
;;
--two)
vartwo="$2"
shift
;;
# ...
esac
shift
done