(...) introduz um subshell. Então $URL não seria definido depois disso (ainda tem o valor que tinha antes da subcamada). Você quer:
IFS=-
read -r -a host_name_array <<< "$(hostname)"
unset 'host_name_array[${#host_name_array[@]}-1]'
URL="${host_name_array[*]}"
"${host_name_array[*]}" une os elementos nas matrizes no primeiro caractere de $IFS , da mesma forma que "$*" faz no padrão sh .
Se o motivo pelo qual você está usando um subshell é porque não deseja modificar o $IFS globalmente, é possível fazer isso em uma função em que você atribui $IFS um escopo local:
f() {
local IFS=-
...
}
f
Ou use a substituição de comando que também cria um subshell, mas permite passar dados ao shell pai:
URL=$(IFS=-; printf '%s\n' "${host_name_array[*]}")
Aqui, eu usaria a expansão sh padrão para remover esse componente final:
URL=$(uname -n) # uname -n is the standard equivalent of hostname
URL=${URL%-*}
Tem várias vantagens em relação ao acima:
- funciona mesmo que o texto contenha caracteres de nova linha (muito improvável para nomes de host aqui);
- se o texto não contiver
- , ele não removerá nada;
- é mais eficiente.
read <<< $(hostname) significa executar hostname , ler sua saída por meio de um canal, armazená-lo em um arquivo temporário e ter read lendo a primeira linha dele;
- não atrapalha o namespace da variável com essas variáveis temporárias
- é mais curto;
- é portátil. Não é necessário instalar
bash para executar esse código. O sh do sistema será suficiente.
Em qualquer caso, lembre-se de citar suas variáveis ao usá-las em contextos de lista:
printf '%s\n' "$URL"
Ao fazer:
echo $URL
Você está invocando o operador split + glob. Assim, se $IFS ainda contiver - , esse $URL seria dividido em - e echo produziria essas palavras separadas por espaços.