Назад | Перейти на главную страницу

bash + как сопоставить строку, содержащую символы и числа

посоветуйте пожалуйста - что не так с моим синтаксисом? (не следует печатать «плохой интерфейс»)

замечание - я работаю с оболочкой bash

ETH_NAME=eth0         ( or any other as eth1 or eth2 .... )
echo $ETH_NAME

eth0 



[ $ETH_NAME  != eth[0-9] ] && echo bad interface

Использовать [[ ... ]] составная команда, которая может выполнять сопоставление с образцом с помощью !=

$ ETH_NAME=eth0
$ [[ $ETH_NAME != eth[0-9] ]] && echo bad interface
$ ETH_NAME=eth01
$ [[ $ETH_NAME != eth[0-9] ]] && echo bad interface
bad interface

Или используйте стандарт (POSIX sh) case заявление вместо ksh [[...]] (также можно найти в bash и zsh).

case $ETH_NAME in
  (eth[0-9]) ;;
  (*) echo >&2 bad interface
esac

Обратите внимание, что он скажет, что eth10 - плохой интерфейс.

Вместо этого вы могли бы сделать

case $ETH_NAME in
  (eth|eth*[!0-9]*) echo >&2 bad interface;;
  (eth*) ;;
  (*) echo >&2 bad interface
esac

(обратите внимание, что имена сетевых интерфейсов, включая Ethernet, не ограничиваются ethx).

Мой любимый способ сопоставления - case…esac:

case "$ETH_NAME" in
    eth[0-9]) ;;
    *) echo 'bad interface' ;;
esac

так как это быстро и довольно портативный (не требует использования bash). Я не могу сказать, что подмножество регулярных выражений доступно для case богато, но часто бывает достаточно.