Як змінити аргумент командного рядка в Bash?


94

Чи є спосіб змінити аргументи командного рядка в сценарії Bash. Скажімо, наприклад, сценарій Bash викликається наступним чином:

./foo arg1 arg2  

Чи є спосіб змінити значення arg1 у сценарії? Скажімо, щось на зразок

$1="chintz"

Відповіді:


150

Ви повинні скинути всі аргументи. Щоб змінити, наприклад $3:

$ set -- "${@:1:2}" "new" "${@:4}"

В основному ви встановлюєте для всіх аргументів їх поточні значення, за винятком тих, які потрібно змінити. set --також визначається POSIX 7 .

"${@:1:2}"Позначення розширюється до двох (отже, 2в позначеннях) позиційні аргументи , починаючи від зсуву 1(тобто $1). У "$1" "$2"цьому випадку це скорочення , але набагато корисніше, коли ви хочете замінити, наприклад "${17}".


1
отже, щоб змінити 3 долари, я також повинен змінити 1 і 2 долари, так? І змінити їх на що? Що означає "скидання"?
Шрірам

Дякую за фокус! Мені було важко використовувати це для імен файлів із вбудованими пробілами. Будь-хто, хто може зіткнутися з цією проблемою, спробуйте поставити evalв передній частині рядка відповідно до цього .
cxw

2
Це нормально, коли ви знаєте положення параметра, який потрібно змінити. Що робити, якщо ви насправді цього не знаєте і вам потрібно динамічно його змінювати? Я спробував з $ set - "$ {: 1: $ pivot}", але він не приймає змінну там.
Даніеле Сегато

1
Як я можу зробити те ж саме всередині функції? Здається, ваше рішення не працює при виклику зсередини функції.
Хашкен

2
Ви не можете змінити позиційні параметри сценарію всередині функції - власні аргументи функції їх приховують. Однак ви можете зберегти їх у масиві та оперувати цим.
thkala

23

Оптимізуючи для читабельності та ремонтопридатності, вам може бути краще призначити $1і $2більш значущі змінні (я не знаю, input_filename = $1і output_filename = $2щось інше), а потім перезаписати одну з цих змінних ( input_filename = 'chintz'), залишивши вхід до скрипта незмінним, якщо це так потрібні в іншому місці.


Я хотів підходу, коли я міг би змінити один із самих вхідних аргументів. Мені потрібно було це зробити, оскільки я хотів повернути значення зі сценарію. Відповідь, запропонована thkala, спрацювала добре. Дякую за відповідь !!!
Шрірам

3
@Johnsyweb Погодився. Для читабельності ваш найкращий метод.
Dss

1
"Вам краще", завжди залежить від випадку використання, який не надається.
Скотт

2
@Scott на 7 років старший і має більше досвіду, ніж був, коли писав цю відповідь, я схильний погодитися з вами.
Johnsyweb,

Приклад, коли це не спрацювало б (крім використання чогось на зразок $ FIRST_PARAMETER): наявність використання та значення параметра залежно від фактичного значення.
Ігор Стоппа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.