Bash (Проблемы, проблемки и вопросы.)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Bash

Сообщение Naruto-kun »

Есть скрипт. В нём есть цикл while, в котором происходит набор действий, среди них: из определённого файла выдирается значение переменной. По выходу из цикла эта переменая и её значение не видны. Попробовал объявить её перед while, приравняв к нулю. Но результат практически не изменился, теперь он просто после выхода из while, видит только то значение, которая переменная получила перед этим циклом.
Что больше всего для меня странно, дык это то что, я сделал маленький скрипт, с кучей вложенных циклов и форов, и в самом последнем объявил переменную присвоив ей какое-то значение. После выхода из всех этих вложенных циклов, переменная и её значения были видны.
Подскажите в чём может быть проблема. :blush:
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
pattern
Сообщения: 4
ОС: PCBSD 7

Re: Bash

Сообщение pattern »

Naruto-kun писал(а):
13.01.2009 17:00
[..::поSKIPано::..]среди них: из определённого файла выдирается значение переменной[..::поSKIPано::..]

покажи пример каким образом выдираешь данные. ИМХО что то не верно делаешь именно тут, если переменной не присваивается новое значение.
Или самая банальная ошибка - выполнение скрипта не заходит в тело этого цикла
Your bunny wrote: its not a bug, this is a feature, actually...
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Как и просили, вот часть скрипта, где выдирается нужное мне значение:

Код: Выделить всё

cat $MST_FILE | while read line; do
    rec_type=`echo ${line:0:3}`

    if   [ "$rec_type" -eq "000" ]; then
        fileHeaderLine=$line;
        dtfile=`echo ${line:13:10}`
                echo "dtfile=$dtfile"
             ....................

PS. внутри while всё норм. Сделал даже вывод для проверки, значение выдирается верное и записывется в переменную, но только в цикле видно. В цикл он точно попадает и также точно выходит из него. С переменнной в самом цикле кроме вот этого момента больше на работаю.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Bash

Сообщение Portnov »

Не так давно эта тема всплывала. Дело в том, что код внутри while выполняется в sub-shell, и переменные из неё наружу не передаются.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Хмм, ясно. Странно, только, почему же маленький мой тестовый скрипт, нормально работает и переменные все видятся после выхода из while?
Вот сам тестовый скрипт:

Код: Выделить всё

#!/bin/bash
i=0
while [ "$i" -ne "1" ];do
    if [ "$i" -eq "0" ];then
        a=10
    fi
    let "i+=1"

done
echo "a=$a"


PS. Нет совсем способов обхода этой проблемы? Или всё таки всё переделывать и заменять while на что-то другое.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Bash

Сообщение SLEDopit »

Naruto-kun писал(а):
13.01.2009 17:39
PS. Нет совсем способов обхода этой проблемы? Или всё таки всё переделывать и заменять while на что-то другое.
здесь пункт 7
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Насколько я понял, в моём случае тогда будет?

Код: Выделить всё

cat /etc/passwd | (
cat $MST_FILE | while read line; do
    rec_type=`echo ${line:0:3}`

    if   [ "$rec_type" -eq "000" ]; then
        fileHeaderLine=$line;
        dtfile=`echo ${line:13:10}`
                echo "dtfile=$dtfile"
        dtfile=$((dtfile))
             ....................
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Bash

Сообщение Ленивая Бестолочь »

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

upd:
пардоньте, ступил, уже сам сомневаюсь, ушел проверять :)
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Видимо я совсем дурак, но что-то никак не у меня не получается сделать по примеру свою задачу.
UP Всем спасибо, всё таки проблему решил, пример очень помог. Вот конечный итог:

Код: Выделить всё

count1=
count2=
while read line; do
    type=`echo ${line:0:3}`
    if   [ "$rec_type" = "000" ]; then
        count1=`echo ${line:13:10}`
    elif [ "$rec_type" = "011" ]; then
                ....................................
                let "count2+=1"
        fi
done < $work_file
echo "Count1 = $count1"
echo "Count2 = $count2"
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Bash

Сообщение SLEDopit »

Naruto-kun писал(а):
14.01.2009 14:46
Видимо я совсем дурак, но что-то никак не у меня не получается сделать по примеру свою задачу.
ну зачем же сразу так жестко :)
вот только в предоставленном вами скрипте зачем вам cat /etc/passwd - непонятно. в примере то он использовался, потому что целью примера было - подчсет строк в этом файле и вывод значения после цикла. т.е. у вас это лишнее. основная идея - взятие цикла в скобки, чтобы он выполнялся в той же оболочке. и все что внутри этих скобок будет выполняться как бы на одном уровне, без всяких сабшелов (ну это как я понял).
т.е. например скрипт

