Bash: кусочек позиционных параметров

20

Как я могу получить часть $@в Bash без необходимости сначала копировать все позиционные параметры в другой массив, как этот?

argv=( "$@" )
echo "${argv[@]:2}";
Н.Р.
источник
1
Всегда цитирую "$@". Ваше argvназначение будет нарушено, если какие-либо аргументы будут содержать пробелы.
Иордания

Ответы:

31

Вы можете использовать тот же формат, что и для любого другого массива. Чтобы извлечь 2-й и 3-й элементы $@, вы должны сделать:

echo "${@:1:2}"
          - -
          | |----> slice length
          |------> slice starting index 
Тердон
источник
1
Но, похоже, это работает на принципах символ за символом в v4.1.2, есть ли способ сделать это слово за словом?
Алексей Магура
@AlexejMagura Я не понимаю, что вы имеете в виду. Это действует на элементы массива. Если у вас есть односимвольные элементы, он будет работать «на символах». Если каждый элемент является словом, он работает над словами. Возможно, вы пытаетесь это на строку, а не массив?
Тердон
Я пытаюсь создать копию "$ @", которая, я думаю, в этот момент может стать строкой, я не уверен.
Алексей Магура
На bash 4.2.46 "${@:1:2}"фактически дает мне 1-й и 2-й аргументы командной строки . Между тем, "${@:1}"дает мне полные аргументы командной строки и "${@:0}"дает имя сценария, за которым следуют полные аргументы командной строки .
Rockallite
@ Хорошо, да. 2-й и 3-й элементы $@ массива являются 1-м и 2-м аргументами. "${@:1}"напечатает весь массив, начиная со 2-го элемента (1-й аргумент), и ${@:0}весь массив, начиная с 1-го элемента, который является именем скрипта. Чего ты ожидал?
Terdon