LINUX.ORG.RU

Проблема с bash от незнания bash[Помогите, башкодеры!]


0

1

Создал небольшой скрипт, проверяющий доступность хоста через кривой вывод пинга(в сети много хау-ту). Выглядит он так:

result=$(ping -c ${count} ${ipserver} | tail -2 | head -1 | awk '{print $4}')
if [$result != "0"];then
 echo "Хост доступен"
else
 echo "Хост недоступен"
fi;;

В ответ на который приходит сообщение от убунты:

./test.sh: строка 33: [1: команда не найдена
Хост недоступен

(тут понятно что $count == «1»)

Перерыл «Introduction to IF», вроде делаю правильно. Вставлял слэши и маскировал кавычки, результат такой же. Подскажите, люди добрые, что я делаю не так, и как это исправить?

(да, это все(IF..ELSE..FI)) находится в case...esac, о чем намекают двойные точка-с-запятой в конце if'а

★★★★★

facepalm.png

if ping -c ${count} ${ipserver}; then ...

А вообще, скажу по секрету, «[» — это такая прога. «/usr/bin/[». И у нее есть обязательный завершающий параметр «]». Надеюсь, теперь понятно, что после открывающей скобки и перед закрывающей должны быть пробелы?

// Про тонкости типа ««x$result» != «x0»» вообще рассказывать бессмысленно.

nnz ★★★★
()
Ответ на: facepalm.png от nnz

>Про тонкости типа ««x$result» != «x0»» вообще рассказывать бессмысленно.
Ну почему? я быстро учусь и уже терминал не ругается на строку, спасибо. Хотя из-за вышескопированного выражения(как я понял из вашего ответа) не выполняется команда(точнее if работает, но не видит что 1!=0(или я не умею заставить))

if ping -c ${count} ${ipserver}; then ...

А шо не так? :) Понимаю это не как if ping... , а как if/*если count=1*/[1/0!=«0»]

««x$result» != «x0»»

А что ж тогда «x0»? В bash вроде тип переменной не нужно указывать, а вот такое я не понимаю(думаю об ошибке убунты вообще(не поймите неправильно, просто не понимаю)): условие: [«1»!=«0»] , а пишет false на это...

minakov ★★★★★
() автор топика
Ответ на: facepalm.png от nnz

А в общем спасибо! Если не пинать, то не полетит. Загнал в переменную default=«0» и сделал if [ $result -ne $default ] ;then
Спасибо, друг

minakov ★★★★★
() автор топика

Будь внимательнее к синтаксису

if [$result != «0»];then - НЕ правильно
if [ «$result» != «0» ];then - ПРАВИЛЬНО
Пробелы после «[» и до «]» ОБЯЗАТЕЛЬНЫ потому что «[» - это прежде всего КОМАНДА (по крайней мере этот символ обрабатывается как команда), поэтому после него должен быть пробел, чтобы отличить от последующего выражения. А то у тебя получается что-то типа
if «[$result» != «0]» - что есть абсурд для интерпритатора.

zzdnx ★★
()

Лучше бы ты смотрел код возврата, чем парсил вывод

if ping -c ${count} ${ipserver} 2>&1 > /dev/null
then
 echo "Хост доступен"
else
 echo "Хост недоступен"
fi
melkor217 ★★★★★
()

и да, повесь лучше таймаут на пинг через -W.

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

> result=$(ping -nqc 1 $ipserver &>/dev/null &&echo «1» ||echo «0»)

ну или хотя бы так, да.

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

>>Наверное сделаю так: result=$(ping -nqc 1 $ipserver &>/dev/null &&echo «1» ||echo «0»)

лицорука.жпг


это я к чему - нет бы просто воспользоваться отрицанием, ака "!" - нет же, обязательно надо городить что-то страшное.
ну и вообще для скриптов лучше подходит fping

maloi ★★★★★
()

да, ещё почитайте man test (дело в том, что test это тоже что и [, только после test нельзя ставить ])

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

Спасибо товарищи. Может кому то и проще учить читая маны и документации, но у меня лучше получается на живых примерах.

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

>не рассказывайте ему про $?
Почему? Там что-то страшное? Первый вариант с отрицанием плох?

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

>Спасибо товарищи. Может кому то и проще учить читая маны и документации, но у меня лучше получается на живых примерах.

а вы разве не знали, что в man'ах есть живые примеры? с этой командой просто проблема есть - во многих дистрибутивах не работает man [, а если даже и работает, то догадаться сложно. Потому и написал. Сам в своё время не мог разобраться.

Кстати, про && || есть в man bash, а на опеннете есть русские маны (правда древние, потому лучше родные, из ВАШЕЙ системы).

drBatty ★★
()
Ответ на: комментарий от minakov
#!/bin/bash

count=1
default=0
ipmodem=8.8.8.8
ipserver=192.168.1.2
ipoldmind=192.168.1.3
ipwork=192.168.1.4
network=www.ya.ru

clear
echo \
"==================================================
Проверка соединения и подключение к хостам:
1 Проверить $ipmodem   |   2  http  $ipmodem
3 Проверить $ipserver   |   4  ssh к $ipserver
5 Проверить $ipoldmind   |   6  ssh к $ipoldmind
7 Проверить $ipwork   |   8  ssh к $ipwork
9 Проверить $network     |   10 Выход
=================================================="
read input

case $input in
1) ip=$ipmodem;;
2) firefox http://$ipmodem/; exit 0;;
3) ip=$ipserver;;
4) ssh arthur@$ipserver; exit 0;;
5) ip=$ipoldmind;;
6) ssh katya@$ipoldmind; exit 0;;
7) ip=$ipwork;;
8) ssh arthur@$ipwork; exit 0;;
9) ip=$network;;
10) exit 0;;
*) echo 'Введены неверные данные'; exit 0
esac

ping -nqc $count $ip &>/dev/null &&echo 'Хост доступен' ||echo 'Хост недоступен'

Не проверял )

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