Код: Выделить всё

#!/bin/bash
i=before_subshell
j=before_subshell
(
i=0
while [ "$i" -lt 3 ]
do
        j=0
        while [ "$j" -lt "5" ]
        do
        ((j++))
        done
        echo j_after_while_in_sub=$j
((i++))
done;
echo i_after_while_in_sub=$i
echo j_after_2while_in_sub=$j)
echo j_after_sub=$j
echo i_after_sub=$i
выдаст нам такой результат:

Код: Выделить всё

[15:24]deb:~/pr $ ./1.sh
j_after_while_in_sub=5
j_after_while_in_sub=5
j_after_while_in_sub=5
i_after_while_in_sub=3
j_after_2while_in_sub=5
j_after_sub=before_subshell
i_after_sub=before_subshell
как мы видим значение за предела созданного скобками шелла не распротраняются. однако внутри него доступны вне зависимости от вложенности.
зы че то я долго ответ писал :)
ззы и наверно коряво получилось :)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Да, это уже я вроде как понял. У меня идёт работа с моим файлом, поэтому у меня вместо /etc/passwd , имя моего файла.
UP
Решил тему новую не создавать по своей новой проблеме, а отписаться прямо здесь.
Необходимо использовать pl/sql в баше. Вот один из примеров.

Код: Выделить всё

        QUERY=`sqlplus -s "$LOGIN/$PASS" >${LST} 2>&1 <<EOF
        SET ECHO off
        SET HEADING off
        SET PAGESIZ 0
        SET LINESIZE 300
        SET FEED off
        SELECT EqCod, NumDog
        FROM PETROCARD.XXEQUIP
        WHERE (EqCod='$eqcod')
        AND (bik1=$BIK);
        EXIT;
EOF`

У меня пока запись результата идёт в файл, а оттуда я уже выдираю результаты запроса и распихиваю по переменным. Можно ли как то сразу распихивать результат по переменным, без использования записи в файл, выдирания и распихивания? Просто у меня периодически из-за того, что в результате запроса выдаётся все значения, каких-то например в базе нету, соовтвественно структура файла меняется. Сколько не мудрил с cut и sed, а всё равно получается периодески фигня.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Проблему решил, но пока всё работает как и раньше: Выполнение запроса, результат запроса записывается в файл, оттуда вытягиваются значения в переменные. Но всё равно хотелось бы узнать можно ли это реализовать без файлов, записывая сразу в переменные.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Ещё одна проблемка, я её обошёл, но теперь интересно, для общего развития так сказать, почему же в одном случае всё работает отлично, в другом - нет. Например: есть файл, в нём только есть одна строка: "44030809 2000 A"
Если запустить такой скрипт:

Код: Выделить всё

#!/bin/bash
x=`cat FileName`
a=`echo $x | cut -d " " -f1`
b=`echo $x | cut -d " " -f2`
c=`echo $x | cut -d " " -f3`
echo "a=$a"
echo "b=$b"
echo "c=$c"

На выводе тогда будет так, как мне и нужно:

Код: Выделить всё

a=44030809
b=2000
c=A

А если запустить так:

Код: Выделить всё

#!/bin/bash
x=`cat FileName`
a=`cat FileName | cut -d " " -f1`
b=`cat FileName | cut -d " " -f2`
c=`cat FileName | cut -d " " -f3`
echo "a=$a"
echo "b=$b"
echo "c=$c"

На выводе уже будет вот так:

Код: Выделить всё

a=
b=
c=44030809

Вот интересно, а почему так происходит?
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Bash

Сообщение SLEDopit »

не понял, про что толкуем?)

Код: Выделить всё

[17:31]deb:~/pr $ echo 44030809 2000 A > FileName
[17:31]deb:~/pr $ echo '#!/bin/bash
> x=`cat FileName`
> a=`echo $x | cut -d " " -f1`
> b=`echo $x | cut -d " " -f2`
> c=`echo $x | cut -d " " -f3`
> echo "a=$a"
> echo "b=$b"
> echo "c=$c"'> script.sh
[17:31]deb:~/pr $ chmod +x script.sh
[17:32]deb:~/pr $ ./script.sh
a=44030809
b=2000
c=A
[17:32]deb:~/pr $ echo '#!/bin/bash
> x=`cat FileName`
> a=`cat FileName | cut -d " " -f1`
> b=`cat FileName | cut -d " " -f2`
> c=`cat FileName | cut -d " " -f3`
> echo "a=$a"
> echo "b=$b"
> echo "c=$c"'>script2.sh
[17:33]deb:~/pr $ chmod +x script2.sh
[17:33]deb:~/pr $ ./script2.sh
a=44030809
b=2000
c=A
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Хмм, странно, у меня происходит, именно так, как описал выше. Пойду ещё раз перепроверю.
UP Видимо, как всегда плохо уточнил по поводу строки в файле.
Вот её точная конструкция: "два_пробела44030809девять_пробелов2000один_пробелA"
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Bash

