見栄えを考慮して*(アスタリスク)でお洒落に飾り付けたメッセージをechoした際に、予期せぬ結果となりたいへん困惑したものである。
$ ls
avava
$ msg="* THIS IS TEST MESSAGE. *"
$ echo ${msg}
avava THIS IS TEST MESSAGE. avava
どうも * がワイルドカードとして扱われてパス名展開されていけない。此れを抑制するには変数をダブルクォーテーションで囲い込んでやればよかった。
$ echo "${msg}"
* THIS IS TEST MESSAGE. *
なおbashのマニュアルによればset -fやset -o noglobコマンドによってもパス名展開を抑止できる模様である。
$ man bash
(snip)
set [--abefhkmnptuvxBCEHPT] [-o option-name] [arg ...]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...]
-f Disable pathname expansion.
-o option-name
noglob Same as -f.
ひとたび抑止を有効にすれば、変数をダブルクォートしようがしまいが同じことである。
$ msg="* THIS IS TEST MESSAGE. *"
$ set -f
$ echo ${msg}
* THIS IS TEST MESSAGE. *
$ echo "${msg}"
* THIS IS TEST MESSAGE. *
一方でパス名展開を望む場面でも断固として抑止されるから、取り扱いは勢い慎重にならざるを得ない。パス名展開を再開するならset +fやset +o noglobである。
$ ls * ls: cannot access '*': No such file or directory $ set +f $ ls * avava