Como tratar strings com espaços como um todo em bash? [duplicado]

8

Gostaria de criar um manipulador de erros que tornará um arquivo vazio marcado com o tempo error_occur.

A ideia principal é usar o resultado do comando date como um parâmetro.

eu fiz:

time_stamp=$(date)
touch $time_stamp

Mas isso acaba criando uma série de arquivos vazios como 2014 , Wed , 11:15:20 .

Como converter time_stamp para uma string inteira aqui?

    
por Zen 29.10.2014 / 05:00

2 respostas

14

Você deve aspas duplas:

time_stamp="$(date)"
touch "$time_stamp"

Nesse caso, aspas duplas em "$(date)" não são obrigatórias, mas é uma boa prática fazer isso. Você pode ler this para mais compreensão.

    
por 29.10.2014 / 05:04
13

A resposta de cuonglm resolve o problema de criar um arquivo com espaços em geral, mas o problema começa usando a saída padrão de date .

Se você quiser usar uma string de data ou hora como parte de seu nome de arquivo, você deve sempre usar a opção --rfc-3339 (se estiver em um sistema GNU recente) ou uma string de formato apropriada. Isso fornecerá a você nomes de arquivos que podem ser classificados de maneira lógica. A opção --rfc-3339 usa um parâmetro, use seconds , ns ou date dependendo da precisão desejada no nome do arquivo:

time_stamp="$(date --rfc-3339=seconds)"
touch "$time_stamp"

Você também pode obter uma string específica sem espaços e apenas as informações necessárias de date +FORMAT (use man date para detalhes).

time_stamp="$(date +%Y%m%d-%H%M)"
touch "$time_stamp"

fornecerá um arquivo com um nome como 20141029-0944 sem espaços e dando a ilusão de que você não precisa citar. Mas você ainda faz isso, pois ainda estaria invocando o operador split + glob que ainda poderia realmente ser dividido se usado em um contexto em que $IFS foi alterado do padrão.

    
por 29.10.2014 / 09:45