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

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

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

  • В #! / Bin / bash. Команда Unix для получения даты первого дня недели в месяц
  • Как найти файлы к моменту их имени?
  • Command 'date + FORMAT' - Что такое% a,% A,% b и т. Д.?
  • Переименование пучки файлов с датой, измененной меткой времени в конце имени файла?
  • Когда следующий понедельник?
  • Получить дату следующей субботы с определенной даты
  • 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 других подобных попыток

  • Форматирование даты в bash
  • Как установить правильное время на Centos 7?
  • Как скопировать дату, меньшую, чем конкретная дата в файле
  • hg log timezone форматирование
  • Как мне удалось получить такие неожиданные результаты на сегодняшний день?
  • bash - суммирование значения дня к годам, месяцам и левым дням
  • 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 - лучшая ОС в мире.