« Отсутствующий код » очень важен.
#!/usr/bin/env bash
main() {
echo ${1:-1}
}
main "$@"
Здесь мы вызываем main функцию и предоставляем "${@}" (т.е. все наши аргументы, сохраняя разделение).
Когда ${@} расширяется до нуля (т. Е. Скрипт вызывался без аргументов), main() вызывается без аргументов, и, таким образом, ${1:-1} внутри функции main() будет иметь специальную эффект в соответствии с семантикой « Подстановка параметров ».
В частности, ${parameter:-default} будет расширяться до значения ${parameter} если он объявлен и не-NULL, или по default если он не объявлен или равен NULL. Обратите внимание, что ${parameter:-default} ведет себя несколько иначе, чем ${parameter-default} .
${parameter-default} и ${parameter:-default} почти эквивалентны. Extra : имеет значение только тогда, когда параметр был объявлен, но имеет значение null.
Таким образом, ${1:-1} будет расширяться до первого заданного аргумента или по умолчанию 1:
$ ./script.sh
1
$ ./script.sh test
test
Использование /usr/bin/env в shebang позволяет нам « использовать bash в качестве интерпретатора » без указания полного пути к bash ... env будет искать ${PATH} текущей среды и использовать для нас первый подходящий кандидат , Шебанг требует абсолютного пути к интерпретатору, и мы можем обойти это ограничение, используя env .
Это очень часто встречается в скриптах Python, поскольку интерпретатор может находиться в нескольких местах - хотя часто /usr/bin/python , он также поддерживает такие вещи, как virtualenv .
Смотрите " Почему люди пишут #!/usr/bin/env python shebang в первой строке скрипта Python?«для дальнейшего обсуждения.