#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
Есть много способов, которыми вы можете подойти к этому. Просмотрите все ответы и посмотрите, какой из них лучше всего соответствует вашим потребностям.