Intereting Posts
Как напечатать n-ю строку после совпадения / пустые строки Как заблокировать операцию управления трафиком (tc), если он запущен как не-root? Каково значение вывода ss -p как заново смонтировать домашний каталог определенного пользователя в раздел В чем разница между / root и / home в Kali linux Операторы печати в реальном времени с тройником в интерактивном скрипте Как я могу разобрать вывод многострочной команды в bash? Как окончательно отключить запрос root-password для режима восстановления, RHEL6 Запуск всех сценариев в папке в фоновом режиме bash: проверьте, находится ли переменная в распаковка tarball с жесткими ссылками на файловую систему, которая не поддерживает жесткие ссылки Где KDE 4 хранит свои быстрые клавиши? Выключение компьютера из Openbox К каким файлам применяется `patch -p1` патч в этом примере? Добавление даты в имя файла при отправке электронной почты

Анализируя сложные штучки и имея удобный список полезных

Видел один лайнер, как показано ниже, и потратил немного времени на то, чтобы проанализировать точное его использование и работу – что-то вроде того, чтобы установить значение для более позднего, если оно не установлено.

export JDK_HOME=${JDK_HOME:-"/some/path/java-1.7"} 

Я не видел таких хитрых литералов, как «:« Когда я что-то ищу. Есть ли какой-либо удобный список таких полезных один лайнеров документально или specfic man страницы для ссылки?

Прочтите man bash и введите /Parameter Expansion (точно так же, как и предыдущая косая черта). Он будет искать соответствующий раздел на этой странице руководства; объясняются возможные модификаторы расширения.

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

Вы можете включить его и отключить, обернув команды, представляющие интерес, в блоке:

 $ set -x; command_to_watch; set +x 

пример

 $ set -x; export JDK_HOME=${JDK_HOME:-"/some/path/java-1.7"}; set +x + export JDK_HOME=/some/path/java-1.7 + JDK_HOME=/some/path/java-1.7 + set +x 

Здесь вы можете увидеть, что переменная $JDK_HOME устанавливается в /some/path/java-1.7 . Однако, если мы установим его на что-то еще:

 $ export JDK_HOME=/a/path $ echo $JDK_HOME /a/path 

И запустите эту команду еще раз:

 $ set -x; export JDK_HOME=${JDK_HOME:-"/some/path/java-1.7"}; set +x + export JDK_HOME=/a/path + JDK_HOME=/a/path + set +x 

Мы видим, что это ничего не делало, что привело нас к тому, что если переменная уже установлена, эта команда оставит ее в покое, иначе она установит ее со значением /some/path/java-1.7 .

Подтверждая наше подозрение на странице пользователя Bash :

 ${parameter:-word} Use Default Values. If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted. 

Я нашел Справочные карты в Приложении B к Расширенному руководству по созданию Bash-Scripting Guide очень полезным. Соответствующей таблицей для вашего примера будет Таблица B-4: Замена и расширение параметров .