Сообщение Portnov »

Ну тогда ясно. cut не умеет объединять несколько подряд идущих разделителей в один. Т.е. cut -d" ", получив на входе три пробела, поймёт это как 3 пустых поля. Можно использовать `awk -F" " {print $1}` - awk умеет объединять разделители в один.

А echo воспринимает всё, что ему передают в ком.строке, как отдельные аргументы, и не знает, сколько между ними пробелов, и при печати ставит один. Т.е. "echo Aтри_пробелаBдва_пробелаC" выведет "Aодин_пробелBодин_пробелC". Поэтому cut благополучно понимает вывод echo. Можно всё, передаваемое echo, брать в кавычки - тогда оно воспримется как один аргумент, и будет выведено как есть.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Ещё раз спасибо за объяснение.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Возник ещё один вопрос, может кто подскажет. Есть скрипт, ему подаётся на вход две даты в формате : ДД.ММ.ГГ. Хочется вычислить разницу дат в количестве дней между ними. Нашёл как это делается здесь: http://www.opennet.ru/docs/RUS/bash_script...tml#DAYSBETWEEN (Пример A-8. days-between: Подсчет числа дней между двумя датами). Но здесь слишком много операций, для вычесления числа дней. Можно ли как-то это сделать за меньшее число операций?
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Сделал пока как было в примере Advansed Bash Guide. Но по прежнему интересует возможность вычислить разницу двух дат в количестве дней по другому, в идеале за меньшее количество операций.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Как таковая задача у меня сейчас: Берём текущую дату сравниваем с другой датой, если разница между ними год или больше то выполняются какие-то действия. Нашёл такой вариант вычесления разницы дат. Беру текущую дату вычитаю из неё 365 дней. Сравниваю с другой датой. Пока инетересует верное получение даты минус 365 дней. Сравнение будет сделать уже на так трудно, я думаю. Вот пока нашёл вариант вычесления даты минус 365 дней:

Код: Выделить всё

date=`TZ=CST+$HS date +%d.%m.%y`
echo "CST: $date"

Где HS- кол-во часов (у меня 24 * 365 (кол-во дней в году) ). Но это работает пока только для 6 дней или меньше. Если взять кол-во часов, большее 6 дней, он выдаёт туже дату.
UP Сразу хочу сказать у меня на работе не работает: date -d. Со всем остальным всё вроде бы в порядке.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Bash

Сообщение SLEDopit »

странно что -d не работает...
а если даты вручную перевести в unix datestamp?
отдельно сутки*24*3600, (месяц-1)*30*24*3600, (год-1)*365*24*3600, а потом сравнивать разницу с 365*3600 и делать выводы. тут правда погрешность будет, зато операций - гораздо меньше. или точность критична?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

странно что -d не работает...

Сам удивляюсь, если бы работала, было бы всё проще.
а если даты вручную перевести в unix datestamp?
отдельно сутки*24*3600, (месяц-1)*30*24*3600, (год-1)*365*24*3600, а потом сравнивать разницу с 365*3600 и делать выводы. тут правда погрешность будет, зато операций - гораздо меньше. или точность критична?

Попробую. Насчёт критичности не уверен, надо поговорить с руководством.
Вот только непонятно, почему (месяц-1). А если, например, месяц первый - Январь, тогда будет ноль.
И ещё одно уточнение, даты подаются в формате: ДД.ММ.ГГ
PS Если у кого-то возникнут другие варианты решения, буду только рад.
PSs Ещё кое-что, как перейти от года в форматке ГГ в определённой дате, к виду ГГГГ? С учётом того, что не работает date -d.

UP Тут возник маленький вопрос ещё один. Как правильно выполнить следующее действие: Выделить из строки часть и сразу же выполнить с ней арифметическую операцию. Пробовал так:

Код: Выделить всё

a=`expr `echo $line | cut -f1 -d'разделитель'` + N`

При попытке выполнить это действие, выдаётся ошибка. Не могу что-то сообразить, как верно будет выглядеть такое действие.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4463
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Bash

Сообщение Rootlexx »

Naruto-kun писал(а):
21.01.2009 15:28
Тут возник маленький вопрос ещё один. Как правильно выполнить следующее действие: Выделить из строки часть и сразу же выполнить с ней арифметическую операцию. Пробовал так:

Код: Выделить всё

a=`expr `echo $line | cut -f1 -d'разделитель'` + N`

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

