Попробуйте:
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
}
}
Во-первых, $($mac)
нужно зафиксировать на $mac
, как ранее сказал Джеа.
Также просто используйте оператор case; двойные скобки bash (или, может быть, zsh)(edit :действительно доступны, начиная с ksh; bash и zsh тоже приняли его )специфично, но shebang просто говорит «/bin/sh», а не «bash».
Вот два решения:
#!/bin/bash
, #!/usr/bin/bash
или что-то другое в зависимости от вашей среды, чтобы уточнить, что вы используете башизм, или #!/bin/sh
mac="f0:79:60:0f:d3:0e"
case "$mac" in ('f0:79:60'*)
echo "true"
;;(*)
echo "false"
;;esac
Поскольку вы используете оболочку 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*
.