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

Исходное сообщение
"помогите разобраться плиз, не могу понять скрипт bash "

Отправлено tero , 16-Дек-09 12:04 
Собственно сам скрипт:

#!/bin/bash

#Internal variables
sClient="/usr/local/bin/mysql"
sshClient="/usr/bin/ssh"
workFile="/usr/local/sbin/scripts/fwstate.data"
trafficLog=/var/log/traffic/`date -I`.log
rsaHostKey="/etc/ssh/ssh_host_rsa_key"

#Here we get a remainders of user bills and put them into a log
#Then we restore balance limit, unset block flag and turn on internet for choosen user
while read userIp userStatus
do
   getTraffic="$sClient UTM -B -e \"select ip, bill from users where ip='$userIp'\" --password=\"xxxxxxx\" | sed -e "/ip/d" >> $trafficLog"
   eval $getTraffic

   resetBill="$sClient UTM -B -e \"update users set bill=200 where ip='$userIp'\" --password=\"xxxxxxx\""
   eval $resetBill

   resetBlock="$sClient UTM -B -e \"update users set block='0' where ip='$userIp'\" --password=\"xxxxxxx\""
   eval $resetBlock

   resetFw="$sClient UTM -B -e \"update users set fw_on='1' where ip='$userIp'\" --password=\"cegthcbcntvf\""
   eval $resetFw

done < "$workFile"

$sshClient -i $rsaHostKey root@xxx.xxx.xxx.xxx \"/usr/local/sbin/scripts/fwresetall\"

Что делает скрипт понятно...
Непонятно что сие значит while read userIp userStatus?
Что есть userIp userStatus?
И зачем вообще нужен здесь цикл?


Содержание

Сообщения в этом обсуждении
"помогите разобраться плиз, не могу понять скрипт bash "
Отправлено Hawk , 16-Дек-09 13:01 
read читает stdin и ставит то, что получила в переменные.
скрипт вызывается, и останавливается на while пока не прочитает Ip и status



"помогите разобраться плиз, не могу понять скрипт bash "
Отправлено Andrey Mitrofanov , 16-Дек-09 14:38 
>#!/bin/bash

Кстати! man bash же... Да, не каждый долетит до середины. Да каждый, кто долетел _каждый_ раз находит в нём что-то новое. И всего знать не может никто (это гипотеза %) ).

>while read userIp userStatus
>do
>   getTraffic="
>   eval $getTraffic

Пары команд (= и eval) в цикле "собирают" несколько командных строк и выполняют их, соответственно.

>done < "$workFile"
>Непонятно что сие значит while read userIp userStatus?

""while read ...; do ...; done <file"" значит читать построчно текстовый "file" и выполнять тело цикла для каждой строки.

Более подробно:
...done <file - открывает ("передаёт на STDIN") на чтение файл, для команды while и её _потомков_

...while read ...; do - пока команда read возвращает статус 0 ("успешное выполение") -- повторять выполнение цикла

...read userIp userStatus -- читать след.строку в переменные user* со STDIN (и кодом выхода сообщать об успешности чтения (строка прочитана или конец файла, например)

>Что есть userIp userStatus?

Имена переменных, в которые read читает "текст"

>И зачем вообще нужен здесь цикл?

Судя по названиям переменных %), выполняются какие-то команды для каждого из пользователей в списке. Какой-то сбор статистики (считалка трафика?..) по пользователям, наверное.