Продвинутые методы установки значений по умолчанию
Теперь, когда вы понимаете основы установки значений по умолчанию в Bash, давайте рассмотрим некоторые продвинутые методы, которые сделают ваши скрипты еще более мощными и гибкими.
Оператор присваивания :=
Оператор := не только подставляет значение по умолчанию, но и присваивает это значение переменной, если она не была установлена. Это полезно, когда вы хотите, чтобы переменная сохранила свое значение по умолчанию для последующего использования.
- Создайте новый файл с именем
assign_default.sh в директории bash_defaults со следующим содержимым:
#!/bin/bash
## Demonstrate the := assignment operator
echo "Before assignment, NAME = $NAME"
## This assigns the default value to NAME if it's unset
: ${NAME:="DefaultUser"}
echo "After assignment, NAME = $NAME"
## Now use the variable in a function
greet() {
echo "Hello, $NAME!"
}
greet
- Сделайте скрипт исполняемым:
chmod +x assign_default.sh
- Запустите скрипт, не устанавливая NAME:
./assign_default.sh
Вы должны увидеть:
Before assignment, NAME =
After assignment, NAME = DefaultUser
Hello, DefaultUser!
- Теперь установите NAME перед запуском:
NAME="Alice" ./assign_default.sh
Вы должны увидеть:
Before assignment, NAME = Alice
After assignment, NAME = Alice
Hello, Alice!
Цепочка значений по умолчанию
Иногда вам может потребоваться проверить несколько источников для получения значения, прежде чем вернуться к жестко закодированному значению по умолчанию. Вы можете объединить значения по умолчанию для достижения этого:
- Создайте новый файл с именем
chain_defaults.sh в директории bash_defaults со следующим содержимым:
#!/bin/bash
## Read config file if it exists
if [[ -f "./user.conf" ]]; then
source "./user.conf"
fi
## Chain default values: command line arg -> config file -> environment var -> hard-coded default
USERNAME=${1:-${CONFIG_USER:-${USER:-"guest"}}}
LANGUAGE=${2:-${CONFIG_LANG:-${LANG:-"en_US"}}}
echo "Hello, $USERNAME! Your language is set to $LANGUAGE."
- Сделайте скрипт исполняемым:
chmod +x chain_defaults.sh
- Создайте файл конфигурации для тестирования:
echo "CONFIG_USER=ConfigUser" > user.conf
echo "CONFIG_LANG=es_ES" >> user.conf
- Протестируйте скрипт с различными комбинациями:
## Use defaults from the config file
./chain_defaults.sh
## Override with command line arguments
./chain_defaults.sh CommandLineUser fr_FR
## Remove config file to test falling back to environment variables
rm user.conf
./chain_defaults.sh
Условные значения по умолчанию
Вы также можете использовать условные выражения для установки различных значений по умолчанию в зависимости от условий:
- Создайте новый файл с именем
conditional_defaults.sh в директории bash_defaults со следующим содержимым:
#!/bin/bash
## Get the current hour (24-hour format)
HOUR=$(date +%H)
## Set default greeting based on time of day
if ((HOUR < 12)); then
DEFAULT_GREETING="Good morning"
elif ((HOUR < 18)); then
DEFAULT_GREETING="Good afternoon"
else
DEFAULT_GREETING="Good evening"
fi
## Use the conditional default if no greeting is provided
GREETING=${1:-"$DEFAULT_GREETING"}
NAME=${2:-"User"}
echo "$GREETING, $NAME!"
echo "The current time is $(date +%H:%M)."
- Сделайте скрипт исполняемым:
chmod +x conditional_defaults.sh
- Запустите скрипт, чтобы увидеть, как он выбирает приветствие по умолчанию в зависимости от времени суток:
./conditional_defaults.sh
- Переопределите приветствие по умолчанию:
./conditional_defaults.sh "Hello" "World"
Эти продвинутые методы дают вам больше гибкости при работе со значениями по умолчанию в Bash, позволяя создавать более сложные и удобные для пользователя скрипты.