« Отсутствующий код » очень важен.
#!/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?«для дальнейшего обсуждения.