посоветуйте пожалуйста - что не так с моим синтаксисом? (не следует печатать «плохой интерфейс»)
замечание - я работаю с оболочкой 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
богато, но часто бывает достаточно.