criando um arquivo com toque usando uma variável

0

Eu tenho essa variável:

toto=123456

por que o touch "$toto.hihi.log" funciona e cria um arquivo chamado 123456.hihi.log

mas touch "$totohihi.log" não faz nada?

    
por Albizia 21.05.2018 / 12:04

4 respostas

4

Você precisa

touch "${toto}hihi.log"

O problema é que o shell não pode saber sem as chaves quantos caracteres fazem parte do nome da variável. Assim, trata todos os caracteres legais como parte do nome. Neste caso, isso é tudo antes do . ; Ou seja, o shell usa a variável não existente $totohihi .

Em geral, é útil usar a opção -x do shell para ver o que está acontecendo:

set -x
touch "$totohihi.log"
    + touch .log
    
por 21.05.2018 / 12:08
3

Ele expande $totohihi para a string vazia e, em seguida, executa touch ".log" (assumindo que a variável não foi definida em outro lugar). Tente ver o que o ls -l .log diz.

Como mencionado por outras respostas, você precisa agrupar o nome da variável entre chaves se os caracteres a seguir puderem fazer parte de um nome de variável, portanto, touch "${toto}hihi.log" . Observe que o sublinhado também é válido em nomes de variáveis junto com letras e números, portanto "${toto}_hihi.log" também precisaria de chaves.

    
por 21.05.2018 / 12:09
1

$totohihi.log significa variável com o nome totohihi

para que funcione, use

${toto}hihi.log

Esta resposta do stackoverflow tem uma boa explicação

    
por 21.05.2018 / 12:08
-1

O Shell sabe que $toto é uma variável com valor 123456 .
Portanto, sempre que encontrar $toto , ele será substituído por 123456 .
Portanto, no caso de $toto.hihi.log , o shell substitui $toto por 123456 , pois . é como um operador de concatenação e cria um arquivo conforme o esperado.

No entanto, no caso de $totohihi.log , o shell não localiza nenhuma variável denominada $totohihi e, portanto, substitui-a por cadeia vazia, resultando na criação do arquivo .log . Você pode encontrá-lo com ls -a ou ls .log , pois os arquivos que começam com . são arquivos ocultos e não podem ser vistos com o comando ls simples.

Caso você precise criar um arquivo com o nome 123456hihi.log , será necessário colocar $toto nas chaves como ${toto}hihi.log , conforme mencionado por outras pessoas nas respostas anteriores.

    
por 21.05.2018 / 14:25