LINUX.ORG.RU
ФорумAdmin

bash, поиск в файле и дальнейшее сравнение

 , ,


0

2

Здравствуйте!
Коллеги и не очень), я в замешательстве. Есть вот такой вот скрипт:

echo stat | nc localhost 2320 > output.txt
SIP="10.21.5.25"
FIND=`grep ${SIP} output.txt`
ALARM="\033[1;31m"
OK="\033[0;32m"
NORMAL="\033[0m"
res(){
        while read response; do
                echo
                case $response in
                        y|Y)
                                echo "Continue the script..."
                                break
                                ;;
                        n|N)
                                echo "Script closed. Exit."
                                exit 0
                                ;;
                        *)
                                echo "Please, enter (y/n)!"
                esac
        done
}
echo "This is SIP: ${SIP}"
echo "This is FIND: ${FIND}"
if [ ${FIND} != ${SIP} ] 2>/dev/null
then
        echo -e "${ALARM}ERROR! Server $SIP not connecting. Please chek it manually.${NORMAL}"
        echo "Want to continue running the script (y/n)?"
        res
else
        echo -e "${OK}Server ${SIP} is connected.${NORMAL}"
fi
echo "Done"

Он работает, хотя непонятно почему, ведь если в переменной "FIND" будет "пусто", то возникнет ошибка в условии сравнения
(на сколько мне известно поправьте, если это не так), но скрипт отрабатывает без ошибок.
Есть второй скрипт (целиком приводить не буду, очень большой), в который входит первый скрипт (см. выше),
в адаптированном варианте, вот его кусок:
log "Checking Server: Name: $AI1 IP: $AI1IP"
echo "$AI1 Zookeeper: "$AI1GR""
# Checking the presence of server ${AI1} ih the list ${ZCFILE}
if [ ${AI1GR} != ${AI1IP} ]; # 2>/dev/null
# If not there ask user what to do
then
        echo -e "${ALARM}ERROR! Server ${AI1} not connecting. Please chek it manually.${NORMAL}"
        echo "Want to continue running the script (y/n)?"
                # Checking response
                res
# If the server in the list continues the script
else
        echo -e "${OK}Server ${AI1} is connected.${NORMAL}"
        log "AI-Siebel Server is now start on ${AI1}."
fi
echo ""

И вот этот кусок уже не работает, он, при любом содержимом файла, в который смотрит, выдаёт первое условия оператора сравнения.
На просторах всея интернет вычитал, что нужно заключить в кавычки переменные в сравнении, но если сделать так,
тогда при любом содержимом файла, всегда выполняется второе условие.
Подскажите, что с ним не так?

