如何在 Bash 中获取一部分,$@
而无需首先将所有位置参数复制到另一个数组中?
argv=( "$@" )
echo "${argv[@]:2}";
答案1
您可以使用与任何其他数组相同的格式。要从 中提取第二个和第三个元素$@
,您可以执行以下操作:
echo "${@:1:2}"
- -
| |----> slice length
|------> slice starting index
答案2
bash 中的更多数组切片示例
代替some_array_variable
在代码中使用(argv
在您的情况下),只需@
在该变量名称的位置使用即可。符号@
代表的是输入参数数组,您可以像对待任何其他数组一样对待它。令人困惑的是,我们习惯于看到它几乎总是与$
这样的字符配对:$@
,因此我们没有意识到该@
字符就是数组本身,并且也可以单独用作数组变量。
所以,这里有一些例子:
从输入参数数组 中切片@
,通常可以简单地看到和访问该数组$@
:
# array slicing basic format 1: grab a certain length starting at a certain
# index
echo "${@:2:5}"
# │ │
# │ └────> slice length
# └──────> slice starting index
# array slicing basic format 2: grab all remaining array elements starting at a
# certain index through to the end
echo "${@:2}"
# │
# │
# └──────> slice starting index
更多阵列提醒自己:
以下是对我自己的一般性提醒,可能对登陆此页面的其他人也有好处。
# store a slice from an array into a new array
new_array=("${@:4}")
# print the entire array
echo "new_array = ${new_array[@]}"
这是 bash 中通用数组切片和数组元素访问的可运行示例,灵感来自于这个来源:
(@
如果需要,可以用作输入参数数组,而不是a
下面的,根据您的用例)
a=(one two three four five six) # define a new array, `a`, with 6 elements
echo "$a" # print first element of array a
echo "${a}" # print first element of array a
echo "${a[0]}" # print first element of array a
echo "${a[1]}" # print *second* element of array a
echo "${#a[@]}" # print number of elements in array a
echo "${a[@]:1:3}" # print 2nd through 4th elements; ie: the 3 elements
# starting at index 1, inclusive, so: indices 1, 2, and 3
# (output: `two three four`)
echo "${a[@]:1}" # print 2nd element onward
全部运行
将上面的所有代码块复制并粘贴到名为 的文件中array_slicing_demo.sh
,并将其标记为可执行,chmod +x array_slicing_demo.sh
以便您可以运行它。或者,只需下载我的演示array_slicing_demo.sh文件来自我的eRCAGuy_hello_world 仓库在这里。
然后,像这样运行它:
./array_slicing_demo.sh a b c d e f g h i j k
...您将看到以下输出:
b c d e f b c d e f g h i j k new_array = d e f g h i j k one one one two 6 two three four two three four five six
参考
关键词:bash中的数组访问; bash 数组索引;在 bash 中访问数组中的元素; bash 数组切片;在 bash 中打印数组;在bash中打印数组元素
答案3
我通常这样做:
somefunc() {
local message="$1"
shift
echo "message = $message"
echo "other = $@"
}
somefunc first second third goforth
这将打印:
message = first
other = second third goforth
shift
您可以通过在第二个、第三个等参数后使用 ing 来扩展该概念
答案4
对于函数参数,答案echo "${@:1:2}"
对我来说根本不起作用。另外,我想要切掉第一个元素,因为它是一个不同的参数。起作用的是:
function foo(){ #takes single param + array of params
local param1="$1". #first param
local -a tmp=( "${@}" ) #copy all params
local -a rem_params=( "${tmp[@]:1}") #slice off first:Works!
# local -a rem_params=( "${@[@]:1}" ) #DID NOT WORK, ERROR
# local -a rem_params=( "{@:1}" ) #DID NOT SLICE
echo "${rem_params[@]}"
}
也许我会写信测试一下它如何在脚本级别使用位置参数,但现在没有时间。