непонятка с переменной в скрипте на sh

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Dron
ст. сержант
Сообщения: 373
Зарегистрирован: 2007-08-15 13:36:28
Откуда: Днепропетровск
Контактная информация:

непонятка с переменной в скрипте на sh

Непрочитанное сообщение Dron » 2009-01-15 1:05:03

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

apus# uname -a
FreeBSD apus 6.3-STABLE FreeBSD 6.3-STABLE #0: Tue Jun 17 18:07:42 EEST 2008     root@apus:/usr/obj/usr/src/sys/GEN-DR-APUS  amd64
понядобился скрипт для нахождения и выполнения определенных действий над каталогами пользователей, которых уже нет в системе...

наваял...

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

apus# cat delete_dead_souls
#!/bin/sh -x

echo > dirs_to_delete
ls /home | while read dir
    do
        to_delete=0
        ldapsearch -b "ou=People,dc=xxxxx,dc=dp,dc=ua" uid | grep "uid:" | awk '{print $2}' | while read ldp_ac
                do
                        if [ $dir != $ldp_ac ]
                                then to_delete=1; echo $to_delete;
                                else to_delete=0; return; echo $to_delete;
                        fi
                done;
        echo $to_delete;
        if [ $to_delete -eq 1 ]
                then echo $dir >> dirs_to_delete
        fi
    done
непонятка происходит с переменной to_delete
такое впечатление, что внутри первого if она живет сама по себе...
т.е. внутри первого if я вижу, что переменная принимает значение 1, но во втором if оно равно 0
если убрать первое определение to_delete (которое перед ldapsearch), то во втором if вместо $to_delete ничего не подставляется, как буд-то переменная не определена, хотя внутри первого if все echo показывают значения как нивчем небывало...
Чего ему надо-то? :)
Та Да...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: непонятка с переменной в скрипте на sh

Непрочитанное сообщение paradox » 2009-01-15 1:10:42

а какой смысл той переменной?
можно все что ниже вынести сразу в if

Аватара пользователя
Dron
ст. сержант
Сообщения: 373
Зарегистрирован: 2007-08-15 13:36:28
Откуда: Днепропетровск
Контактная информация:

Re: непонятка с переменной в скрипте на sh

Непрочитанное сообщение Dron » 2009-01-15 1:16:03

а смысл такой, что первый список получается каталоги пользователей в папке /home
второй список логины пользователей из ldap
берется первый элемент первого списка и сравнивается с каждым из элементов второго списка...
если есть совпадение, то пользователь есть в системе и с каталогом ничего делать ненадо...
если нет, то чего-то делаем...
так как несовпадений может быть несколько до совпадения, то пишем признак наличия в системе в переменную, а потом на основании значения переменной после полного перебора принимаем решение...
вот такая логика...
Та Да...

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: непонятка с переменной в скрипте на sh

Непрочитанное сообщение paradox » 2009-01-15 1:24:34

else to_delete=0; return; echo $to_delete;
хм
ретурн? или брек?

попробуй определи переменную еще выше

и напомни что такой

Аватара пользователя
Dron
ст. сержант
Сообщения: 373
Зарегистрирован: 2007-08-15 13:36:28
Откуда: Днепропетровск
Контактная информация:

Re: непонятка с переменной в скрипте на sh

Непрочитанное сообщение Dron » 2009-01-15 1:39:46

поставил break
все равно так-же себя ведет...

пробовал определять переменную и до первого while, ведет себя так-же...

sh -x - xtrace Такой себе debug...

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

