Используя “$ {a:-b}” для переменного присвоения в сценариях

Работы карты WI-FI Intel лучше всего, их драйверы непосредственно включены в ядро, также могут быть загружены как отдельный пакет с его официального сайта.

Иногда Вы, возможно, должны были бы загрузить встроенное микропрограммное обеспечение также.

469
10.07.2018, 09:43
3 ответа

Этот метод позволяет присвоить переменной значение, если другая переменная либо пуста, либо не определена. ПРИМЕЧАНИЕ: Эта «другая переменная» может быть той же или другой переменной.

выдержка

${parameter:-word}
    If parameter is unset or null, the expansion of word is substituted. 
    Otherwise, the value of parameter is substituted.

ПРИМЕЧАНИЕ: Эта форма также работает, $ {параметр-слово} . Если вы хотите увидеть полный список всех форм расширения параметров, доступных в Bash, я настоятельно рекомендую вам взглянуть на эту тему в вики Bash Hacker под названием: « Расширение параметров ».

Примеры

переменная не существует
$ echo "$VAR1"

$ VAR1="${VAR1:-default value}"
$ echo "$VAR1"
default value
переменная существует
$ VAR1="has value"
$ echo "$VAR1"
has value

$ VAR1="${VAR1:-default value}"
$ echo "$VAR1"
has value

То же самое можно сделать, оценив другие переменные или запустив команды в части значения по умолчанию в нотации.

$ VAR2="has another value"
$ echo "$VAR2"
has another value
$ echo "$VAR1"

$

$ VAR1="${VAR1:-$VAR2}"
$ echo "$VAR1"
has another value

Дополнительные примеры

Вы также можете использовать немного другую запись, где это просто VARX = $ {VARX- } .

$ echo "${VAR1-0}"
has another value
$ echo "${VAR2-0}"
has another value
$ echo "${VAR3-0}"
0

В приведенном выше $ VAR1 и $ VAR2 уже были определены со строкой «имеет другое значение», но $ VAR3 не было определено, поэтому значение по умолчанию вместо этого использовалось 0 .

Другой пример

$ VARX="${VAR3-0}"
$ echo "$VARX"
0

Проверка и присвоение с использованием : = нотации

Наконец, я упомяну удобный оператор : = . Это выполнит проверку и присвоит значение, если проверяемая переменная пуста или не определена.

Пример

Обратите внимание, что теперь установлено значение $ VAR1 . Оператор : = выполнил проверку и присвоение за одну операцию.

$ unset VAR1
$ echo "$VAR1"

$ echo "${VAR1:=default}"
default
$ echo "$VAR1"
default

Однако, если значение установлено ранее, оно остается в покое.

$ VAR1="some value"
$ echo "${VAR1:=default}"
some value
$ echo "$VAR1"
some value

Справочная таблица Handy Dandy

ss of table

Ссылки

759
27.01.2020, 19:28

Личный опыт.

Иногда я использую этот формат в своих сценариях для произвольного переопределения значений, например если у меня есть:

$ cat script.sh
SOMETHING="${SOMETHING:-something}"; echo "$SOMETHING"; 

, я могу запустить:

