В bash, как вызвать переменную и обернуть кавычки вокруг ее значения как часть команды, не заставляя имя переменной стать строковым литералом?

Поэтому я хочу добавить 10 секунд. Команда, чтобы сделать это, появилась здесь .

Проиллюстрировать:

STARTIME="$(date +"%T")" ENDTIME="$STARTIME today + 10 seconds" CALL="$(echo date -d $ENDTIME +'%H:%M:%S')" 

Проблема, с которой я сталкиваюсь в этом коде, заключается в том, что если я повторяю переменную $CALL , она дает:

 date -d 12:51:19 today + 10 seconds +%H:%M:%S 

Правильная версия этой строки будет выглядеть так:

 date -d "12:48:03 today + 10 seconds" +'%H:%M:%S' 

Но если я закрою имя переменной в кавычках, вот так:

 STARTIME="$(date +"%T")" ENDTIME="$STARTIME today + 10 seconds" CALL="$(echo date -d '$ENDTIME' +'%H:%M:%S')" 

… он интерпретируется как строковый литерал, и если вы его эхо, он дает:

 date -d $ENDTIME +%H:%M:%S 

Так что мне нужно сделать, это вызвать переменную таким образом, чтобы ее значение было заменено на функцию и было завершено с помощью двойных кавычек («), но избегайте того, чтобы имя переменной читалось как буквальная строка. Я очень смущен этим , Я скучаю по Питону!

3 Solutions collect form web for “В bash, как вызвать переменную и обернуть кавычки вокруг ее значения как часть команды, не заставляя имя переменной стать строковым литералом?”

Для полноты вам не нужны все эти (") или окончательные $(echo ...) . Вот упрощенная версия ваших заданий, которые производят тот же эффект:

 STARTIME=$(date +"%T") ENDTIME="$STARTIME today + 10 seconds" CALL="date -d '$ENDTIME' +'%H:%M:%S'" 

Обратите внимание, что вам не нужно указывать при выполнении var = $ (…), но обычно вы используете var = "many words":

 a=$(echo 'a b'); echo "$a" # result: ab 

Внутри (") a (') не имеет особого значения, и наоборот, например:

 a="that's nice"; echo "$a" # result: that's nice a='that "is nice'; echo "$a" # result: that "is nice 

Вы можете изменить свой оператор вызова следующим образом:

 CALL="$(echo date -d \"$ENDTIME\" +\'%H:%M:%S\')" 

\ Можно использовать для удаления символов " и ' . Теперь echo $CALL будет выводиться как:

 date -d "22:46:37 today + 10 seconds" +'%H:%M:%S' 

Поместите одинарные кавычки в свою двойную ENDTIME , например:

 ENDTIME="'$STARTIME today + 10 seconds'" CALL="$(echo date -d "$ENDTIME" +'%H:%M:%S')" 

Он должен дать

 date -d '19:35:28 today + 10 seconds' +%H:%M:%S 
  • Сценарий Bash с `set -e` не останавливается на команде` ... && ... `
  • В чем разница между запуском программы в качестве демона и разворачиванием ее в фоновом режиме с помощью «&»?
  • Найти с помощью mkdir и подстроки
  • Регулярное изменение / оператор (foo | bar) в GNU или BSD Sed
  • grep переменная в выражении if
  • Выполнить две команды по одному аргументу
  • Игнорировать специальные символы в сравнении с сценарием оболочки
  • Sudo выполнить сценарий оболочки по-разному по сравнению с прямым пользователем выполнить его
  • Многопоточная обработка / многопоточность в BASH
  • В чем разница между '* .txt' и * .txt?
  • Автозаполнение и раскраска не работают, при использовании ssh в оболочке emacs
  • Linux и Unix - лучшая ОС в мире.