Заметки программиста

Как в скрипте bash сделать параметры по умолчанию

В скриптах bash значения по умолчанию для переменных и параметров можно задать с помощью специального синтаксиса, называемого подстановкой параметров (parameter substitution). 

Синтаксис :- для присвоения значения по умолчанию

Самый распространённый способ — использовать оператор ${переменная:-значение_по_умолчанию}. Он подставляет значение переменной, если она установлена и не пуста, иначе использует значение_по_умолчанию

Пример для позиционных параметров:

bash

#!/bin/bash

# Если первый аргумент ($1) не передан или пуст,
# переменной `NAME` будет присвоено значение "Гость".
# Если аргумент передан, используется его значение.
NAME=${1:-"Гость"}

echo "Привет, $NAME!"

Используйте код с осторожностью.

Как это работает:

  • Запуск без аргумента:./мой_скрипт.sh
    • Вывод: Привет, Гость!
  • Запуск с аргументом:./мой_скрипт.sh Иван
    • Вывод: Привет, Иван!

Различия в операторах

В bash есть несколько операторов для работы со значениями по умолчанию: 

  • ${переменная:-значение_по_умолчанию}: Использует значение по умолчанию, если переменная не установлена или пуста. Сама переменная при этом не изменяется.
  • ${переменная:=значение_по_умолчанию}: Использует значение по умолчанию, если переменная не установлена или пуста, и присваивает это значение самой переменной.
  • ${переменная-значение_по_умолчанию}: Более строгий вариант. Использует значение по умолчанию, только если переменная не установлена. Если переменная пуста (variable=""), то значение_по_умолчанию не будет использовано. 

Присвоение переменным с именами

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

bash

#!/bin/bash

# Сначала задаём значения по умолчанию
SERVER="localhost"
PORT=8080

# Затем проходим по всем аргументам, чтобы перезаписать значения по умолчанию
for arg in "$@"; do
  case $arg in
    --server=*)
      SERVER="${arg#*=}"
      ;;
    --port=*)
      PORT="${arg#*=}"
      ;;
  esac
done

echo "Подключение к серверу: $SERVER на порту: $PORT"

Как это работает:

  • Запуск без аргументов:./мой_скрипт.sh
    • Вывод: Подключение к серверу: localhost на порту: 8080
  • Запуск с аргументами:./мой_скрипт.sh --port=9000
    • Вывод: Подключение к серверу: localhost на порту: 9000
  • Запуск с несколькими аргументами:./мой_скрипт.sh --server=prod.local --port=8888
    • Вывод: Подключение к серверу: prod.local на порту: 8888