Вот сценарий:
#!/bin/bash
thedate=$(date)
var='Current date is $thedate'
echo $var
Вывод: Текущая дата $thedate, и я хотел бы, чтобы она отображала дату, что я сделал не так? Любая помощь будет оценена по достоинству.
решение1
Проблема в том, что он bash
расширяет переменные среды только один раз, если только вы не используете eval
, что приводит к тому, что командная строка анализируется дважды:
eval echo $var
Обратите внимание, что дата и время отображаются текущими, когда thedate
установлено, а не когда $var
ссылается. Чтобы отобразить текущее время, когда $var
ссылается, вам необходимо:-
var='Current date is $(date)'
eval echo $var
Лучше было бы не использовать переменные, а определить функцию:-
cdate() { echo Current date is $(date); }
...
cdate
Конечно, лучше все же не использовать echo
, а date
добавить дополнительный текст:
cdate() { date +"Current date is %c"; }
Это не совсем тот же формат вывода, что и date
по умолчанию, но для формата по умолчанию нет спецификатора.
решение2
var='Current date is $thedate'
Переменные не расширяются в одинарных кавычках, поэтому это присваивает строку, содержащую буквальный текст $thedate
. Здесь следует использовать двойные кавычки, чтобы переменная расширялась.
echo $var
Также здесь следует использовать двойные кавычки вокруг переменной, чтобы предотвратить ее разбиение на слова и расширение имени пути, т. е echo "$var"
. В этом конкретном случае можно обойтись без кавычек, поскольку дата, скорее всего, не будет содержать подстановочных знаков. Но без кавычек, например, строка даты Fri Dec 7 20:41:21 EET 2018
будет выведена как Fri Dec 7 20:41:21 EET 2018
, то есть двойной пробел после названия месяца будет свёрнут в один пробел.
решение3
Используйте двойные кавычки вместо одинарных. Bash не будет расширять переменные, если они заключены в одинарные кавычки.