Можно ли разрезать массив аргументов в Bash?

Рассмотрим следующий сценарий, который я упростил из этого вопроса.

#!/bin/bash

A=( foo bar "a  b c" 42 )
B=("${A[@]:1}")       # slice to the end of the array
echo "${B[@]}"

Это работает нормально, но если я попытаюсь использовать аналогичный синтаксис для массива аргументов $@, я получу синтаксическую ошибку:

#!/bin/bash

echo "$@"
B=("${$@:1}")       # slice to the end of the array

Выполнение:

./play  x y z
./play: line 4: ${$@:1}: bad substitution

Есть ли другой магический синтаксис для разрезания массива аргументов?

Возможно, вам захочется "${@:2}". Это описано с примерами в Справочном руководстве Bash.

pjh 31.05.2024 23:04

Вы не пишете $ дважды, когда пишете ${A[@]:1}, как вы думаете, почему вам нужно сделать это дважды для @?

Barmar 31.05.2024 23:08

Также смотрите Bash: фрагмент позиционных параметров.

pjh 31.05.2024 23:15

На самом деле вы можете использовать команду shift для смещения аргументов.

Saboteur 01.06.2024 00:49

Я знаю о shift, но у меня были другие причины не изменять исходный массив аргументов. В частности, я использовал exec для повторных попыток.

merlin2011 01.06.2024 03:45
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
5
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Небольшое изменение формата:

$ cat play
echo "$@"
B=( "${@:1}" )
typeset -p B

Берем на тест-драйв:

$ ./play x y z
x y z
declare -a B=([0] = "x" [1] = "y" [2] = "z")

Нужно учитывать, что 0-я позиция ($0) — это имя скрипта:

B=( "${@:0}" )
typeset -p B
=> declare -a B=([0] = "./play" [1] = "x" [2] = "y" [3] = "z")

Итак, вам нужно сдвинуть позицию на единицу вправо (т. е. изменить 1 на 2):

$ cat play
echo "$@"
B=( "${@:2}" )
typeset -p B

Берем на тест-драйв:

$ ./play x y z
x y z
declare -a B=([0] = "y" [1] = "z")

Другие вопросы по теме