bash - чайников - создать скрипт linux




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

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, но я не уверен, что он переносимый.

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

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

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

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

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

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


Вот пример

#!/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]

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

VARIABLE=${1:-DEFAULTVALUE}    

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


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

: "${VARIABLE:=DEFAULT_VALUE}"

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

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


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

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

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

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."




shell