Назначение значений по умолчанию для переменных оболочки с помощью одной команды в bash

У меня есть целая группа тестов по переменным в сценарии оболочки bash (3.00), где, если переменная не задана, тогда она присваивает значение по умолчанию, например:

if [ -z "${VARIABLE}" ]; then FOO='default' else FOO=${VARIABLE} fi 

Кажется, я помню, что в одной строке есть какой-то синтаксис, что-то похожее на тернарный оператор, например:

 FOO=${ ${VARIABLE} : 'default' } 

(хотя я знаю, что это не сработает …)

Я сумасшедший, или что-то подобное существует?

Очень близко к тому, что вы разместили, на самом деле:

 FOO=${VARIABLE:-default} # If variable not set or null, use default. 

Или, который также назначит default по default VARIABLE :

 FOO=${VARIABLE:=default} # If variable not set or null, set it to default. 

Для аргументов командной строки:

 VARIABLE=${1:-DEFAULTVALUE} 

который присваивает VARIABLE значение первого аргумента, переданного скрипту, или значение DEFAULTVALUE если такой аргумент не был принят.

Если переменная такая же, то

 : "${VARIABLE:=DEFAULT_VALUE}" 

присваивает DEFAULT_VALUE значение VARIABLE, если оно не определено. Двойные кавычки предотвращают глотание и разбиение слов.

Также см. Раздел 3.5.3 « Расширение параметров оболочки» в руководстве Bash.

см. ниже в разделе 3.5.3 (расширение параметра оболочки)

поэтому в вашем случае

 ${VARIABLE:−default} 

Даже вы можете использовать как значение по умолчанию значение другой переменной

имеющий файл defvalue.sh

 #!/bin/bash variable1=$1 variable2=${2:-$variable1} echo $variable1 echo $variable2 

run ./defvalue.sh first-value second-value

 first-value second-value 

и запустить ./defvalue.sh first-value

 first-value first-value 

Тогда есть способ выразить вашу «if» конструкцию более кратко:

 FOO='default' [ -n "${VARIABLE}" ] && FOO=${VARIABLE} по FOO='default' [ -n "${VARIABLE}" ] && FOO=${VARIABLE} 

FWIW, вы можете предоставить сообщение об ошибке следующим образом:

 USERNAME=${1:?"Specify a username"} 

Появится сообщение, подобное этому, и выйдет с кодом 1:

 ./myscript.sh ./myscript.sh: line 2: 1: Specify a username 

Более полный пример всего:

 #!/bin/bash ACTION=${1:?"Specify 'action' as argv[1]"} DIRNAME=${2:-$PWD} OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}} echo "$ACTION" echo "$DIRNAME" echo "$OUTPUT_DIR" 

Вывод:

 $ ./script.sh foo foo /path/to/pwd /tmp $ export HOMEDIR=/home/myuser $ ./script.sh foo foo /path/to/pwd /home/myuser 
  • $ACTION принимает значение первого аргумента и выходит, если пустое
  • $DIRNAME является вторым аргументом и по умолчанию используется текущий каталог
  • $OUTPUT_DIR – третий аргумент, или $HOMEDIR (если определено), else, /tmp . Это работает на OS X, но я не уверен, что он переносимый.

Вот пример

 #!/bin/bash default='default_value' value=${1:-$default} echo "value: [$value]" по #!/bin/bash default='default_value' value=${1:-$default} echo "value: [$value]" по #!/bin/bash default='default_value' value=${1:-$default} echo "value: [$value]" 

сохраните это как script.sh и сделайте его исполняемым. запустить его без параметров

 ./script.sh > value: [default_value] 

запустить его с параметром

 ./script.sh my_value > value: [my_value] 

Чтобы ответить на ваш вопрос и на все переменные подстановки

 echo "$\{var}" echo "Substitute the value of var." echo "$\{var:-word}" echo "If var is null or unset, word is substituted for var. The value of var does not change." echo "2- $\{var:=word}" echo "If var is null or unset, var is set to the value of word." echo "$\{var:?message}" echo "If var is null or unset, message is printed to standard error. This checks that variables are set correctly." echo "$\{var:+word}" echo "If var is set, word is substituted for var. The value of var does not change." 
  • Как изменить оболочку в Ubuntu?
  • Напишите мне, когда кто-нибудь запустит sudo
  • «Ls: not found» после запуска «read PATH»
  • Как использовать строки файла в качестве аргументов команды?
  • Как считать все строки кода в каталоге рекурсивно?
  • Есть ли плагин Eclipse для запуска системной оболочки в консоли?
  • Как отлаживать скрипт bash?
  • Где разместить переменные $ PATH в zsh?
  • '\ r': команда не найдена
  • Запуск скрипта при регистрации Mac
  • Проверьте наличие входного аргумента в сценарии оболочки Bash
  • Interesting Posts

    Использовать C ++ с Cocoa вместо Objective-C?

    Разрешения в HTML-редакторе Bluefish

    Сгладить список в Prolog

    Как я могу получить последнюю версию JRE / JDK как zip-файл, а не EXE или MSI-установщик?

    Как поворачивать изображения JPEG на основе метаданных ориентации?

    Как получить версию приложения в Windows Phone?

    Как показать удобную страницу ошибок в браузере, когда исключение среды выполнения выбрано сервлетом?

    Java: BufferedImage для байтового массива и обратно

    Как обеспечить, чтобы сохраненные координаты кликов могли быть перенаправлены на одно и то же место, даже если макет страницы изменился?

    Принудительный модуль Arc4random

    Как использовать бутстрап с 16 или 24 столбцами

    Ntoskrnl.exe! _misaligned_access ест много CPU при простоях

    Включение внешних jar-файлов в новую сборку jar-файлов с Ant

    Как я могу переключать представления программным образом в controllerе представления? (Xcode, iPhone)

    Создание баннера смарт-приложений android

    Давайте будем гением компьютера.