В чем разница между "var = ${var: -word}" и "var = ${var: = word}"?

Я прочитал эту страницу bash, но я не понимаю разницы. Я тестировал их оба, и они, похоже, дают точные результаты.

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

#!/bin/bash

var="$1"
var=${var:-word}
echo "$var"

В приведенном выше коде эхо-сигнал word, если $1 имеет значение null и эхо-значение $1, если не null. Так делает это:

#!/bin/bash

var="$1"
var=${var:=word}
echo "$var"

Согласно bash странице man,

${parameter:-word} Используйте значения по умолчанию. Если параметр не задан или нулевым, заменяется слово. В противном случае значение параметра будет заменено.

${parameter:=word} Назначить значения по умолчанию. Если параметр не задан или null, расширение слова присваивается параметру. Затем значение параметра заменяется. Таким образом, нельзя назначать позиционные параметры и специальные параметры.

Это то, что они одинаковые, а ${parameter:=word} просто больше?

Ответ 1

Вы не можете видеть разницу с вашими примерами, поскольку используете var два раза, но вы можете видеть это с двумя разными переменными:

foo=${bar:-something}

echo $foo # something
echo $bar # no assignement to bar, bar is still empty

foo=${bar:=something}

echo $foo # something
echo $bar # something too, as there an assignement to bar

Ответ 2

${var:=word}

равно

var=${var:-word}

Ответ 3

Разница заключается в использовании и назначении. Без = используется значение word, но фактически не назначено на var.

Это наиболее важно в случае переменных, которые только читаются - это то, где вы не можете назначить им.

Например, вы никогда не можете назначить нумерованные позиционные параметры. Поэтому, если вы хотите, чтобы ваша функция обрабатывала необязательный первый параметр по умолчанию, вы можете использовать код, например:

${1:-default}

Вы не можете использовать версию ${1:=default} там, поскольку вы не можете назначить позиционный параметр 1. Он доступен только для чтения.

Ответ 4

Иногда вы видите расширение назначения с помощью команды ::

# set defaults
: ${foo:=bar} ${baz:=qux}