Bash:位置参数切片

Bash:位置参数切片

如何在 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

参考

  1. Bash:位置参数切片
  2. bash 变量赋值中的单括号

关键词: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[@]}"
}

也许我会写信测试一下它如何在脚本级别使用位置参数,但现在没有时间。

相关内容