Я не хлопець Linux, але застряг у якомусь сценарії, який я повинен прочитати для свого проекту. Тож чи може хтось допомогти мені, що робить ця команда?
shift $(($optind - 1))
Я не хлопець Linux, але застряг у якомусь сценарії, який я повинен прочитати для свого проекту. Тож чи може хтось допомогти мені, що робить ця команда?
shift $(($optind - 1))
Відповіді:
shift $((OPTIND-1))
(Примітка OPTIND
- це верхній регістр), як правило, знаходиться відразу після getopts
while
циклу. $OPTIND
- кількість варіантів, знайдених користувачем getopts
.
Як згадує pauljohn32 в коментарях, строго кажучи, OPTIND
дає позицію наступного аргументу командного рядка.
З довідника керівництва GNU Bash :
ім'я оптимізації getopts [args]
getopts
використовується скриптами оболонки для розбору позиційних параметрів.optstring
містить символи опцій, які слід розпізнати; якщо за символом слідує двокрапка, очікується, що параметр має аргумент, який повинен бути відокремлений від нього пробілом. Двокрапка (':') та знак питання ('?') Не можуть використовуватися як символи опції. Кожен раз, коли він викликається,getopts
розміщує наступний параметр у назві змінної оболонки, ініціалізуючи,name
якщо його не існує, та індекс наступного аргументу, який обробляється у зміннуOPTIND
.OPTIND
ініціалізується до 1 кожного разу, коли викликається оболонка або сценарій оболонки. Коли для параметра потрібен аргумент, getopts розміщує цей аргумент у зміннійOPTARG
. Оболонка не скидаєтьсяOPTIND
автоматично; він повинен бути вручну скинутий між декількома викликами вgetopts
межах одного виклику оболонки, якщо потрібно використовувати новий набір параметрів.Коли зустрічається кінець опцій,
getopts
вихід із значенням повернення більше нуля.OPTIND
встановлюється в індексі першого аргументу, що не є опцією, а ім'я - "?".
getopts
зазвичай аналізує позиційні параметри, але якщо введено більше аргументівargs
, тоgetopts
замість них аналізуємо.
shift
n
видаляє n рядків зі списку позиційних параметрів. Таким чином, shift $((OPTIND-1))
видаляються всі параметри, які були проаналізовані getopts
зі списку параметрів, і тому після цього пункту $1
буде посилатися на перший аргумент без опцій, переданий до сценарію.
Оновлення
Як згадує mikeserv у коментарі, shift $((OPTIND-1))
може бути небезпечним. Для запобігання небажаного розбиття слів і т. Д. Всі розширення параметрів повинні бути подвійними. Тож безпечною формою для команди є
shift "$((OPTIND-1))"
find
) можуть виглядати так, що вони дозволяють варіанти після не-варіантів, але вони ні: у них є операнди, які починаються з тире.
IFS
, але краще бути в безпеці, ніж вибачити. ;)
IFS=0123456789
, shift $((OPTIND-1))
(без лапок) перетвориться в shift ""
який буде проігнорована (в ksh
) або генерувати помилку (в bash
і dash
).
$((...))
просто обчислює речі. У вашому випадку він приймає значення $optint
та субстрати 1.
shift
видаляє позиційні параметри. У вашому випадку він видаляє optint-1
параметри.
Для отримання додаткової інформації подивіться на help getopts
, help shift
, погляд на man bash
для «Арифметика розширення», і особливо Google для getopts
.