А я уже вижу в чём дело)) Вот стоило только запостить(... во втором варианте ";" мешает.

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

проверил, не работает( Так что дело не в ";" И я снова в замешательстве...

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

нужно заключить в кавычки переменные в сравнении

Нужно.

тогда при любом содержимом файла, всегда выполняется второе

Такие значения переменных, значит.

При отладке выводимые переменные лучше заключать в скобки чтобы видеть, не приклеился ли там перевод строки или еще какая гадость. echo "This is SIP: [${SIP}]"

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

[${SIP}]

А я думал, что в квадраты заключают условия test. Ну типа:

 [${SIP}] && echo OK! 

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 1)
Ответ на: комментарий от pinus_nigra

За совет по отладке спасибо, а вот по поводу заключения в кавычки, я тоже такого мнения, но в первом скрипте всё работает правильно именно без кавычек, почему так?

Такие значения переменных, значит.

В переменную «SIP», гвоздями забито значение, а в переменной «FIND» такого может и не быть. Там может вообще быть пусто.

Так вот если переменные в кавычках, то при сравнении «пустой» «FIND», с «непустой» «SIP» они оказываются равны

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

то при сравнении «пустой» «FIND», с «непустой» «SIP» они оказываются равны

Так поставь проверку:

if [ ! -z "${FIND}"]
anonymous
()
Ответ на: комментарий от anonymous

Так поставь проверку:

А зачем мне городить ещё одно условие? Я же ведь задал абсолютно конкретное условие: если IPшника нет в файле,то значит иди и колупай сервер с эти IP; если есть, то продолжаем скрипт. Неужели нельзя это в одном условии выполнить? Тем более что в первом варианте скрипта всё работает, хоть я и не понимаю почему. Там тоже не должно работать, особенно если в фале «пусто».

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

Местами поменять?

Кого? Скрипты? Собсно второй итак откопипащенный с первого, просто слегка косметикой припорошили.

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

Можетпроще вообще без $find? Ну типа:

 grep ${SIP} output.txt > /dev/null || {
echo -e "${ALARM}ERROR! Server $SIP not connecting. Please chek it manually.${NORMAL}"
        echo "Want to continue running the script (y/n)?"
        res
} 
Так сработает наверняка.

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

Не вижу что изменится, да и тест подтвердил, что, в целом, от перемены мест ошибка только изменила цвет, но в любом случае спасибо.

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

Я таки, понимаю, что у Вас телефония "$SIP" на одной машине з скриптом? echo stat | nc localhost 2320

Ах, да кстать, подскажите, чем переменная "${VAR}", отличается от "$VAR"?

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

Я таки, понимаю, что у Вас телефония «$SIP» на одной машине з скриптом? echo stat | nc localhost 2320

Ну это не телефония, а просто сокращение от SourceIP и «echo stat...» - это не скрипт, а команда, которая выполняется вместе со скриптом приведённым выше, на целевой машине. Эта команда грабит IP подключенных машин к Зукиперу и сливает их в файл.

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

вместе со скриптом приведённым выше

Ну или «в теле скрипта», если вам так удобнее.)

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

Если память не отшибает, то там с массивами и есть прикол ${myarray[@]} А вот для чего просто переменную - так и не узнал, пока. Не больно нужно пока)

Последним временем ансибл кошмарю.

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

Понял, благодарю. Смысл команды понятен. Но можно же проще или нет?

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

${myarray[@]}

И так тоже прокатит:

 $myarray[@] 
A вот у ТС ${ALARM}ERROR! по другому никак. Для одинокой ${var} необязательные фигурные скорее ставят для понта. :)

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 1)
Ответ на: комментарий от Bootmen

A вот у ТС...

«ТС» - это «Товарищ Слева?»))

Для одинокой ${var} необязательные фигурные скорее ставят для понта. :)

Не знаю как у других, может и для понта, а я писал просто для целостности, чтобы не было «одна так, другая так». Может конечно не всё ещё исправил, но и скрипт ещё не готов полностью.

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

if [ ${FIND} != ${SIP} ]

если при пустом значении $FIND тебе надо попасть в ветку then тогда делай так:

if [ x${FIND} != x${SIP} ]

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

Ух ты! Интересный фокус

Это первое, что пишут в статьях по составлению bash- и sh-скриптов. Делается уже на автомате, поэтому многие не замечают, если как то по-другому.

anonymous
()

Переписывай на Python, ошибка уйдёт и твои волосы станут мягкими и шелковистыми.

Bash это как PHP в мире скриптов для системного администрирования. Для того, чтобы не знать проблем с очередными Mindfuck’ами и экранированием на экранирование, просто не нужно тянуть Shell-каку в рот.

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

Это первое, что пишут в статьях по составлению bash- и sh-скриптов. Делается уже на автомате, поэтому многие не замечают, если как то по-другому.

Знатоки, блин. Дык, потому и не замечают, что написана лажа, подставьте вместо FIND звездочку и получите занятный результат. А на bash-е первое что пишут, что надо юзать [[ ]], где ни 'x' ни "" у первого операнда нафиг не надо без побочных эффектов.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от EXL

Переписывай на Python, ошибка уйдёт и твои волосы станут мягкими и шелковистыми.

))Забавно) Сам как раз над этим и задумывался, но как-то он меня чуть страшит... Может есть какие-то ссылки на примеры обыденных скриптов, чтобы я быстрее въехал. Понятно, что без литературы никуда, но литературу можно почитать и по дороге с/на работу, а также вечерком, а на работе нужно писать. С примерами я уже бы начал модифицировать, а углубляясь в литературку, со временем, полировать пока из паровоза не выйдет самолёт.

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