Не надо пользоваться кавычками («`»). Левая и правая части такого выражения идентичны, отчего при вложенности операторов нельзя однозначно определить, где начало, а где конец выражения. Используйте «$()».
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Bash

Сообщение SLEDopit »

Naruto-kun писал(а):
21.01.2009 15:28
Вот только непонятно, почему (месяц-1). А если, например, месяц первый - Январь, тогда будет ноль.
потому что 01.01.99 - на эту дату пройдет 0 целых месяцев и 98 лет, а не 1 месяц и 99 лет. дни по хорошему тоже можно минусовать.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Всё таки смог узнать у началсьтва, что им нужно, всё-таки точность критична. Но в тоже время кол-во операций на вычисление разницы дат, не должно быть большим, таким как в примере Advance Bash Guide.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Bash

Сообщение SLEDopit »

SLEDopit писал(а):
20.01.2009 20:50
странно что -d не работает...
а там не на фре все случаем крутится?
Naruto-kun писал(а):
26.01.2009 16:06
Всё таки смог узнать у началсьтва, что им нужно, всё-таки точность критична. Но в тоже время кол-во операций на вычисление разницы дат, не должно быть большим, таким как в примере Advance Bash Guide.
ну тогда как насчет перла?
что нить типа:

Код: Выделить всё

#!/usr/bin/perl
use POSIX;
($sec,$min,$hour,$mday,$mon,$year,$wday)=(1,0,0,1,3-1,2009-1900,8);
$timestamp = mktime($sec,$min,$hour,$mday,$mon,$year,$wday,0,-1);
print ($timestamp);
print("\n");

зы а вообще вы бы сказали, что в принципе хотите сделать.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

а там не на фре все случаем крутится?

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

К сожалению в задании чётко указано использовать только баш, пёрл использовать нельзя. ((
PS. Вообще в целом скрипт будет заниматься взиманием комиссии за второй год обслуживания банковских пластиковых карт.

а там не на фре все случаем крутится?

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

К сожалению в задании чётко указано использовать только баш, пёрл использовать нельзя. ((
PS. Вообще в целом скрипт будет заниматься взиманием комиссии за второй год обслуживания банковских пластиковых карт.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Bash

Сообщение SLEDopit »

я тут так подумал. а что если дату представлять в виде yyyymmdd и просто считать разницу?
например 20090201-20080201 даст разницу 10000 - т.е. ровно год. все что меньше года в любом случае будет меньше этого числа. все что больше - больше. ну и исходя из этого сравнивать.
в виде скрипта это будет что то типа:

Код: Выделить всё

cur=`echo 20$(date +%y%m%d)`
for i in `cat data` #где data - файл с датами записанными в виде дд.мм.гг (согласно вашему посту раньше)
do
srav=20`echo $i|awk -F"." '{print $3 $2 $1}'` #20 ставится для того, чтобы баш не ругался что ворочаем цифрами, начинающимися с 0
if [ $(($cur-$srav)) -lt 10001 ]
then
        echo Year hasn\'t passed yet
else
        echo Year has already passed
fi
done
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Naruto-kun
Сообщения: 228
Статус: небритый гентушник
ОС: Gentoo(PC)/easypeasy(Netbook)

Re: Bash

Сообщение Naruto-kun »

Начальство тут пообщалось, мне было сказано использовать в скрипте pl/sql запросы. С ними вычесление разницы дат всё просто делается:

Код: Выделить всё

ID_SCH=`sqlplus -s "$USR/$PASSW" >${LST1} 2>&1 <<EOF
SET ECHO off
SET HEADING off
SET PAGESIZ 0
SET LINESIZE 300
SET FEED off
SELECT trunc(sysdate) - M.date_start
FROM table M
, dual
WHERE (M.temp=$temp);
EXIT;
EOF`

Может немного и криво, но всё работает как и надо.
PS. Всё равно спасибо за все советы и помощь. Где-нибудь всё равно пригодиться.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Bash

Сообщение Folderx »

Код: Выделить всё

if   [ "$rec_type" -eq "000" ]; then

-eq можно применять только к числам, если у тебя не выдаёт ошибки

Код: Выделить всё

[guest@station ~]$ a="abc";
[guest@station ~]$ if [ "$a" -eq "000" ]; then echo ok; fi;
bash: [: abc: integer expression expected
[guest@station ~]$ if [ "$a" == "000" ]; then echo ok; fi;
[guest@station ~]$ a="000";
[guest@station ~]$ if [ "$a" == "000" ]; then echo ok; fi;
ok
[guest@station ~]$

если туда попадёт текст, при использовании числовых выдаст ошибку, а при строковых нормально
Спасибо сказали: