Получение прошлых дат в HP-UX с помощью ksh

Итак, мне нужно перевести скрипт из хорошей конфигурации linux и bash в ksh в hp-ux. Каждая команда ожидает другой синтаксис, и я хочу убить себя. Но опустим разглагольствования.

Это часть моего сценария

anterior=`date +"%Y%0m" -d '1 month ago'`

В основном мне нужно получить прошлую дату в формате 201002. Не говоря уже о том, что в новой среде% 0m означает «без нулей», а на самом деле в другом это означает «да, пожалуйста, поместите этот ноль в мою строку» . Он даже не принимает «1 месяц назад». Я читал дату человека для HP-UX, и кажется, что вы просто не можете выполнять с ней арифметические операции с датами.

Я искал некоторое время, но все, что я нашел, это длинные решения. Я не совсем понимаю, что такая типичная административная задача, как добавление дат, требует такой суеты. Нет ли способа преобразовать мой однострочник в, ну, я не знаю, другой? Да ладно, я видел предлагаемые решения, которые использовали bc, имели тридцать с лишним строк и магическое число по всему сценарию. Самые простые решения, кажется, используют perl... но я не знаю, как их модифицировать, так как они довольно загадочны.

Спасибо!


person AticusFinch    schedule 12.03.2010    source источник


Ответы (3)


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

year=`date +%Y`
month=`date +%m`
anterior=`awk -vm="$month" -vyr="$year" 'BEGIN{
  mth["01"]="12"; mth["02"]="01"
  mth["03"]="02"; mth["04"]="03"
  mth["05"]="04"; mth["06"]="05"
  mth["07"]="06"; mth["08"]="07"
  mth["09"]="08"; mth["10"]="09"
  mth["11"]="10"; mth["12"]="11"
  if ( m=="01") { yr-- }
  print yr mth[m]
}' `
echo $anterior

Но обратите внимание, что это просто и служит для производства только за предыдущий 1 месяц. Вы также можете попробовать скрипт ksh здесь

person ghostdog74    schedule 12.03.2010

Я знаю, что это старая тема, но у меня была такая же проблема, и это было решением

Создайте сценарий оболочки, например, last_month.sh

year=`date +%Y`
month=`date +%m`

month=`expr $month - 1`

if [ $month -eq 0 ]; then
   month=12
   year=`expr $year - 1`
fi

if [ $month -lt 10 ] then
   month="0$month"
fi

echo $year$month
exit 0

затем вы можете вызвать скрипт и присвоить переменной

./last_month.sh | read anterior
echo $anterior

здесь возвращает последний месяц, но вы можете легко изменить его, чтобы принять параметры

person NioZero    schedule 31.08.2016

Это решение, к которому я пришел (предупреждение: я работаю на клиенте с драконовскими мерами безопасности, поэтому у меня даже нет возможности его протестировать, мне нужно отправить свои сценарии системному администратору, чтобы проверить их и отладить через его).

typeset -Z2 lastmonth
month=`date +%m`
year=`date +%Y`

lastmonth=$((month-1))
if (( month == 1));then
lastmonth=12
year=$((year-1))
fi

Во всяком случае, мне кажется, что нет более простого способа сделать это.

person AticusFinch    schedule 12.03.2010