見栄えを考慮して*(アスタリスク)でお洒落に飾り付けたメッセージを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