bash 命令行参数存入数组并根据参数值对数组进行子集化

Vig*_*esh 4 linux bash shell command-line-arguments

我正在尝试获取 bash 脚本的输入参数。testbash.sh 4 1 2 4 5 Science ap * 我想将这些参数作为数组获取,我使用 $@ 将其全部获取到数组中。现在,根据第一个参数,我需要对其余参数进行子集化。这里第一个数字是 4,所以从第二个参数到第五个参数应该保存为一个数组,如 [1 2 4 5] ,其余参数保存在另一个数组中。

我试过这个

array=( $@ ) len=${#array[@]} args=${array[@]:0:$len-${array[1]}} echo $args

我尝试这样做来获取第一部分,但当我运行此“testbash.sh 4 1 2 4 5 Science ap * ”时,我在表达式中遇到错误语法错误(错误标记为“:-4”)

ric*_*ici 5

这是一种方法:

FIRST_SET=("${@:2:$1}")
REST=("${@:$(($1+2))}")
Run Code Online (Sandbox Code Playgroud)

这直接从参数开始工作,而不是使用中间数组。使用中间数组会很容易,方式大致相同,但要记住数组索引从 0 开始,而参数索引实际上从 1 开始(因为参数 0 是命令名称)。

请注意,引号很重要:没有它们,命令行参数将通过全局扩展和分词额外传递一次;实际上,您失去了引用命令行参数的能力。