我有一个bash脚本,可以传递许多不同的参数和变量供脚本本身使用。一些参数被分配给变量。当程序尝试执行时, while while循环似乎没有运行。出于保密/简单的原因,我简化了以下脚本。
./myscript --dir2 /new/path
while :; do
case $1 in
--var1) $var1=$2
;;
--var2) $var2=$2
;;
"") break
esac
shift
done
$dir1=/default/directory
$dir2=/default/directory
while :; do
case $1 in
--dir1) $dir1=$2
;;
--dir2) $dir2=$2
;;
"") break
esac
shift
done
echo "Expect /default/directory, returned: $dir1"
echo "Expect /new/path, returned: $dir2"
这是我的计划有效返回的内容。
Expected /default/directory, returned: /default/directory
Expected /new/path, returned: /default/directory
还有更好的方法吗?或者另一种迭代最初传递给脚本的参数的方法?谢谢你的帮助!
答案 0 :(得分:1)
这是因为您使用消耗元素的shift
。尝试使用for循环迭代args。有几种方法可以做到这一点。这是我首选的方法:
for elem in "$@" # "$@" has the elements in an array
do
... # can access the current element as $elem
done
另一种方法是通过索引访问它们,你可以查找关于bash数组语法的教程。
答案 1 :(得分:1)
如果要保留参数,可以将它们复制到数组中,然后在以后从该数组中恢复原始列表:
#!/usr/bin/env bash
# ^^^^ - must be invoked as bash, not sh, for array support
# Copy arguments into an array
original_args=( "$@" )
# ...consume them during parsing...
while :; do # ...parse your arguments here...
shift
done
# ...restore from the array...
set -- "${original_args[@]}"
# ...and now you can parse them again.