частичное совпадение строки в /bin/sh

Попробуйте:

awk '
  BEGIN{
    srand()
    letter = "abcdefghijklmnopqrstuvwxyz"
    digit  = "0123456789"
  }
  function find_in(set) {
    if (index(set, c)) {
      c = substr(set, int(rand() * length(set) + 1), 1)
      return 1
    }
  }
  $0 != "" {
    c = substr($0, length)
    if (find_in(letter) || find_in(digit)) sub(/.$/, c)
  }
  {print}'

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

Символ замены является случайным, что означает, что он может совпадать с исходным. Если вы хотите исключить оригинал из списка возможных замен, вы можете изменить функцию find_inна :

.
  function find_in(set,   n) {
    if (n = index(set, c)) {
      set = substr(set, 1, n - 1) substr(set, n + 1)
      c = substr(set, int(rand() * length(set) + 1), 1)
      return 1
    }
  }
0
23.01.2021, 18:20
2 ответа

Во-первых, $($mac)нужно зафиксировать на $mac, как ранее сказал Джеа.

Также просто используйте оператор case; двойные скобки bash (или, может быть, zsh)(edit :действительно доступны, начиная с ksh; bash и zsh тоже приняли его )специфично, но shebang просто говорит «/bin/sh», а не «bash».

Вот два решения:

  1. Замените 1-ю строку на #!/bin/bash, #!/usr/bin/bashили что-то другое в зависимости от вашей среды, чтобы уточнить, что вы используете башизм, или
  2. Просто используйте оператор case, так как это наиболее переносимая альтернатива, например:
#!/bin/sh

mac="f0:79:60:0f:d3:0e"

case "$mac" in ('f0:79:60'*)
  echo "true"
;;(*)
  echo "false"
;;esac
1
18.03.2021, 22:35

Поскольку вы используете оболочку BusyBox (ash ), проблема заключается в том, что ваш скрипт использует конструкцию, не распознаваемую оболочкой([[...]]). Кроме того, "$($mac)"следует изменить на $mac.

Вот исправленная версия, которая может работать на BusyBox (в качестве альтернативы ответу хвостовой искрой кроличьим ухом):

#!/bin/sh

mac="f0:79:60:0f:d3:0e"

if [ -z "${mac##f0:79:60*}" ]
then
    echo "true"
else
    echo "false"
fi

[ -z "${mac##f0:79:60*}" ]проверяет, является ли результирующая строка пустой, когда удаляется максимально возможная часть $mac, соответствующая шаблону f0:79:60*.

2
18.03.2021, 22:35

Теги

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