+ read ldp_ac
+ [ voytova.o != skubko.yu ]
+ to_delete=1
+ echo 1
1
+ read ldp_ac
+ echo 0
0
+ [ 0 -eq 1 ]
+ read dir
пример окончания обработки записи, которой нет в ldap
последняя проверка, логины неравны to_delete присваивается 1 и echo показывает 1
попытка считать следующий элемент второго списка - элемента нет...
echo перед вторым if показывает, что переменная равна 0 :(
соответственно условине не отрабатывает... считываем следующий элемент первого списка...
Та Да...

Гость
проходил мимо

Re: непонятка с переменной в скрипте на sh

Непрочитанное сообщение Гость » 2009-01-15 5:23:19

по-моему это баг. ЕМНИП, sh(1) функции и циклы могут менять глобальные переменные. Почему это действует наполовину в случае циклов…

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

case #1, foo="100":
        simple while() loop

case #2, foo="":
        while() loop with open pipe

case #3, foo="100":
        simple for() loop

case #4, foo="":
        for() loop with open pipe

case #5, foo="100":
        simple function

case #6, foo="100":
        function with open pipe

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

#! /bin/sh

unset foo
while true; do
    foo=100
    break
done

echo case \#1, foo=\"$foo\":
echo -e '\tsimple while() loop'

unset foo
true | while true; do
    foo=100
    break
done

echo
echo case \#2, foo=\"$foo\":
echo -e '\twhile() loop with open pipe'

unset foo
for bar in blah; do
    foo=100
    break
done

echo
echo case \#3, foo=\"$foo\":
echo -e '\tsimple for() loop'

unset foo
true | for bar in blah; do
    foo=100
    break
done

echo
echo case \#4, foo=\"$foo\":
echo -e '\tfor() loop with open pipe'

unset foo
bar() {
    foo=100
}
bar

echo
echo case \#5, foo=\"$foo\":
echo -e '\tsimple function'

unset foo
true | bar() {
    foo=100
}
bar

echo
echo case \#6, foo=\"$foo\":
echo -e '\tfunction with open pipe'

Аватара пользователя
Dron
ст. сержант
Сообщения: 373
Зарегистрирован: 2007-08-15 13:36:28
Откуда: Днепропетровск
Контактная информация:

Re: непонятка с переменной в скрипте на sh

Непрочитанное сообщение Dron » 2009-01-15 11:37:27

провел такие тесты...

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

FreeBSD mini 6.1-STABLE FreeBSD 6.1-STABLE #1: Tue Oct 10 11:24:27 EEST 2006     root@mini:/usr/src/sys/i386/compile/MINI  i386

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

case #1, foo="100":
        simple while() loop

case #2, foo="":
        while() loop with open pipe

case #3, foo="100":
        simple for() loop

case #4, foo="":
        for() loop with open pipe

case #5, foo="100":
        simple function

case #6, foo="100":
        function with open pipe

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

FreeBSD apus 6.3-STABLE FreeBSD 6.3-STABLE #0: Tue Jun 17 18:07:42 EEST 2008     root@apus:/usr/obj/usr/src/sys/GEN-DR-APUS  amd64

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

case #1, foo="100":
        simple while() loop

case #2, foo="":
        while() loop with open pipe

case #3, foo="100":
        simple for() loop

case #4, foo="":
        for() loop with open pipe

case #5, foo="100":
        simple function

case #6, foo="100":
        function with open pipe

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

FreeBSD mail 7.1-RELEASE FreeBSD 7.1-RELEASE #0: Thu Jan  1 08:58:24 UTC 2009     root@driscoll.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64 

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

case #1, foo="100":
        simple while() loop

case #2, foo="":
        while() loop with open pipe

case #3, foo="100":
        simple for() loop

case #4, foo="":
        for() loop with open pipe

case #5, foo="100":
        simple function

case #6, foo="100":
        function with open pipe

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

Linux smoke 2.6.25-gentoo-r6Dr-2 #1 SMP Tue Jul 29 14:02:57 EEST 2008 x86_64 AMD Athlon(tm) 64 X2 Dual Core Processor 4600+ AuthenticAMD GNU/Linux
sh -> bash

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

case #1, foo="100":
        simple while() loop

case #2, foo="":
        while() loop with open pipe

case #3, foo="100":
        simple for() loop

case #4, foo="":
        for() loop with open pipe

case #5, foo="100":
        simple function

case #6, foo="100":
        function with open pipe
Налицо закономерность или на лице :fool:
Та Да...

Аватара пользователя
Dron
ст. сержант
Сообщения: 373
Зарегистрирован: 2007-08-15 13:36:28
Откуда: Днепропетровск
Контактная информация:

Re: непонятка с переменной в скрипте на sh

Непрочитанное сообщение Dron » 2009-01-15 12:28:36

по совету знакомого выкрутился так

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

ldapsearch -b "ou=People,dc=xxxxx,dc=dp,dc=ua" uid | grep "uid:" | awk '{print $2}' | while read ldp_ac
заменил на

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

for ldp_ac in `ldapsearch -b "ou=People,dc=xxxxx,dc=dp,dc=ua" uid | grep "uid:" | awk '{print $2}'`
Та Да...

Аватара пользователя
XoRe
рядовой
Сообщения: 13
Зарегистрирован: 2007-10-15 18:04:04
Откуда: Россия
Контактная информация:

Re: непонятка с переменной в скрипте на sh

Непрочитанное сообщение XoRe » 2009-01-15 12:30:17

А ещё знакомый советует формировать временные файлы, отсортировать их и сделать diff )
<'\/'>