Страница 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
Налицо закономерность или на лице

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 )