Як отримати n-й позиційний аргумент у bash?


Відповіді:


110

Використовуйте функцію опосередкування Баша:

#!/bin/bash
n=3
echo ${!n}

Запуск цього файлу:

$ ./ind apple banana cantaloupe dates

Виробляє:

cantaloupe

Редагувати:

Ви також можете нарізати масив:

echo ${@:$n:1}

але не індекси масиву:

echo ${@[n]}  #  WON'T WORK

1
@AlexanderOleynikov Це спричиняє помилку "поганої заміни"; Я припускаю, тому що @*) є "Спеціальними параметрами" і тому, що вони не є дійсними іменами масивів? ${@} робить посилання на пронумерованих параметри, але @не є масив і підтримка не реалізована , щоб розібрати його , як такі, в той час як , наприклад , « ${unsetvariable}» вироблятиме порожній висновок , оскільки він є дійсним масивом / ім'ям змінним, просто ще не встановлена (і ці винятки спеціально обробляється у вихідному коді bash, я думаю). Я намагався знайти кращу причину в man bash, але, шукаючи @, у мене закінчилося терпіння. ; P
Віктор Замянян

12

Якщо Nзбережено у змінній, використовуйте

eval echo \${$N}

якщо це постійне використання

echo ${12}

оскільки

echo $12

не означає те саме!


1
Яка різниця між ${12}та $12?
HelloGoodbye

3
Привіт @HelloGoodbye, $12означає $1і персонаж 2. ${12}означає 12-й параметр.
Йоганнес Вайс

-2

Читайте

Обробка позиційних параметрів

і

Розширення параметра

$ 0: перший позиційний параметр

$ 1 ... $ 9: елементи списку аргументів від 1 до 9


Ця відповідь не стосується вихідного питання ОП. Він спеціально запитав, як отримати параметр за його індексом, що зберігається у змінній.
Марсель Вальдес Ороско

-3

Як ви можете бачити в Bash by Example , вам просто потрібно використовувати автоматичні змінні $ 1, $ 2 тощо.

$ # використовується для отримання кількості аргументів.


Ви, на жаль, не зрозуміли питання; ${!n}була відповідь, про яку я не знав, для запису.
Майкл Шигорін,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.