O problema
Vamos começar definindo um nome de servidor:
$ servername=SomeName
Agora tente:
$ echo "$servername_log_20150312"
$
O acima não retorna nada porque (a) o sublinhado é um caractere legal em um nome de variável do shell e (b) nunca definimos servername_log_20150312
.
Agora considere:
/server/directory/$servername_log_20150312*
Após a expansão das variáveis, isso se torna:
/server/directory/*
Após a expansão do nome do caminho, o acima se torna todo arquivo no diretório.
Duas soluções
Como esse tipo de coisa é comum, o shell possui notação de chaves:
$ echo "${servername}_log_20150312"
SomeName_log_20150312
Outras formas de separar o nome dos caracteres que se seguem são possíveis:
$ echo "$servername""_log_20150312"
SomeName_log_20150312
Documentação
A partir de man bash
, um nome de variável pode conter qualquer combinação de caracteres alfanuméricos e sublinhados, mas deve começar com um caractere alfabético:
name A word consisting only of alphanumeric characters and underscores, and
beginning with an alphabetic character or an underscore. Also referred
to as an identifier.
POSIX limita a dependência da implementação de nomes de variáveis. Embora exija que os shells aceitem alfanuméricos e sublinhados em nomes, aparentemente dá aos shells a opção de aceitar qualquer coisa, exceto =
e NUL.