Визначення змінної в bash, використовуючи локальне ключове слово


33

Я вивчаю сценарій bash і знайшов це в моєму / usr / share / bash-завершенні, рядок 305:

local cword words=()

Що це робить? Всі навчальні посібники в режимі онлайн лише у форматі

local var=value

Відповіді:


92

Хоча мені подобається відповідь, надана jordanm, я думаю, що не менш важливо показати менш досвідченим Linuxкористувачам, як самостійно впоратися з подібними питаннями.

Запропонований спосіб швидший і універсальніший, ніж пошук відповідей на випадкових сторінках, що відображаються на сторінці результатів пошуку Google.

По-перше, всі команди, які можна виконати Bashбез введення явного шляху до нього, такі як, ./commandможна розділити на дві категорії: Bash shell builtinsі external commands. Bash shell builtinsвстановлюються разом Bashі є їх частиною, поки external commandsне є частиною Bash. Це важливо, оскільки Bash shell builtinsвони документовані всередині, man bashі їх документацію також можна викликати helpкомандою, а external commandsзазвичай документують самостійно manpagesабо брати якогось царя -h, --helpпрапора. Щоб перевірити, чи є команда a Bash shell builtinчи an external command:

$ type local
local is a shell builtin

Він відобразиться how command would be interpreted if used as a command name(від help type). Тут ми можемо побачити, що localце shell builtin. Подивимось ще один приклад:

$ type vim
vim is /usr/bin/vim

Тут ми можемо побачити, що vimце не shell builtinзовнішня команда, розташована в /usr/bin/vim. Однак іноді одна і та ж команда може бути встановлена ​​і як, external commandі бути shell builtinодночасно. Додати -aдо typeсписку всіх можливостей, наприклад:

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

Тут ми можемо побачити, що echoце і a, shell builtinі an external command. Однак, якщо ви просто набрали echoта натиснули, Returnйого shell builtinбуде викликано, оскільки воно з’являється першим у цьому списку. Зауважте, що всі ці версії echoне повинні бути однаковими. Наприклад, у моїй системі /usr/bin/echoбере --helpпрапор, а builtinні.

Гаразд, тепер, коли ми знаємо, що localвбудована оболонка, давайте дізнаємось, як вона працює:

$ help local
local: local [option] name[=value] ...
Define local variables.

Create a local variable called NAME, and give it VALUE.  OPTION can
be any option accepted by `declare'.

Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.

Exit Status:
Returns success unless an invalid option is supplied, an error occurs,
or the shell is not executing a function.

Зверніть увагу на перший рядок: name[=value]. Все між [і не ]є обов'язковим . Це загальна конвенція, яка використовується у багатьох manpagesта форма документації у *nixсвіті. Однак, команда, про яку ви питали у своєму запитанні, є абсолютно законною. У свою чергу, ...символ означає, що попередній аргумент можна повторити. Ви також можете прочитати про цю конвенцію в деяких версіях man man:

The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.

bold text          type exactly as shown.
italic text        replace with appropriate argument.
[-abc]             any or all arguments within [ ] are optional.
-a|-b              options delimited by | cannot be used together.
argument ...       argument is repeatable.
[expression] ...   entire expression within [ ] is repeatable.

Отже, наприкінці дня я сподіваюся, що тепер вам буде легше зрозуміти, як працюють різні команди Linux.


5
Дуже приємна відповідь. Я читав це, сподіваючись, що ви звернетесь до того, як початківець зможе відкрити для себе, що таке призначення масиву, саме з коду var=(), але, гадаю, це небагато для того, щоб розібратися, навіть не знаючи назви того, що ви шукаєте . ;)
Wildcard

Чи підтримують localтакож незахисні снаряди ?
palswim

2
Я підписався просто так, що можу підтримати вашу відповідь :)
Харендра Сінгх

@Wildcard Оскільки масив є синтаксисом bash на відміну від команди, ви можете знайти його в man bash. Потрапивши туди, наберіть, /Arrays$щоб перейти до розділу масивів. (Запис $після Arrays- запобігання fпереходу текстових посилань на розділ.) Звідти ви можете ввести сторінку, щоб перейти вперед або bназад. Введіть, qщоб закрити сторінку чоловіка, коли закінчите.
Тейлор Едмістон

Крім того, біг helpбез аргументів перелічить усі вбудовані файли, якщо вам цікаво побачити більше.
Тейлор Едмістон

29

localКлючове слово може приймати кілька змінних. Надання змінної зі значенням необов'язково. Ваш приклад оголошує дві змінні cwordта words. wordsЗмінної присвоюється порожній масив.


18

localпросто оголошує змінну, яка матиме область лише у визначеній на даний момент функції, так що головне середовище виконання не може "бачити" значення. Ви не можете використовувати localпоза функцією. Приклад

func() {
   nonlocal="Non local variable"
   local onlyhere="Local variable"
}
func
echo $nonlocal 
echo $onlyhere

Вихід: Не локальна змінна

Тож $onlyhereне було видно поза межами функції.


Ця відповідь має більше сенсу, хто потребує швидкого розуміння.
Олексій Радж Каліаморті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.