Получение последних дат в HP-UX с помощью ksh - PullRequest
0 голосов
/ 12 марта 2010

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

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

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

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

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

Спасибо!

Ответы [ 3 ]

1 голос
/ 31 августа 2016

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

Создайте сценарий оболочки, например, 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

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

1 голос
/ 12 марта 2010

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

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 здесь

0 голосов
/ 12 марта 2010

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

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

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

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

...