LINUX.ORG.RU

bash переменные


0

0

Пробую сделать следующую конструкцию:

watch host=1.2.3.4 \; ping -с 1 $host

Переменная оказывается не определена. Если определить до watch то существует и используется. Если использовать export то тоже не определяется.

Можно определить и снаружи, но хочется включить вариант когда host изменится.

Возможно ли это или что здесь не так?

★★★★★

Я нихрена не понял, но скажу, что шелл обрабатывает только те присваивания, которые стоят до имени команды. Насчет export не понял. Конкретно, какая командная строка не сработала?

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

#!/bin/bash

host=`grep -m 1 nameserver /etc/resolv.conf |awk '{print $2}'`

watch /sbin/ifconfig\|grep -B 1 inet\
    \;echo\
    \;/sbin/route -n\
    \;echo\
    \;export host=10.10.10.14\
    \;echo $host\
    \;if [ $host ]\;then ping -c 1 -q $host\;fi

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

Собственно, если в начале host не определить то внутри watch он уже не определяется, остаётся пустым

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

> Собственно, если в начале host не определить то внутри watch он уже не определяется

Я всё еще не понимаю точно, чего ты хочешь, но попробуй экранировать $ в echo и if.

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

Да есть там экспорт...

Кстати, вставив echo _после_ watch, переменную увидел.

Может я слишком раздул этот watch и проще уже бесконечный цикл сделать...

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

В целом, это просто быстрое отображение настроек сети когда их дёргаешь туда-сюда. Просто выводятся адреса, шлюз и факт наличия связи.

А "эхо" и "если" в общем работают. Затык именно в задании переменной.

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

> Затык именно в задании переменной.

Если ты хочешь, чтобы переменные обрабатывались шеллом, который запускает watch, попробуй сделать, как я сказал.

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

Спасибо, тепреь понял

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

Кстати, обнаружился ещё один забавный эффект нивелирующий нахождение dns на лету :)

Почему-то оно при изменении файла не замечает этого изменения и грепает то что уже один раз прочло...

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

Это как? Может покажете свой скрипт? А вобще я не понял, чего вы наворотили, напишите bash скрипт и запускайте его через watch, если вам нравится watch и не нравится бесконечный цикл.

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

> watch /sbin/ifconfig\|grep -B 1 inet\ > \;echo\

IMHO, если пунктуация нагромождается в три этажа, проще вынести часть (параметр вотча) в отдельный скрипт.

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

Да вон выше приводил, там даже не скрипт а однострочник быстро отображающий текущие настройки сети. Уже подсказали и в строке где определяется $host экранировал кавычки, они уехали к ватчу и теперь строка выполняется внутри него. Теперь в последней строке что-то не так оказалось :)

#!/bin/bash

watch /sbin/ifconfig\|grep -B 1 inet\
    \;echo\
    \;/sbin/route -n\
    \;echo\
    \;host=\`grep -m 1 nameserver /etc/resolv.conf\|awk \'{print $2}\'\`\
    \;if [ \$host ]\;then ping -c 1 -q \$host\;fi

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

Собственно всё, разобрался что экранировать а что не надо. У awk знак $ в параметрах терялся, его тоже было нужно. 

#!/bin/bash

watch /sbin/ifconfig\|grep -B 1 inet\
    \;echo\
    \;/sbin/route -n\
    \;echo\
    \;host=\`grep -m 1 nameserver /etc/resolv.conf\|awk \'{print \$2}\'\`\
    \;if [ \$host ]\;then ping -c 1 -q \$host\;fi

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