чтение файла и последующая запись в переменную в том же файле

#shell

#оболочка

Вопрос:

У меня есть файл, в котором указано несколько параметров, таких как load_start_date, load_end_date и т.д. как показано ниже. У меня также есть переменная в том же файле с именем part_date.

 load_start_date=2016-10-03
load_end_date=2016-10-03

part_date=
 

Теперь я намерен прочитать файл (в частности, прочитать параметр load_start_date), вычесть 1 день (т. Е. Для этого примера это будет 2016-10-02), а затем преобразовать формат в ГГГГММДД (например, 20161003) сохранить сохранить значение для переменной part_date, как показано ниже.

 load_start_date=2016-10-03
load_end_date=2016-10-03

part_date=20161002
 

насколько легко это может быть достигнуто?

Ответ №1:

Я предлагаю воспользоваться тем фактом, что строки в вашем файле хорошо подходят для назначения:

 #!/bin/bash -
{
  source file.txt
  if test "$load_start_date" != ""; then
    part_date=$(date -d "$load_start_date - 1 day" " %Y%m%d")

    sed -i -e "s/^part_date=.*/part_date=$part_date/" file.txt
  fi
}
 

source Команда выполняет вычисление file.txt в текущем контексте, т.Е. Создает переменные $load_start_date , $load_end_date , и $part_date . Это было бы немного небезопасно, если бы мы не использовали выражение подоболочки (фигурные скобки), которое создает специальную область видимости для блока кода.

Затем мы просто присваиваем $load_start_date переменной дату до $part_date , затем заменяем соответствующую строку в исходном файле с помощью sed .

Ответ №2:

Используйте date команду в вашем скрипте:

 part_date=$(date -d @$(($(date -d $load_start_date  %s) - 24*60*60))  %Y%m%d)
 

Это преобразует начальную дату в секунды и вычтет 1 день из этого значения, затем снова напечатает в формате ГГГГММДД.

Ответ №3:

Если я понимаю ваш вопрос, и у вас есть файл, file.txt содержащий:

 load_start_date=2016-10-03
load_end_date=2016-10-03
 

и ваша цель — прочитать (или исходный код) этот файл и установить переменную part_date на один день меньше, чем показано в load_start_date - удаленным), тогда в дополнение к date подходу вы можете просто использовать подстановку параметров POSIX и арифметику. Например:

 #!/bin/sh

[ -f "dat/lsd.txt" ] amp;amp; . file.txt          ## source file in script

test -n "$load_start_date" || exit 1        ## validate load_start_date

# part_date=$((${load_start_date//-/} - 1))   ## if your shell supports
                                              ## parameter substitution

part_date="${load_start_date%%-*}"          ## otherwise, us POSIX
tmp="${load_start_date#*-}"                 ## parameter expansion
part_date="${part_date}${tmp%-*}"
part_date="${part_date}${load_start_date##*-}"

part_date=$((part_date - 1))                ## subtract 1

printf "part_date : %sn" "$part_date"
 

(примечание: если ваша оболочка поддерживает замену параметров, вы можете сократить четыре строки, используемые для выделения даты без '-' даты, до одной строки, показанной в комментарии выше)

После '-' удаления у вас есть простое целое число (например 20161003 ), и простая арифметика — это все, что нужно для уменьшения значения на 1.

Пример использования / вывода

 part_date : 20161002
 

Есть много способов, которыми вы можете подойти к этому. Просмотрите все ответы и посмотрите, какой из них лучше всего соответствует вашим потребностям.