2

bash version:

$ bash -version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.  
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

command:

$ var="[a-p]"; echo $var
h

Anyone has an idea what's the reason for this kind of interpretation.

For context I'm parsing a config file using shell and looking for patterns to grab sections names

[section-foo]
foo=bar

while reading the file, if a section row for example is [a-p] it will get that weird behavior.

2 Answers2

6

You have a file name h in the directory where you ran

echo $var

The shell tries to use [a-p] as a glob, and if anything matches, it replaces the glob with the match. With a file named h, that becomes

echo h

You can prevent this by quoting the expansion, which will cause it to not be treated as a glob.

echo "$var"
Stephen Kitt
  • 434,908
3

By not using any quoting in echo $var you are exposing the expansion to both "splitting" and "pathname expansion" (aka "globbing" or "filename generation").

That means that a string that contains a [ (also * and ?) will be expanded by the rules of "pathname expansion". In your case, that means that there is a file with a name of only one character called h.

If you quote the expansion, no "Pathname Expansion" will be performed:

$ echo "$var"
[a-p]