Bash 在数组中保存命令行参数的Shell脚本

Bash 在数组中保存命令行参数的Shell脚本,bash,shell,unix,Bash,Shell,Unix,我有一个shell脚本,它被这样调用 ex file1 file2 file3 word1 word2。。。。沃顿 我想让file1 file2 file3在一个数组中,我尝试了以下方法 for i in $(seq 1 3) do FILES[$i]=$0; ` expr shift `; echo "FILES["$i"]="$FILES[$i]; done; 因此,我想按顺序将参数移位3次,并按如下方式保存它们……但这给了我一个错误: ./ex: 11: ./ex: FILES[1]=.

我有一个shell脚本,它被这样调用

ex file1 file2 file3 word1 word2。。。。沃顿

我想让file1 file2 file3在一个数组中,我尝试了以下方法

for i in $(seq 1 3)
do
FILES[$i]=$0;
` expr shift `;
echo "FILES["$i"]="$FILES[$i];
done;
因此,我想按顺序将参数移位3次,并按如下方式保存它们……但这给了我一个错误:

./ex: 11: ./ex: FILES[1]=./ex: not found
FILES[1]=[1]
./ex: 11: ./ex: FILES[2]=./ex: not found
FILES[2]=[2]
./ex: 11: ./ex: FILES[3]=./ex: not found
FILES[3]=[3]
我也试过这样:

for i in $(seq 1 3)
do
FILES[$i]=$i;  // this actually means 1,2 or 3;I would like to mean $1,...
` expr shift `;
echo "FILES["$i"]="$FILES[$i];
done;
为了使它成为$1而不是1,我尝试了$($I)或${$I}之类的东西,但说这是糟糕的替代。 谢谢

这样做:

for i in {1..3}; do
    FILES[$i]=$1
    shift
done
第一个参数是
$1
,而不是
$0
,这是脚本的名称。而且你不会把
shift
放在backticks中;这会将输出替换回命令行,这就是为什么当它尝试将其作为命令执行时会出现错误的原因

#!/bin/bash
FILES=("${@:1:3}")
shift 3

双引号允许文件名包含空格,如果文件名用引号括起来,并且仍然占用一个数组项。如果这是不需要的,请删除引号。第一个项目和项目数的参数可能是变量,不需要文字值。

我实际上有3个以上的文件。我会更新问题!谢谢你!我不知道我能做到!我做了更改,我像这样调用exfile1file2file3word1,它给我以下错误:./ex:9:./ex:FILES[{1..3}]=file1:notfound第9行是FILES[$I]=1;你有
#吗/bin/bash
在脚本的开头?这看起来像是在不支持数组的情况下运行的。bash不需要$with variables来表示数组索引。文件[i]也可以,但是$sign没有问题。你可能想考虑双引号1美元。大括号扩展的缺点是,它们只处理文字值,而不处理变量——正如OP走上这条路线后发现的提示一样(“…实际上将有3个以上的文件”),我花了一段时间才理解您的上一个问题,但我现在理解了。如果仍然需要,你能做的是:因为我在{1..3};做回显“${!i}”;完成。当然,或者,文件[i]=“${!i}”最终解决了这个问题。但还是要谢谢你!我也很高兴知道这个!仅供参考--命名数组
文件
更符合最佳实践/惯例。所有大写名称都保留给内置和环境变量;当您出于自己的目的使用它们时,可能会错误地覆盖环境变量。
seq
也是一个非标准命令<代码>用于((i=1;i