А лучше пользоваться !! или история?

printf '192.168.1.%d\n' {1..251}

Это будет использовать расширение фигурной скобки bash(первоначально функция zsh, также доступная в . ]ksh93) для генерации чисел от 1 до 251, и для каждого числа printfбудет печатать IP-адрес с числом, вставленным в конце.

Следующее будет читать IP-адрес и делать с ним то же самое:

IFS='.' read a1 a2 a3 a4
printf -- "$a1.$a2.$a3.%d\n" {1..251}

Если вы хотите использовать awk:

awk 'BEGIN { OFS = FS = "." } { for (i = 1; i <= 251; ++i) print $1, $2, $3, i }' <<<"$IP"

Мы хотим, чтобы разделитель полей ввода и вывода был точка, поэтому мы устанавливаем оба FSи OFSна этот символ в блоке BEGIN. Затем мы считываем IP-адреса из стандартного ввода и для каждого IP-адреса выполняем итерацию от 1 до 251 и распечатываем список.

В командной строке мы вводим $IPкак «здесь-строку» (первоначально функция zsh, но также доступна в bashи ksh93).

1
18.05.2017, 05:54
2 ответа

Оба способа имеют свои плюсы и минусы, как вы и Джули заметили. Но действительно лучшее решение — использовать их оба, когда это необходимо. Итак, когда вы не уверены в том, !! приведет к

  • сначала стрелка вверх, чтобы увидеть, что это было
  • , затем стрелка вниз
  • , а затем sudo !!

Есть и другие хитрости, касающиеся истории. Это из man bash.

Event Designators
   An  event designator is a reference to a command line entry in the his‐
   tory list.  Unless the reference is absolute, events  are  relative  to
   the current position in the history list.

   !      Start  a  history substitution, except when followed by a blank,
          newline, carriage return, = or ( (when the extglob shell  option
          is enabled using the shopt builtin).
   !n     Refer to command line n.
   !-n    Refer to the current command minus n.
   !!     Refer to the previous command.  This is a synonym for `!-1'.
   !string
          Refer  to the most recent command preceding the current position
          in the history list starting with string.
   !?string[?]
          Refer to the most recent command preceding the current  position
          in  the  history  list containing string.  The trailing ? may be
          omitted if string is followed immediately by a newline.
   ^string1^string2^
          Quick substitution.   Repeat  the  previous  command,  replacing
          string1  with  string2.  Equivalent to ``!!:s/string1/string2/''
          (see Modifiers below).
   !#     The entire command line typed so far.

Чтобы увидеть всю историю о расширении истории, перейдите на man bash и найдите там раздел ИСТОРИЯ РАСШИРЕНИЯ.

2
27.01.2020, 23:13

Если вы только что набрали его и все еще видите, то я не понимаю, почему бы не использовать !! но, конечно, не делайте этого вслепую и в конечном итоге не запускайте предыдущую операцию, которая может все испортить.

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

5
27.01.2020, 23:13

Теги

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