Как объединить арифметику 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 других подобных попыток

  • Как сравнить две даты в оболочке?
  • Почему временная метка syslog не включает год?
  • Как получить вчерашнюю дату и сохранить в одной переменной
  • Создайте каталог с сегодняшней датой и переместите в него файлы
  • Как настроить busybox, чтобы пользователь, не являющийся пользователем root, устанавливал дату?
  • Как узнать последнее воскресенье месяца
  • Каков рекомендуемый способ синхронизации времени с помощью NTP?
  • Как указать формат даты для функции
  • 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 ) в значительной степени похожи, но это еще одна тема, наиболее подходящая в этом ответе

    Linux и Unix - лучшая ОС в мире.