Leia man bash
e digite /Parameter Expansion
(exatamente assim, com a barra inicial). Ele procurará a seção relevante daquela página do manual; os modificadores de expansão possíveis são explicados lá.
Já vi alguns forros como abaixo & demorou um pouco para analisar o uso exato & trabalhando nisso - algo como definir o valor para mais tarde se não estiver definido.
export JDK_HOME=${JDK_HOME:-"/some/path/java-1.7"}
Eu não vi literais complicados como ': -' quando eu procuro por algo. Existe alguma lista útil de tais liners úteis documentados ou uma página de manual específica para referenciar?
Além de outra boa resposta em relação à consulta da documentação, eu sempre recorro ao recurso de depuração do Bash para ver o que está acontecendo.
Você pode ativá-lo e desativá-lo, agrupando os comandos de interesse em um bloco como este:
$ 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
Aqui você pode ver que a variável $JDK_HOME
está sendo definida para /some/path/java-1.7
. No entanto, se formos configurá-lo para outra coisa:
$ export JDK_HOME=/a/path
$ echo $JDK_HOME
/a/path
E execute este comando novamente:
$ 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
Podemos ver que não fez nada, levando-nos ao fato de que, se a variável já estiver configurada, este comando a deixará sozinha, caso contrário, ela será definida com o valor /some/path/java-1.7
.
Confirmando nossa suspeita na página de manual do 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.
Encontrei os Cartões de referência no Apêndice B do Advanced Bash-Scripting Guide muito útil. A tabela relevante para o seu exemplo seria Tabela B-4: Substituição e Expansão de Parâmetro .