Замена команд Bash не работает

Замена команд Bash не работает

Вот сценарий:

#!/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 не будет расширять переменные, если они заключены в одинарные кавычки.

Связанный контент