[
* - это обычная команда, похожая на grep
, find
или cat
. Вы должны быть в состоянии найти его в /bin
. Поскольку это отдельная программа, оболочка выполнит свой обычный набор расширений перед передачей [
своих аргументов.
Как уже упоминалось, поскольку вы используете *
в своих тестах, вы получаете глобальные расширения. Обратите внимание, что даже если вы используете кавычки, такие как 'hel*'
, это, вероятно, не сработает, как вы надеетесь, потому что [
не поддерживает шаблоны. В случае h*o
работает это, скорее всего, из-за наличия файла с именем hello
в вашем текущем каталоге, а также отсутствия других файлов, соответствующих этому шаблону. Если он работает без файла hello
, у вас может быть странная реализация, и ваш сценарий, скорее всего, выйдет из строя на других системах.
В зависимости от ваших потребностей, есть несколько вариантов. У Bash, Zsh и некоторых других оболочек есть [[
встроенный. Поскольку он встроенный, он может обрабатывать свои аргументы особым образом, в том числе избегать глобальных расширений. Кроме того, он может сделать сопоставление с образцом. Пытаться
var1=hello
if [[ "$var1" = hel* ]]; then
echo success
fi
Также обратите внимание на отсутствие кавычек вокруг шаблона. Без кавычек hel*
трактуется как шаблон [[
, с кавычками (одинарными или двойными), "hel*"
трактуется буквально.
Если вам нужна более широкая совместимость, например, для оболочек без [[
, вы можете использовать grep:
var1=hello
if echo "$var1" | grep -qe 'hel.*' ; then
echo success
fi
Нет [
или [[
необходимо здесь, но есть кавычки вокруг 'hel.*'
.
* У некоторых оболочек действительно есть [
встроенный, но это для эффективности. Он по-прежнему должен вести себя идентично отдельному исполняемому файлу, в том числе подвергать свои аргументы обычному "искалечению" оболочки.