Страница 1 из 1

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

Добавлено: 2009-01-15 1:05:03
Dron

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

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 показывают значения как нивчем небывало...
Чего ему надо-то? :)

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

Добавлено: 2009-01-15 1:10:42
paradox
а какой смысл той переменной?
можно все что ниже вынести сразу в if

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

Добавлено: 2009-01-15 1:16:03
Dron
а смысл такой, что первый список получается каталоги пользователей в папке /home
второй список логины пользователей из ldap
берется первый элемент первого списка и сравнивается с каждым из элементов второго списка...
если есть совпадение, то пользователь есть в системе и с каталогом ничего делать ненадо...
если нет, то чего-то делаем...
так как несовпадений может быть несколько до совпадения, то пишем признак наличия в системе в переменную, а потом на основании значения переменной после полного перебора принимаем решение...
вот такая логика...

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

Добавлено: 2009-01-15 1:24:34
paradox
else to_delete=0; return; echo $to_delete;
хм
ретурн? или брек?

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

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

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

Добавлено: 2009-01-15 1:39:46
Dron
поставил 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'

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

Добавлено: 2009-01-15 11:37:27
Dron
провел такие тесты...

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

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:

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

Добавлено: 2009-01-15 12:28:36
Dron
по совету знакомого выкрутился так

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

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}'`

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

Добавлено: 2009-01-15 12:30:17
XoRe
А ещё знакомый советует формировать временные файлы, отсортировать их и сделать diff )