[ * - это обычная команда, похожая на 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.*' .
* У некоторых оболочек действительно есть [ встроенный, но это для эффективности. Он по-прежнему должен вести себя идентично отдельному исполняемому файлу, в том числе подвергать свои аргументы обычному "искалечению" оболочки.