Що означає: $ {param: = value}?


34

Я читав наступне в Посібнику користувача по Z-оболонці :

Синонім 'true' є ':'; часто використовується в цій формі для аргументів, які мають побічні ефекти, але які не слід використовувати - щось подібне

: ${param:=value}

що є загальною ідіомою у всіх похідних оболонки Борна. У розширенні параметра $paramзадається значення значення, якщо воно було порожнім раніше, а залишене в спокої в іншому випадку. Оскільки це було єдиною причиною розширення параметра, ви :ігноруєте аргумент. Власне, оболонка блискуче будує командний рядок - двокрапка, за якою буде значення $param, незалежно від того, відбулося призначення чи ні - тоді виконує команду; просто так буває, що ':' не помічає аргументів, які йому було надано.

але я цього не розумію. Я розумію, це :означає true, але в виразі є дві колонки. Що стосується другорядного питання, чому ця ідіома використовується настільки у всіх похідних оболонок Борна? Якій цілі він служить?

Примітка: Мене цікавить, що робить ця ідіома і в bash, і в zsh .

Спасибі


Ви просите zshчи bash?
enzotib

@enzotib, мене цікавлять обидва. Я це уточнив.
Амеліо Васкес-Рейна

Відповіді:


31

Розбиймо це на частини.

Цей код запускає команду :з деякими аргументами. Команда :нічого не робить і ігнорує її аргументи. Тому весь командний рядок нічого не робить, за винятком тих побічних ефектів, які трапляються в аргументах.

Синтаксис ${parameter_name:=value}існує у всіх не антикварних оболонках у стилі Борна, включаючи золу, баш, кш та zsh. При необхідності він встановлює параметр за замовчуванням. Це еквівалентно

if [ -z "$parameter_name" ]; then parameter_name=value; fi
 ${parameter_name}

Іншими словами, якщо parameter_nameне встановлено або встановлено порожнє значення, то встановіть його на вказане значення; а потім запустіть команду, використовуючи нове значення параметра. Є варіант, ${parameter_name=value}який залишає параметр порожнім, якщо він був порожнім, використовуючи лише вказане значення, якщо параметр не було встановлено.

Цей синтаксис ви знайдете задокументованим у розділі "Розширення параметрів" у специфікації POSIX та посібниках з тире, bash, ksh та zsh.

У цьому синтаксисі є варіанти, зокрема, ${parameter_name:-value}які дозволяють використовувати значення за замовчуванням лише для цього розширення, не призначаючи параметр.

Підводячи підсумок, : ${parameter_name:=value}це стислий спосіб написання

if [ -z "$parameter_name" ]; then parameter_name=value; fi

11

:не означає true - ви, напевно, думаєте while :, але навіть у цьому виразі це не означає "true", воно просто буває оцінити його (насправді це просто нульова команда, або noop).

Це розширення параметра ( ${x:=y}) означає «Задані у до й , якщо й не встановлений або порожнім, і розширюватися у ».

$ echo "${foo:=bar}"
bar
$ foo=baz
$ echo "${foo:=bar}"
baz
$ foo=
$ echo "${foo:=bar}"
bar
$ echo "${foo}"
bar

Вікі Bash Hackers має хорошу статтю про розширення параметра тут .

Причина, яка :використовується, полягає в тому, що в той час як інші частини команди оцінюються, на них не діють (як :це і є нульова команда). Таким чином, ви ${x:=y}виконуєте його функцію, не впливаючи ні на що інше, наприклад, якщо б у вас не було :на початку, вона спробує виконати команду під назвою y .

Ось bashдовідкова сторінка на ::

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

3

Перша :- це команда, вона називається "noop" або "no operacija". Як було сказано на сторінці, її часто використовують для оцінки аргументів.

Другий :- це класифікатор змінної розширення - технічно це є :=. Як сказано, це встановлює значення, якщо воно не має значення.

Ідіомно, якщо вам потрібне значення за замовчуванням змінної середовища, тоді ви можете використовувати цей синтаксис. Наприклад, при запуску програми через cron(8)середовище не встановлюється, і крапки файлів оболонки не запускаються. Тому вам може знадобитися встановити деякі параметри за замовчуванням.

: ${JAVA_HOME:=/usr/local/jdk-1.6.0_28}

Тоді ви можете "встановити його і забути" (до зміни jvm за замовчуванням).

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