Bash: зріз позиційних параметрів


20

Як я можу отримати фрагмент $@Bash без попереднього копіювання всіх позиційних параметрів в інший масив, як це?

argv=( "$@" )
echo "${argv[@]:2}";

1
Завжди цитую "$@". Ви argvпризначите, що будь-які аргументи містять пробіли.
Йорданм

Відповіді:


31

Ви можете використовувати той самий формат, що і для будь-якого іншого масиву. Щоб витягнути 2-й та 3-й елементи $@, ви зробите:

echo "${@:1:2}"
          - -
          | |----> slice length
          |------> slice starting index 

1
Але це, здається, працює на основі принципу char за версією v4.1.2, чи існує спосіб це зробити слово за словом?
Олексій Магура

@AlexejMagura Я не розумію, що ти маєш на увазі. Це діє на елементи масиву. Якщо у вас є односимвольні елементи, він буде працювати «на символів». Якщо кожен елемент - це слово, він працює над словами. Чи, можливо, ви намагаєтеся це на рядку, а не масив?
terdon

Я пробую це на копії "$ @", яка, напевно, може стати рядком в цей момент, я не впевнений.
Олексій Магура

На базі 4.2.46 "${@:1:2}"насправді дає аргументи 1-го та 2-го командного рядка . Тим часом, "${@:1}"подає мені повний аргумент командного рядка та "${@:0}"дає мені ім'я скрипта, а потім аргументи повного командного рядка .
Rockallite

@Rockallite добре, так. 2-й та 3-й елементи $@ масиву - це 1-й та 2-й аргументи. "${@:1}"буде надрукувати весь масив, починаючи з 2-го елемента (1-го аргументу) і ${@:0}всього масиву, починаючи з 1-го елемента, що є назвою сценарію. Що ви очікували?
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.