[
* é um comando normal, semelhante a grep
, find
ou cat
. Você deve conseguir encontrá-lo em /bin
. Como é um programa separado, o shell executará seu conjunto normal de expansões antes de entregar [
de seus argumentos.
Como já foi mencionado, como você está usando *
em seus testes, está obtendo expansões glob. Observe que, mesmo se você usar aspas, como 'hel*'
, isso provavelmente não funcionará como esperado, porque [
não suporta padrões. No caso de h*o
working, isso provavelmente se deve à presença de um arquivo chamado hello
em seu diretório atual e nenhum outro arquivo que corresponda a esse padrão. Se funcionar sem um arquivo hello
, você poderá ter uma implementação ímpar e provavelmente seu script falhará em outros sistemas.
Dependendo das suas necessidades, existem algumas opções. Bash, Zsh e alguns outros shells possuem o [[
embutido. Uma vez que é construído, pode dar um tratamento especial aos seus argumentos, incluindo evitar a expansão glob. Além disso, pode fazer correspondência de padrões. Experimente
var1=hello
if [[ "$var1" = hel* ]]; then
echo success
fi
Além disso, observe a falta de citações em torno do padrão. Sem as aspas, hel*
é tratado como um padrão por [[
, com aspas (simples ou dupla), "hel*"
é tratado literalmente.
Se você precisar de compatibilidade mais ampla, como shells sem [[
, você pode usar o grep:
var1=hello
if echo "$var1" | grep -qe 'hel.*' ; then
echo success
fi
Não é necessário [
ou [[
aqui, mas as cotações em torno de 'hel.*'
são.
* Alguns shells realmente têm [
embutido, mas isso é para fins de eficiência. Ele deve ainda se comportar de forma idêntica ao executável separado, incluindo ter seus argumentos sujeitos ao "mangling" normal do shell.