Preciso concatenar duas variáveis para criar um nome de arquivo que tenha um sublinhado. Vamos chamar minhas variáveis $FILENAME
e $EXTENSION
onde o nome do arquivo é lido de um arquivo.
FILENAME=Hello
EXTENSION=WORLD.txt
Agora...
Eu tentei o seguinte sem sucesso:
NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
NAME=$FILENAME\\_$EXTENSION
Eu sempre recebo algum tipo de saída estranha. Normalmente, o sublinhado primeiro.
Eu preciso que seja
echo $NAME
Hello_WORLD.txt
bash
shell-script
Rhyuk
fonte
fonte
Respostas:
Você pode usar algo como isto:
Isso também funciona:
fonte
echo
não pode ajudar. O segundo comando já foi dado na pergunta.Seu:
estão bem, então seria:
(mas certamente não
como ele usaNAME=$(echo ${FILENAME}_${EXTENSION})
echo
e osplit+glob
operador ).teria sido o mesmo que:
como
_
(contrário a\
ou'
) é um caractere válido em um nome de variável.Seu problema é que você tinha linhas delimitadas com CRLF em vez de apenas LF, o que significava que esse conteúdo variável terminava em caracteres CR.
O caractere CR, quando gravado em um terminal, informa ao terminal para mover o cursor para o início da linha. Portanto,
Hello<CR>_WORLD.TXT<CR>
quando enviado para um terminal, seria exibido como_WORLD.TXT
(substituindo oHello
).fonte
Eu mudei para usar a
${FILENAME}_${EXTENSION}
sintaxe mencionada acima.Eu costumava usar
$()
quando precisava concatenar duas variáveis com um sublinhado. Por exemplo,$YYYYMMDD$()_$HHMMSS
para gerar um nome de arquivo contendo um registro de data e hora no formato AAAAMMDD_HHMMSS. O meio$()
não retorna nada e divide as duas variáveis.Eu costumava
time
medir as atribuições usando o$YYYYMMDD$()_$HHMMSS
método e algumas das opções acima, e todas elas relataram 0ms no servidor antigo em que estou usando isso. O desempenho não parece ser um problema.fonte
$()
bifurca um subshell em algumas conchas (alguns o otimizam). Também está seqüestrando um operador para algo para o qual não foi projetado.${x}_y
é o que você quer.Você deve usar variáveis em minúsculas (é a melhor prática).
Então, usarei o nome do arquivo e a extensão em vez do FILENAME e EXTENSION
Como você diz que "o nome do arquivo é lido de um arquivo", assumirei que o script é:
E que você deseja concatenar as variáveis $ filename e $ extension com um sublinhado
_
.Os exemplos que você fornece (exceto: no double \) funcionam corretamente aqui:
Como alguns outros:
Portanto, seu problema não é como as variáveis são unidas, mas com o conteúdo dos vars. Parece razoável pensar que isso:
lerá um retorno de carro à direita
\r
se estiver lendo um arquivo do Windows.Uma solução simples (para ksh, bash, zsh) é remover todos os caracteres de controle da variável de leitura:
Isso pode ser simulado com um valor que possui um retorno de carro:
Ou, substituindo o valor de
filename
:Conclusão.
Então, é isso:
Obterá o valor correto para,
name
mesmo que os outros vars contenham caracteres de controle.fonte
Resposta de Stéphane Chazelas ,
é, obviamente, a melhor resposta e deve ser a resposta aceita. Mas, no espírito da resposta do usuário208145 , aqui está uma alternativa:
fonte
Você também pode usar isso: separe os vars separados por espaços e concatene-os usando tr para remover o espaço.
fonte