Есть несколько способов сделать это.
В bash> = 3 у вас есть соответствие регулярному выражению, как вы описали, например,
$ foo=foobar
$ if [[ $foo =~ f.ob.r ]]; then echo "ok"; fi
ok
Обратите внимание, что этот синтаксис использует шаблоны регулярных выражений, поэтому он использует .
вместо ?
для соответствия одному символу.
Если вы хотите просто проверить, что строка содержит подстроку, есть более классические способы сделать это, например,
# ${foo/b?r/} replaces "b?r" with the empty string in $foo
# So we're testing if $foo does not contain "b?r" one time
$ if [[ ${foo/b?r/} = $foo ]]; then echo "ok"; fi
Вы также можете проверить, начинается ли строка или заканчивается выражением следующим образом:
# ${foo%b?r} removes "bar" in the end of $foo
# So we're testing if $foo does not end with "b?r"
$ if [[ ${foo%b?r} = $foo ]]; then echo "ok"; fi
# ${foo#b?r} removes "b?r" in the beginning of $foo
# So we're testing if $foo does not begin with "b?r"
$ if [[ ${foo#b?r} = $foo ]]; then echo "ok"; fi
ok
См. Расширение параметра параграф man bash для получения дополнительной информации об этих синтаксисах. Использование ##
или %%
вместо #
и %
соответственно приведет к получению самого длинного соответствия вместо простого соответствия.
Другой очень классический способ работы с подстановочными знаками - использовать case:
case $foo in
*bar)
echo "Foo matches *bar"
;;
bar?)
echo "Foo matches bar?"
;;
*)
echo "Foo didn't match any known rule"
;;
esac