Как объединить арифметику bash с выходом команды?

Предположим, у вас есть две команды:

Первая команда

let foo=2+2 echo $foo 4 

Вторая команда

 date "%s" 1377107324 

Как бы вы их объединили?


Попытка 1.

 echo The epoch time is: `date +%s` in 100 seconds the time \ will be: `let future={date +%s}+100` $future 

Попытка 2.

 echo The epoch time is: `date +%s` in 100 seconds the time \ will be: `let future=(date +%s)+100` $future 

Плюс около 30 других подобных попыток

3 Solutions collect form web for “Как объединить арифметику bash с выходом команды?”

Это важная причина использовать $( ) вместо ` ` (см., В чем разница между $ (stuff) и `stuff`? )

Если вы так ее вложите, вам даже не нужно let или переменную:

 $ echo $(date +%s) " " $(( $(date +%s)+100 )) 1377110185 1377110285 

Вам нужно добавить $ перед скобкой, а также экспортировать $future :

 $ echo The epoch time is: `date +%s` in 100 seconds the time will be: \ `let future=$(date +%s)+100; export future` $future The epoch time is: 1377110177 in 100 seconds the time will be: 1377110252 

Переменные не разделяются между экземплярами bash. Каждый раз, когда вы запускаете команду $() (или backticks), любые переменные, определенные внутри нее, не будут доступны родительской оболочке:

 $ foo=$(echo 12); $ echo $foo 12 $ foo=(echo 12; foo=0) $ echo $foo $ echo $foo 12 

Как вы можете видеть, хотя вы устанавливаете foo в 0 в подголовке $() , это значение не экспортируется в родительскую оболочку.

Объявите переменные, экспортируйте их, а затем используйте их по своему усмотрению:

 date=$( date +%s ) future=$(( $date + 100 )) echo "The epoch time is: $date in 100 seconds time will be: $future" 

который дает:

The epoch time is: 1377110185 in 100 seconds time will be: 1377110285

И вы можете продолжать использовать эти значения:

 echo "which is the same as $(( $date + 100 ))" 

который дает:

which is the same as 1377110285

Обратите внимание: если они находятся в скрипте, их не нужно экспортировать, только в командной строке вам нужно экспортировать их для использования в последующих командах.

Или вы можете оставить переменные из всех:

 echo "The epoch time is: $(date +%s) in 100 seconds the time will be: $(( $(date +%s)+100 ))" 

Обратите внимание, что “ date +% s \ и $( date +%s ) в значительной степени похожи, но это еще одна тема, наиболее подходящая в этом ответе

  • Как получить прошедшее время из двух «текстовых» дат
  • Команда отображения даты
  • Преобразование даты в оболочке bash
  • Как установить время и дату из Интернета?
  • Измените только год на выходе команды «date»
  • Я пытаюсь скомпилировать alsa-driver-RTv5.18, но получить дату-время ошибки для gcc 4.9.2
  • Как разбирать строку, например 20170202, до даты в сценарии bash?
  • Простой способ найти количество секунд между двумя (нестандартными) форматами даты?
  • linux redhat + изменить время с UTC по GMT + X
  • Сценарий, чтобы сравнить дату работы с сегодняшней датой и выводить только сегодняшние неудачи
  • вырезать фрагмент файла в зависимости от времени написания строк
  • Как я могу получить относительную дату на основе относительной даты командой linux date?
  • Linux и Unix - лучшая ОС в мире.