URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8290
[ Назад ]

Исходное сообщение
"Нужна помощ в отладке bash-скрипта"

Отправлено Kagato , 02-Июн-09 12:43 
Нужна помощ в отладке 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


Содержание

Сообщения в этом обсуждении
"Нужна помощ в отладке bash-скрипта"
Отправлено Andrey Mitrofanov , 02-Июн-09 13:20 
>line 63: неожиданный EOF при поиске соответствующего `"'
>line 71: ошибка синтаксиса: неожиданный конец файла
>
>  if ["$n" -eq "$str2"]

Отделить [ и ] пробелами?...

>    70  exit 0


"Нужна помощ в отладке bash-скрипта"
Отправлено Kagato , 02-Июн-09 14:34 
>>line 63: неожиданный EOF при поиске соответствующего `"'
>>line 71: ошибка синтаксиса: неожиданный конец файла
>>
>>  if ["$n" -eq "$str2"]
>
>Отделить [ и ] пробелами?...
>
>>    70  exit 0

исправил, ошибки остались :(


"Нужна помощ в отладке bash-скрипта"
Отправлено Arpo , 02-Июн-09 16:14 
>>>line 63: неожиданный EOF при поиске соответствующего `"'
>>>line 71: ошибка синтаксиса: неожиданный конец файла
>>>
>>>  if ["$n" -eq "$str2"]
>>
>>Отделить [ и ] пробелами?...
>>
>>>    70  exit 0
>
>исправил, ошибки остались :(

Не знаю, но мне эта сточка не нравится, смотрю с телефона поетому проверить нет варианта.
Думаю:
let n=n+1 ->  let n=$n+1
Или может
let n++

Доеду домой проверю...


"Нужна помощ в отладке bash-скрипта"
Отправлено Arpo , 02-Июн-09 16:20 

Да и тут нет ковычки после  "$td
if [ "$td -eq "$str1" ] > if [ "$td" -eq "$str1" ]


"Нужна помощ в отладке bash-скрипта"
Отправлено Kagato , 02-Июн-09 16:45 
>
>Да и тут нет ковычки после  "$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


"Нужна помощ в отладке bash-скрипта"
Отправлено Kagato , 03-Июн-09 12:38 
Всё, доделал. Спасибо всем кто указал мне на ошибки :)

Для истории. Не удалось победить проблему с 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
fi

for ((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 udalenie

        then
##############################################################################################
                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