2010-03-12 2 views
0

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

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

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

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

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

Спасибо!

ответ

0

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

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

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

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

1

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

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 месяца. Вы также можете попробовать КШ сценарий here

0

Что бы сделать было бы на самом деле захватить исходный код для date с Linux и скомпилировать его под HP-UX, как betterdate, а затем просто использовать.

Я не использовал HPUX с версии 9, но в то же время он был немного длинным. Большим преимуществом с открытым исходным кодом является то, что вы можете просто перекомпилировать его под целевой платформой.

Теперь этот может не работать из-за несовместимости с API-интерфейсами и такими, но я бы рассматривал это как первую попытку. Работа, которую должен выполнить date, довольно проста с точки зрения того, какие API-интерфейсы ей нужно будет вызывать.

Тогда у вас есть полная мощность Linux date.

+0

Это было бы лучшим решением, особенно для остального мира :), но клиент не примет его. – AticusFinch

+0

Какие _will_ они принимают? Разрешено ли компилировать любой C? Можете ли вы использовать другие «стандартные» инструменты (awk, sed, grep и др.)? Или это _have_, чтобы быть ksh самостоятельно (предположительно дата в порядке)? – paxdiablo

+0

Это должен быть сценарий, не может быть и речи о начале процесса омологации для сторонней программы ... – AticusFinch

1

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

Создать скрипт, например, last_month.ш

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 

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

Смежные вопросы