As atribuições de variáveis podem ser simplificadas da seguinte forma:
if [ ! -n "${varname}" ]; then
varname="some default"
fi
é equivalente a
varname=${varname:-"some default"}
e, ainda mais conciso,
: ${varname:="some default"}
Para parametrizar isso para nomes de variáveis arbitrárias e valores padrão, sugiro definir uma função. bash
insiste em um nome de variável explícito para substituição de parâmetro com ${...}
, portanto, especificar uma variável ou comando indireto em vez de varname não parece possível (para mim):
#!/bin/bash
# exec_with_default
# Assign command output to specified variable, or assign default value if
# output empty
#
# $1 : command
# $2 : variable to be set
# $3 : default value for variable
function exec_with_default {
local t="$($1)" # Assign command output to temporary variable t
: ${t:="$3"} # Perform bash parameter subsitution on t
eval "$2=\$t" # Indirectly assign t to variable name provided in $3
}
exec_with_default "echo something" "varname" "not set"
echo $varname
exec_with_default "echo" "varname" "not set"
echo $varname