Могу ли я перенаправить ключевые комбинации к ключевым последовательностям в Linux / x?

Ваша первая проблема:

while validmask
do ...

Здесь ничего не происходит - вы вызываете свою функцию без аргументов. И поэтому он возвращает false, и цикл останавливается.

Следующая проблема заключается в том, что вы хотите запустить функцию до тех пор, пока возврат не станет допустимым. Для этого вам нужно использовать до . Раньше мне удавалось это не заметить.

Вам нужно отбросить первый оператор if и просто выполнить:

until validmask "$mask"
do    mask=$(get_new_value)
done

Цикл до является логическим отрицанием while . Он будет работать до тех пор, пока выполняемая им команда не вернет истину.

Также можно записать:

while ! validmask "$mask"
do    mask=$(get_new_mask)
done

Вы можете выполнить задание / проверку сразу:

unset mask
until validmask "${mask:=$(get_new_value)}"
do    mask=
done

Другая проблема заключается в том, что ваша функция validmask не может полностью проверить правильность во многих крайних случаях - особенно те, которые включают [*? . Я думаю, вам следует просто использовать case и не обращать внимания на все вспомогательные расщепления и объявления переменных.

Просто исключите неверные значения:

validmask()
    case    "${1##*[!0-9.]*}"       in
    (.*|*.|*..*|*.*.*.*.*|*[!.][!.][!.][!.]*) ! :;;
    (*[3-9][!.][!.]*|*2[6-9][!.]*|*25[6-9]*)  ! :;;
    (*.*.*.*)       ;;              (*)       ! :;;
    esac

Небольшая демонстрация:

for mask in              \
         0.0.0.0         \
         0.0.0.          \
         0.0.0.1233      \
         0.0.0.233       \
         0.0..233        \
         0.0.2.233       \
         0.5555.2.233    \
         0.55.2.233      \
         .55.2.233       \
         1.55.2.233      \
         255.255.255.255 \
         255.255.256.255
do    validmask "$mask"
      printf "%-16.16s: %.$?0s%.$((!$?*4))s\n%.d" \
             "$mask" bad good  "0$(($?*8))"
      printf "printf's return:\t $?\n\n"
done  2>/dev/null

0.0.0.0         : good
printf's return:     0

0.0.0.          : bad
printf's return:     1

0.0.0.1233      : bad
printf's return:     1

0.0.0.233       : good
printf's return:     0

0.0..233        : bad
printf's return:     1

0.0.2.233       : good
printf's return:     0

0.5555.2.233    : bad
printf's return:     1

0.55.2.233      : good
printf's return:     0

.55.2.233       : bad
printf's return:     1

1.55.2.233      : good
printf's return:     0

255.255.255.255 : good
printf's return:     0

255.255.256.255 : bad
printf's return:     1

Вот еще одна версия validmask () , которая, как я думаю, фактически проверяет маски. Раньше я не осознавал, что сетевая маска была такой ограничительной.

validmask()
    case    ."${1##*[!.0124589]*}".      in
    (*.*.*.*.*.*.*|*[!.][!.][!.][!.]*) ! :;;
    (*[!.25]*.[!0]*|*.[!012]*|*0[!.]*) ! :;;
    (*1[!29]*|*1?[!28]*|*98*|*.2?.*)   ! :;;
    (*4[!.08]*|*[.2][25][!245]*)       ! :;;
    (.*.*.*.*.)  echo "$1";; (*)       ! :;;
    esac

a=-1 b=0 c=0 d=0
for o in a b c d
do    while  [ "$(($o+=1))" -lt 1000 ] ||
             ! : "$(($o=255))"
      do     validmask "$a.$b.$c.$d"
done; done

0.0.0.0
128.0.0.0
192.0.0.0
224.0.0.0
240.0.0.0
248.0.0.0
252.0.0.0
254.0.0.0
255.0.0.0
255.128.0.0
255.192.0.0
255.224.0.0
255.240.0.0
255.248.0.0
255.252.0.0
255.254.0.0
255.255.0.0
255.255.128.0
255.255.192.0
255.255.224.0
255.255.240.0
255.255.248.0
255.255.252.0
255.255.254.0
255.255.255.0
255.255.255.128
255.255.255.192
255.255.255.224
255.255.255.240
255.255.255.248
255.255.255.252
255.255.255.254
255.255.255.255
0
14.09.2018, 22:45
1 ответ

xdotool может сделать именно это! Прохладный!

0
28.01.2020, 04:13

Теги

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