LINUX.ORG.RU

работа с массивами BASH

 , ,


1

1

Доброго времени суток!

Есть таск: скрипт проверяет в файле строку, если она удовлетворяет всем требованиям, то выполняет команды, беря переменные из первой строки файла. Мне надо, чтобы скрипт проверял каждую строку в файле и если строка соответствует, то выполнял с ней действия. Пример :

script.sh

! /bin/bash

set -- $(</home/main/in/*)
if [ `ls /home/main/in/* | wc -l` -eq 0 ]
then
 echo "Empty"
else
  while IFS= read -r line || [[ -n $line ]]
  do

ssi_vpn=($1 $2 $3 $7)
USER=${ssi_vpn[0]%@[^@]*}
 if [ "${ssi_vpn[2]}" = "VPN/Cloud" ]
 then
   if [ "${ssi_vpn[4]}" = "null_cl" ]
   then
   exit
   else
  if [ "${ssi_vpn[3]}" = "Denmark" ]
  then 
#mv /home/main/in/* /home/main/out/
  echo "UserBD $USER
PasswdBD ${ssi_vpn[1]}
BD ${USER}db
IP 0.0.0.0:00
You most go to link http://0.0.0.0/
${ssi_vpn[3]}" >> /home/main/out/~$USER
  echo "You most go to link https://0.0.0.0/"
  echo "Authorized data see in file /home/main/out/~$USER"
  fi
  fi
 else
 echo "NOT main"
 fi
  done < /home/main/in/*
fi

ssi_vpn.txt

user@gmail.com 4ee8e6747053339e5b58bbaa696eb77c VPN/Cloud 7 1 BY Denmark 15 null_cl 
user1@gmail.com 7abeb0a32d065a6ae0d8577165f99e65 VPN/Cloud 7 1 BY Germany 17 null_cl 
user2@gmail.com c89571f808d63f92501d9a21226720d0 VPN 7 1 BY Germany 7 null_cl 
user3@gmail.com 4ee8e6747053339e5b58bbaa696eb77c VPN/Cloud 7 1 BY Germany 15 null_cl 
user4@gmail.com ab42abe3503d4f6cea53517fa6b9f802 VPN 7 1 BY Germany 41 null_cl 


Последнее исправление: dumasti (всего исправлений: 1)

У вас код попердолило. Используйте markdown при оформлении.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)

Этот скрипт отрабатывает без

while IFS= read -r line || [[ -n $line ]]
  do

done

но он обрабатывает только первую строку.

dumasti
() автор топика

Если использую

 while IFS= read -r line
        do

done

он отрабатывает столько раз, сколько строк в файле ssi_vpn.txt но переменные берет всегда только из первой строки.

dumasti
() автор топика
Ответ на: комментарий от dumasti

он отрабатывает столько раз, сколько строк в файле ssi_vpn.txt но переменные берет всегда только из первой строки.

Так у вас в скрипте читается стоки в line, но переменные берутся всегда одни и те же из массива, а не из line.

vodz ★★★★★
()

Пока меня не опередили, спрошу, нафига это делать на баше, когда можно взять питон?

beaver
()
Ответ на: комментарий от beaver

Таково желание свыше и тут я уже ничего не могу поделать.

dumasti
() автор топика
Ответ на: комментарий от dumasti

Да, это я знаю, как это исправить?

Если б вы это писали, то это было б просто забывчивостью - забыли переинициализировать массив. Если не вы писали, то тут не исправлять надо, код этот ваш хитровывернутый и вы его «исправить» не сможете.

vodz ★★★★★
()
Ответ на: комментарий от vodz

в том то все и дело, что я писал, я понял о чем вы, и (уже завтра) попробую переделать … пока сяб за направление)

dumasti
() автор топика
Ответ на: комментарий от dumasti

в том то все и дело, что я писал,

Вы только «правите» чужой код, это же сразу видно. Инициализируете по интересным полям, но индекс в массиве выбираете как-будто имеете все поля. В этом коде массив вообще не нужен, оно только магические индексы создаёт, сразу пишите read -r user password city и так далее, что там у вас зашифровано и с этими переменными и работайте.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)

Просто оставлю это здесь (исправлен и работает), может кому чем поможет

#! /bin/bash

if [ `ls /home/main/in/ | wc -l` -eq 0 ]
then
 echo "Empty"
else
for ssi_data_file_vpn in /home/main/in/
do
 while IFS=' ' read -r -a ssi_vpn
 do
USER=${ssi_vpn[0]%@[^@]*}
 if [ "${ssi_vpn[2]}" = "VPN/Cloud" ]
 then
   if [ "${ssi_vpn[8]}" = "null_cl" ]
   then
   echo "exist $USER"
   else
  if [ "${ssi_vpn[6]}" = "Germany" ]
  then
  echo "UserBD $USER
PasswdBD ${ssi_vpn[1]}
BD ${USER}db
IP 0.0.0.0:00
You most go to link http://0.0.0.0/
${ssi_vpn[6]}" >> /home/main/out/~$USER
echo "You most go to link https://0.0.0.0/"
echo "Authorized data see in file /home/main/out/~$USER"
  fi
  fi
 else
 echo "NOT main"
 fi
done < /home/main/in/*
done
fi

dumasti
() автор топика
Ответ на: комментарий от dumasti

Просто оставлю это здесь (исправлен и работает), может кому чем поможет

Увы, этот код очень плох и не должен служить образцом для «кому чем поможет». Начиная прямо с первой строки. Да и массивы вы использовали больше похоже на «так стояло в задании у преподавателя». Не важно, как на самом деле, но по коду получается именно так.

vodz ★★★★★
()
Ответ на: комментарий от dumasti

Чем же он плох?

А вы точно прочли предыдущий мой комент до публикации этого «кода»?

vodz ★★★★★
()

проще «разбирать» файл при помощи AWK.

Bootmen ☆☆☆
()
Ответ на: комментарий от anonymous

Ты сам не разобрался, а делаешь вид, что умнее остальных.

Зудит похамить анонимно и бездокательно?

Годный скрипт.

Нет. Доказательства выше ражеваны.

vodz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.