добавление строки и переменной к другой переменной в сценарии bash

Я попытался создать сценарий bash, чтобы показать все доступные локальные IP-адреса. Поскольку обычный параметр ping не может работать быстрее 1 секунды на IP-адрес, а fping показывает слишком много вывода при выполнении в цикле for, я пытался сделать это следующим образом:

read -p "Enter Gateway IP Address: " gateway
for ip in $(seq 1 254);
    allips = $allips ${gateway::-1} $ip
done
fping -c1 -t500 -a $allips > /dev/null

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

local.sh: line 2:  : command not found
local.sh: line 4: syntax error near unexpected token `allips'
local.sh: line 4: ` allips = $allips ${gateway::-1} $ip'
1
задан 6 January 2018 в 14:36
1 ответ

В вашем сценарии есть ряд синтаксических ошибок; Я пройдусь по ним в конце. Но сначала кажется, что есть более простой способ сканирования подсети / 24 с параметром fping -g (генератор). У меня не установлен fping для тестирования, но из документации это должно работать:

#!/bin/bash
read -p "Enter Gateway IP Address: " gateway
fping -c1 -t500 -a -g "${gateway%.*}.0/24" > /dev/null

Часть $ {gateway%. *} берет введенный IP-адрес шлюза и обрезает, начиная с последнего "." (т.е. последний октет). Итак, если шлюз - 192.168.0.254, это 192.168.0. Затем сценарий добавляет к нему «.0 / 24», чтобы получить строку подсети «192.168.0.0/24».

Проблемы в исходном сценарии:

  • Начните ваши сценарии с соответствующей строки shebang. Обычно это #! / Bin / bash или #! / Usr / bin / env bash . Вы также увидите #! / Bin / sh , но это может вызвать проблемы, если вы используете какие-либо расширения синтаксиса bash в своем скрипте. Если вы не знаете тонкостей синтаксиса bash vs plain sh, используйте bash shebang.

  • В вашем операторе for отсутствует его do . Он должен быть для ip в $ (seq 1 254); do .

  • bash v3 не допускает отрицательных строковых индексов (например, $ {gateway :: - 1} ). Если у вас версия bash 4, это сработает; если у вас v3, вам нужно вычесть единицу из длины строки: $ {gateway :: $ {# gateway} -1} . Или вы можете использовать оператор обрезки от конца, % , как я сделал в моем коде выше. Если вы используете $ {gateway%. *} , последний "." а также номер, поэтому вам нужно добавить его обратно. Другим преимуществом является то, что это также будет работать, если последний октет состоит из более чем одной цифры (например, некоторые люди по какой-то причине устанавливают маршрутизаторы на 0,254).

  • Вы должны почти всегда заключать ссылки на переменные в двойные кавычки, чтобы избежать различных формы неправильного анализа пробелов, подстановочных знаков и т. д. В этом случае это, вероятно, безопасно, но я бы все равно этого избегал. Но в вашем сценарии вы рассчитываете на разделение слов, чтобы каждый адрес передавался в качестве отдельного аргумента в fping . Лучший способ сделать это в сценарии оболочки - использовать массив, а не простую переменную, причем каждый аргумент является отдельным элементом массива. Синтаксис для этого немного запутан, но основные операции следующие:

     args = (arg1 arg2 "arg with space") # Скобки говорят bash, что это массив
    для x в списке вещей;  делать
      args + = (additionalarg) # Добавить элементы в массив.  И +, и () НЕОБХОДИМЫ
    сделанный
    somecommand "$ {args [@]}" # Да, круглые скобки, скобки и т. д. необходимы
     
  • Вы не можете использовать пробелы в присваивании (если вы не заключаете их в кавычки или экранируете, в этом случае они являются частью присвоенной строки). Когда вы используете var = something , оболочка обрабатывает это как выполнение команды var с аргументами = и something . Итак, ваше назначение должно выглядеть примерно так:

     allips = "$ allips $ {gateway :: - 1} $ ip"
     

    ... за исключением того, что, как я сказал выше, вы должны использовать массив. Поэтому перед циклом установите его пустым ( allips = () ), а затем используйте:

     allips + = ("$ {gateway%. *}. $ Ip")
     

    А затем, после цикла, используйте его так:

     fping -c1 -t500 -a "$ {allips [@]}"> / dev / null
     
0
ответ дан 4 December 2019 в 04:16

Теги

Похожие вопросы