Извините, если это глупый вопрос, но я искал его безуспешно.
Что делает именно вторая строка?:
#!/bin/sh
cd ${0%/*} || exit 1
Я знаю, что первая - это шебанг, вторая пытается сменить каталог, но сбивающая с толку часть - ${0%/*}
.
Не могли бы вы объяснить мне эту вторую строку?
${0}
первый аргумент сценария, т.е. название сценария или путь. Если Вы запускаете свой сценарий как path/to/script.sh
, затем ${0}
будет точно что строка: path/to/script.sh
.
%/*
часть изменяет значение ${0}
. Это означает: возьмите все символы до /
сопровождаемый именем файла. В примере выше, ${0%/*}
будет path/to
.
Вы видите его в действии с Вашей оболочкой:
$ x=path/to/script.sh
$ echo "${x%/*}"
path/to
Sh поддерживает много других видов "замены параметра". Вот, например, как взять имя файла вместо пути:
$ echo "${x##*/}"
script.sh
В целом, %
и %%
суффиксы полосы, в то время как #
и ##
префиксы полосы. Можно читать больше о замене параметра.