$ env SOMETHING="something other than the default value" ./script.sh` 

без изменения исходного значения по умолчанию ЧТО-ТО .

10
27.01.2020, 19:28

@slm уже включает документы POSIX , которые очень полезны, но они не раскрывают, как эти параметры могут быть объединены, чтобы повлиять на один Другой.Здесь еще нет упоминания об этой форме:

${var?if unset parent shell dies and this message is output to stderr}

Это отрывок из другого моего ответа , и я думаю, он очень хорошо демонстрирует, как они работают:

    sh <<-\CMD
    _input_fn() { set -- "$@" #redundant
            echo ${*?WHERES MY DATA?}
            #echo is not necessary though
            shift #sure hope we have more than $1 parameter
            : ${*?WHERES MY DATA?} #: do nothing, gracefully
    }
    _input_fn heres some stuff
    _input_fn one #here
    # shell dies - third try doesnt run
    _input_fn you there?
    # END
    CMD
heres some stuff
one
sh: line :5 *: WHERES MY DATA?

Другой пример из same :

    sh <<-\CMD
    N= #N is NULL
    _test=$N #_test is also NULL and
    v="something you would rather do without"    
    ( #this subshell dies
        echo "v is ${v+set}: and its value is ${v:+not NULL}"
        echo "So this ${_test:-"\$_test:="} will equal ${_test:="$v"}"
        ${_test:+${N:?so you test for it with a little nesting}}
        echo "sure wish we could do some other things"
    )
    ( #this subshell does some other things 
        unset v #to ensure it is definitely unset
        echo "But here v is ${v-unset}: ${v:+you certainly wont see this}"
        echo "So this ${_test:-"\$_test:="} will equal NULL ${_test:="$v"}"
        ${_test:+${N:?is never substituted}}
        echo "so now we can do some other things" 
    )
    #and even though we set _test and unset v in the subshell
    echo "_test is still ${_test:-"NULL"} and ${v:+"v is still $v"}"
    # END
    CMD
v is set: and its value is not NULL
So this $_test:= will equal something you would rather do without
sh: line 7: N: so you test for it with a little nesting
But here v is unset:
So this $_test:= will equal NULL
so now we can do some other things
_test is still NULL and v is still something you would rather do without

В приведенном выше примере используются все 4 формы подстановки параметров POSIX и их различные : двоеточие null или not null . Дополнительная информация приведена по ссылке выше, и здесь снова .

Еще одна вещь, о которой люди часто не задумываются о $ {parameter: + extension} , - это то, насколько она может быть очень полезной в документе здесь. Вот еще один отрывок из другого ответа :

TOP

Здесь вы установите некоторые значения по умолчанию и подготовитесь к их печати при вызове ...

#!/bin/sh
    _top_of_script_pr() ( 
        IFS="$nl" ; set -f #only split at newlines and don't expand paths
        printf %s\\n ${strings}
    ) 3<<-TEMPLATES
        ${nl=
}
        ${PLACE:="your mother's house"}
        ${EVENT:="the unspeakable."}
        ${ACTION:="heroin"}
        ${RESULT:="succeed."}
        ${strings:="
            I went to ${PLACE} and saw ${EVENT}
            If you do ${ACTION} you will ${RESULT}
        "}
    #END
    TEMPLATES

MIDDLE

Здесь вы определяете другие функции для вызова вашей функции печати на основе их результатов ...

    EVENT="Disney on Ice."
    _more_important_function() { #...some logic...
        [ $((1+one)) -ne 2 ] && ACTION="remedial mathematics"
            _top_of_script_pr
    }
    _less_important_function() { #...more logic...
        one=2
        : "${ACTION:="calligraphy"}"
        _top_of_script_pr
    }

BOTTOM

Теперь у вас все настроено, поэтому здесь вы выполните и получите свои результаты.

    _less_important_function
    : "${PLACE:="the cemetery"}" 
    _more_important_function
    : "${RESULT:="regret it."}" 
    _less_important_function    

РЕЗУЛЬТАТЫ

Я сейчас объясню почему, но выполнение вышеуказанного дает следующие результаты:

первый запуск _less_important_function () :

Я пошел в дом вашей матери и увидел Дисней на льду.

Если вы занимаетесь каллиграфией , у вас все получится.

затем _more_important_function ():

Я пошел на кладбище и увидел Дисней на льду.

Если вы выполните лечебную математику , вы добьетесь успеха.

_less_important_function () снова:

Я пошел на кладбище и увидел Дисней на льду.

Если вы выполните лечебную математику, вы пожалеете об этом.

КАК ЭТО РАБОТАЕТ:

Ключевой особенностью здесь является концепция условного расширения $ {parameter}. Вы можете установить для переменной значение только в том случае, если оно не установлено или равно нулю, используя форму:

$ {var_name : = желаемое_значение}

Если вместо этого вы хотите установить только неустановленное значение переменной, вы должны опустить : двоеточие , и нулевые значения останутся такими, как есть.

В ОБЛАСТИ:

Вы могли заметить, что в приведенном выше примере $ PLACE и $ RESULT изменяются при установке с помощью расширения параметра , хотя _top_of_script_pr () уже был вызван, предположительно устанавливая их при запуске. Причина, по которой это работает, заключается в том, что _top_of_script_pr () - это функция (без оболочки) - я заключил ее в скобки , а не в {фигурные скобки} для остальных. Поскольку он вызывается в подоболочке, каждая переменная, которую он устанавливает, имеет локальную область видимости , и когда она возвращается в свою родительскую оболочку, эти значения исчезают.

Но когда _more_important_function () устанавливает $ ACTION , это глобальная область , поэтому она влияет на _less_important_function () вторую оценку $ ACTION , потому что _less_important_function () устанавливает $ ACTION только через $ {параметр: = extension}.

17
27.01.2020, 19:28

Теги

Похожие вопросы