A substituição do comando Bash não funciona

A substituição do comando Bash não funciona

Este é o roteiro:

#!/bin/bash

thedate=$(date)


var='Current date is $thedate'

echo $var

A saída é A data atual é $thedate e gostaria que mostrasse a data, o que fiz de errado? Qualquer ajuda seria apreciada.

Responder1

O problema é que bashexpande as variáveis ​​de ambiente apenas uma vez, a menos que você use o eval, o que faz com que a linha de comando seja analisada duas vezes:

eval echo $var

Observe que a data e a hora exibidas são as atuais quando thedateestão definidas e não quando $varsão referenciadas. Para exibir a hora atual quando $varé referenciada, você precisa: –

var='Current date is $(date)'
eval echo $var

Seria melhor não usar variáveis, mas definir uma função:-

cdate() { echo Current date is $(date); }
...
cdate

Claro, é melhor ainda não usar echo, mas deixe date-se adicionar o texto extra:

cdate() { date +"Current date is %c"; }

Isso não produz exatamente o mesmo formato do datepadrão, mas não há especificador de formato para o padrão.

Responder2

var='Current date is $thedate'

As variáveis ​​não se expandem entre aspas simples, então isso atribui uma string contendo o literal text $thedate. Você deve usar aspas duplas aqui para expandir a variável.

echo $var

Além disso, aqui, você deve usar aspas duplas ao redor da variável para evitar que ela esteja sujeita à divisão de palavras e expansão do nome do caminho, ou seja echo "$var", . Nesse caso específico, você pode evitar o uso de aspas, pois a data provavelmente não conterá caracteres curinga. Mas sem aspas, por exemplo, a sequência de data Fri Dec 7 20:41:21 EET 2018seria exibida como Fri Dec 7 20:41:21 EET 2018, ou seja, o espaço duplo após o nome do mês seria reduzido a um único espaço.

Responder3

Use aspas duplas em vez de aspas simples. O Bash não expandirá variáveis ​​quando estiver entre aspas simples.

informação relacionada