Нужна помощ в отладке bash-скрипта для автоматического добавления/удаления пользователей.
Всю инфу скрипт берёт из файла с разделителем "|".
При запуске скрипт выдаёт ошибки:
line 63: неожиданный EOF при поиске соответствующего `"'
line 71: ошибка синтаксиса: неожиданный конец файлаМожет кто сталкивался с подобным и знает в чём моя ошибка, кроме днк?
Собственно скрипт:
1 #!/bin/bash
2 #
3 #
4 ########environment declaration
5 ufile=/tmp/incom
6 td="" #add or del
7 field= #первое поле
8 ulogin= #user login
9 upass="" #user pass
10 ugroups="" #user groups
11 strnum=1 #nomer stroki poiska
12 str="" #string
13 str1="add" #string1
14 str2="del" #string2
15 dels="" #number of first string of del section
16 filend="" #number of last string
17 uopt="" #option of del sect. that define delete homedir of usr or not
18 n=1 # Счётчик
19 #end of declaration
20 #
21 #Проверка наличия файла
22 if [ -e $ufile ]
23 then
24 dels=`cat /tmp/incom -n|grep "#delete" -i|awk '{print $1}'`
25 filend=`cat /tmp/incom -n|grep end -i|awk '{print $1}'`
26 else
27 echo "File not faund"
28 exit 0
29 fi
30 #
31 echo $dels
32 echo $filend
33 echo $strnum
34 #
35 for field in $(awk 'BEGIN{FS="|"}{print $1}' < "$ufile" )
36 do
37 td=`sed -n '$n p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $1}'`
38 #Проверка на добавление
39 if [ "$td -eq "$str1" ]
40 then
41 # polu4aem dannie uchetki
42 ulogin=`sed -n '$n p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $2}'`
43 ugroups=`sed -n '$n p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $3}'`
44 upass=`sed -n '$n p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $4}'`
45 #тест
46 echo "добавлен пользователь login= $ulogin, group= $ugroups, pass= $upass"
47 #тест
48 useradd "$ulogin" -G "$ugroups" -m -p "$upass" #dobavlaem usera s sozdaniem homedir #Добавляем юзера
49 echo "useradd "$ulogin" -G "$ugroups" -m -p "$upass""
50 fi
51 #
52 if [ $td -eq "$str2" ] #proverka na udalenie
53 then
54 ulogin=`sed -n '$n p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $2}'`
55 uopt=`sed -n '$n p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $3}'`
56 userdel --$uopt $ulogin
57 echo "userdel --$uopt $ulogin"
58 #тест
59 echo "удалён пользователь login= $ulogin, op= $uoupt"
60 #тест
61 fi
62 #
63 if ["$n" -eq "$str2"]
64 then
65 exit 0
66 else
67 let n=n+1
68 fi
69 done
70 exit 0
Файл который он разгребает:
1 #ADD
2 ##ToDo | login | groups |pass
3 #---------------------------------------------------------------------------------
4 add|testovich|users,dialout,dip,video,lpadmin |lolodin
5 add|testova|users,dialout,dip,video,lpadmin |lolodin
6
7 #DELETE
8 ##TODO | Login |remove homdir or not
9 #---------------------------------------------------------------------------------
10
11
12 #TEST
13
14 #End.система:
uname -a:
Linux test-laptop 2.6.28-11-generic #42-Ubuntu SMP Fri Apr 17 01:57:59 UTC 2009 i686 GNU/Linux
>line 63: неожиданный EOF при поиске соответствующего `"'
>line 71: ошибка синтаксиса: неожиданный конец файла
>
> if ["$n" -eq "$str2"]Отделить [ и ] пробелами?...
> 70 exit 0
>>line 63: неожиданный EOF при поиске соответствующего `"'
>>line 71: ошибка синтаксиса: неожиданный конец файла
>>
>> if ["$n" -eq "$str2"]
>
>Отделить [ и ] пробелами?...
>
>> 70 exit 0исправил, ошибки остались :(
>>>line 63: неожиданный EOF при поиске соответствующего `"'
>>>line 71: ошибка синтаксиса: неожиданный конец файла
>>>
>>> if ["$n" -eq "$str2"]
>>
>>Отделить [ и ] пробелами?...
>>
>>> 70 exit 0
>
>исправил, ошибки остались :(Не знаю, но мне эта сточка не нравится, смотрю с телефона поетому проверить нет варианта.
Думаю:
let n=n+1 -> let n=$n+1
Или может
let n++Доеду домой проверю...
Да и тут нет ковычки после "$td
if [ "$td -eq "$str1" ] > if [ "$td" -eq "$str1" ]
>
>Да и тут нет ковычки после "$td
>if [ "$td -eq "$str1" ] > if [ "$td" -eq "$str1" ]Пасиб, это я уже поправил, сейчас это всё выглядит так, отрабатывает без ошибок, но вывод тестовых значений пустой:
1 #!/bin/bash
2 #
3 #
4 ########environment declaration
5 ufile=/tmp/incom
6 td="" #add or del
7 field= #первое поле
8 ulogin= #user login
9 upass="" #user pass
10 ugroups="" #user groups
11 strnum=1 #nomer stroki poiska
12 str="" #string
13 str1="add" #string1
14 str2="del" #string2
15 dels="" #number of first string of del section
16 filend="" #number of last string
17 uopt="" #option of del sect. that define delete homedir of usr or not
18 n=1 # Счётчик
19 field=1
20 #end of declaration
21 #
22 #Проверка наличия файла
23 if [ -e $ufile ]
24 then
25 dels=`cat /tmp/incom -n|grep "#delete" -i|awk '{print $1}'`
26 filend=`cat /tmp/incom -n|grep end -i|awk '{print $1}'`
27 else
28 echo "File not faund"
29 exit 0
30 fi
31 #
32 echo $dels
33 echo $filend
34 echo $strnum
35 #for field in $(awk 'BEGIN{FS="|"}{print $1}' < "$ufile" )
36
37
38
39 for ((n=1; n <= filend; n++))
40 do
41 #echo "qwerty"
42 td=`sed -n '/^$n/ p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $1}'`
43 #Проверка на добавление
44 echo $td
45 if [ "$td" == "$str1" ]
46 then
47 # polu4aem dannie uchetki
48 ulogin=`sed -n '/^$n/p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $2}'`
49 ugroups=`sed -n '/^$n/p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $3}'`
50 upass=`sed -n '/^$n/p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $4}'`
51 #тест
52 echo "добавлен пользователь login= $ulogin, group= $ugroups, pass= $upass"
53 #тест
54 useradd "$ulogin" -G "$ugroups" -m -p "$upass" #dobavlaem usera s sozdaniem homedir #Добавляем юзера
55 echo "useradd "$ulogin" -G "$ugroups" -m -p "$upass""
56 fi
57 #
58 if [ "$td" == "$str2" ] #proverka na udalenie
59 then
60 ulogin=`sed -n '/^$n/p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $2}'`
61 uopt=`sed -n '/^$n/p' $ufile| grep add |awk 'BEGIN {FS = "|"};{print $3}'`
62 userdel --$uopt $ulogin
63 echo "userdel --$uopt $ulogin"
64 #тест
65 echo "удалён пользователь login= $ulogin, op= $uoupt"
66 #тест
67 fi
68 done
69 exit
Всё, доделал. Спасибо всем кто указал мне на ошибки :)Для истории. Не удалось победить проблему с sed | awk, пришлось заменить на буферный файл.
Найден вариант использования С-подобного синтаксиса в for, который существенно доставляет =)
Окончательный вид скрипта:
#!/bin/bash
#
#
########environment declaration
ufile=/tmp/incom
td="" #add or del
field= #первое поле
ulogin= #user login
upass="" #user pass
ugroups="" #user groups
strnum=1 #nomer stroki poiska
str="" #string
str1="add" #string1
str2="del" #string2
dels="" #number of first string of del section
filend="" #number of last string
uopt="" #option of del sect. that define delete homedir of usr or not
n=1 # Счётчик
field=1
#end of declaration
#
#Проверка наличия файла
if [ -e $ufile ]
then
dels=`cat /tmp/incom -n|grep "#delete" -i|awk '{print $1}'`
filend=`cat /tmp/incom -n|grep end -i|awk '{print $1}'`
else
echo "File not faund"
exit 0
fifor ((n=1; n <= filend; n++))
do
#echo "qwerty"
sed -n "$n"p "$ufile" | awk "BEGIN {FS = \"|\"};{print \$1}" > /tmp/vrmtmp
td=`cat /tmp/vrmtmp`
#Проверка на добавление
if [ "$td" == "$str1" ]
then
# polu4aem dannie uchetki
##############################################################################################
sed -n "$n"p "$ufile" | awk "BEGIN {FS = \"|\"};{print \$2}" > /tmp/vrmtmp
ulogin=`cat /tmp/vrmtmp`
##############################################################################################
sed -n "$n"p "$ufile" | awk "BEGIN {FS = \"|\"};{print \$3}" > /tmp/vrmtmp
ugroups=`cat /tmp/vrmtmp`
##############################################################################################
sed -n "$n"p "$ufile" | awk "BEGIN {FS = \"|\"};{print \$4}" > /tmp/vrmtmp
upass=`cat /tmp/vrmtmp`
##############################################################################################
#тест
useradd "$ulogin" -G "$ugroups" -m -p "$upass" #dobavlaem usera s sozdaniem homedir #Добавляем юзера
fi
#
if [ "$td" == "$str2" ] #proverka na udaleniethen
##############################################################################################
sed -n "$n"p "$ufile" | awk "BEGIN {FS = \"|\"};{print \$2}" > /tmp/vrmtmp
ulogin=`cat /tmp/vrmtmp`
##############################################################################################
sed -n "$n"p "$ufile" | awk "BEGIN {FS = \"|\"};{print \$3}" > /tmp/vrmtmp
uopt=`cat /tmp/vrmtmp`
##############################################################################################
userdel --$uopt $ulogin
fi
done
rm -f /tmp/vrmtmp
exit