bash语法疯狂-如何将倒数第三个命令行参数放入数组



我已经让它工作了,但不敢相信语法会那么疯狂。我所要做的就是将所有从第三个开始的参数放入一个数组中。

例如

script.sh foo bar value1 value2 value3

应该给我一个包含value1、value2和value3的数组。此阵列用于提供新功能中的参数:

./runpy /dsnormalize.py "${values[@]}"

这项工作:

args=( "$@" )
length=$((${#args[@]}-2))
values=(${args[@]:$length:2})

请告诉我这不是正确的方式。我通常以一个包含所有值的字符串结束。

bash是如何处理字符串和整数的?${}和$()之间的区别是什么?

谢谢你的帮助,Karsten

正确的语法是:

args_from_third=("{@:3}")

没有必要插入长度,因为默认值是"其余参数"。

bash圆括号确实很复杂。我在这里使用的两个:

VARIABLE=(...)

这将创建一个名为VARIABLE的数组,其值是字符串...中以空格分隔的元素。

"${@:start:length}"

这扩展到从参数start开始的length参数;如果省略了length,它将使用其余的所有参数。参数由空格字符分隔。因为表达式是被引用的,所以每个参数(但不是空格分隔符)都被视为被引用的。

${...}涵盖了很多可能性,包括子字符串、搜索和替换以及大小写更改。有关详细信息,请参阅bash手册。

一种更简单的方法是使用shift删除固定参数。

first_arg=$1
second_arg=$2
shift 2
the_rest=("$@")

和:

bash是如何处理字符串和整数的?${}$()之间的区别是什么?

${}用于获取变量的值。如果您只是在编写$foo,那么花括号是可选的,但对于任何更复杂的事情,例如访问数组的元素,都需要花括号。

$()捕获命令的输出,类似于backticks。这与您正在使用的$(( ))不同。

CCD_ 15对算术表达式进行求值。它允许您执行基本的整数和布尔运算。

最新更新