多次读取bash脚本参数

时间:2018-04-24 22:38:20

标签: bash shell optional-parameters

我有一个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

还有更好的方法吗?或者另一种迭代最初传递给脚本的参数的方法?谢谢你的帮助!

2 个答案:

答案 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.