#bash
#bash
Вопрос:
Я пишу скрипт, который время от времени меняет IP-адрес, но по какой-то причине я просто не могу заставить это работать
sed "s/$curLine/$nextLine/" </etc/network/interfaces>/etc/network/interfaces.new
даже если я изменю end / g, я всегда буду получать «команду sed unterminated»s»»
Вот мои переменные $ curLine и $ nextLine:
#Find current ip from /etc/network/interfaces
curLine=$(sed -n "/address/p" /etc/network/interfaces)
#Find location of current ip in ips.txt.
newLine=$(sed -n "/$curLine/=" ips.txt)
#Check and set next ip
nextIP=$(($newLine 1))
nextLine=$(sed -n "$nextIP,/address/p" ./ips.txt)
по какой-то причине $ nextLine также дает мне два IP-адреса, я не знаю почему, потому что в начале ot работал просто отлично.
и, в конце концов, это строка, которая не работает так, как должна.
"s/$curLine/$nextLine/" </etc/network/interfaces>/etc/network/interfaces.new
сообщение об ошибке «sed unterminated `s’ command». Если я заменю $nextline текстом типа «адрес xxx.xxx.xxx.xx, он работает просто отлично.
Я прочитал так много тем, где решением было использовать двойные кавычки, но я не знаю, почему это не работает со мной. У меня также есть книга, в которой приведен пример, который в основном совпадает с тем, что я делаю, но опять же он не работает, когда я пытаюсь его использовать.
Спасибо!
Ответ №1:
Синтаксис для арифметики не имеет дополнительного символа:
NUM=1
OTHERNUM=$((NUM 1))
# ^^^^^^^^^^^^
Другими словами, скажем nextIP=$((newLine 1))
.
Комментарии:
1. Я не уверен, что я понял, что вы имеете в виду. Теперь я изменился
nextIP=$((newLine 1))
, иnextLine=$(sed -n "$nextIP,/address/p" ips.txt)
все же по какой-то причине я получил два ip: s после следующего:echo 'Next line '$nextLine
и снова «unterminated `s’ команда»2. Вы уверены, что можете перейти
$curLine
вsed
команду без какого-либо экранирования? Вы сначала пробовали это вручную в командной строке?3. Да, кажется, это работает, по крайней мере, когда я повторяю $ curLine, он выдает мне IP-адрес из интерфейсов, и он правильный как » адрес xxx.x.xx.xxx. my ips.txt также включите IP-адреса, отформатированные как «адрес xxx …», и я пытаюсь заменить адресную строку интерфейса на ips.txt адресстрока.
4. Как насчет эха
$newLine
?5. $newLine указывает текущую позицию ip в ips.txt это строка 1, и это правильно. Затем в моем $ nextIP указано «Следующая позиция подсказки, которая будет использоваться: 2», что означает строку 2 в ips.txt . После этого по какой-то причине $ nextLine выдает мне два адреса «адрес ххх … адрес гггг …» Я предположил, что «sed -n «$nextIP,/address/p» ./ips.txt » следует выбрать первый адрес xxx .. в строке $ nextIP, верно?
Ответ №2:
Проблема решена. Я только что изменил
nextLine=$(sed -n "$nextIP,/address/p" ./ips.txt)
для поиска диапазона строк вместо конкретной строки с шаблоном.
nextLine=$(sed -n "$nextIP,/$nextIP" ./ips.txt)