在bash中,如何设置变量以包含可变数量的命令行参数?

时间:2016-02-03 14:48:14

标签: bash shell command-line-arguments

我正在使用bash shell。我正在编写一个脚本,我想在参数#5之后捕获传递给我的脚本的可变数量的参数。到目前为止,我有这个......

#!/bin/bash
…
declare -a attachments
attachments=( "$5" )

但我无法弄清楚的是如何编写“附件”行以包含参数#5以及随后的任何参数。所以在下面的例子中

sh my_script.sh arg1 arg2 arg3 arg4 “my_file1.csv” “my_file2.csv”

我希望附件包含“my_file1.csv”和“my_file2.csv”,而在此示例中...

sh my_script.sh arg1 arg2 arg3 arg4 “my_file1.csv” “my_file2.csv” “my_file3.csv”

我希望附件包含“my_file1.csv”,“my_file2.csv”和“my_file3.csv”。

2 个答案:

答案 0 :(得分:2)

srcdir=$1
destdir=$2
optflag=$3
barflag=$4
attachments=( "${@:5}" )

答案 1 :(得分:1)

通常的习惯用法是将固定的参数捕获到变量中,然后余数以"$@"的形式提供:

srcdir="$1"; shift
destdir="$1"; shift
optflag="$1"; shift
barflag="$1"; shift

(cd "$destdir" && mv -t "$destdir" "-$optflag" "$@" )

如果您在列表前面需要可变数量的参数,那么这个习语很容易扩展:

while [ "${1#-}" != "$1" ]
do
    case "$1" in
      -foo) foo="$2";shift 2 ;;
      -bar) bar="$2";shift 2 ;;
      -baz) bar=true;shift 1 ;;
      --) shift; break;
    esac
done
# rest of arguments are in "$@"