bashで変数をechoする際に文字列に含まれるアスタリスクがワイルドカードとして扱われないようにする

シェルスクリプトを組み上げる際に見栄えを考慮してオシャレなメッセージを表示しようとしたところ予期せぬ結果に困惑したものである。

$ msg="*** select * from avava;"
$ echo ${msg}
public_html src tmp select public_html src tmp from avava;

アスタリスク * がワイルドカードとして展開されているからいけない。これを抑制するには変数をダブルクォーテーションで囲い込んでやればよいのであった。

$ echo "${msg}"
*** select * from avava;

bashのマニュアルによればset -fやset -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.

一旦展開しないようセットしたものの気が変わってやはり元の仕組みが嬉しい向きにはset +fやset +noglobを実行すればよろしい。

$ set -f
$ echo ${msg}
*** select * from avava;
$ echo "${msg}"
*** select * from avava;
$ ls *
ls: cannot access *: No such file or directory
$ set +f
$ echo ${msg}
public_html src tmp select public_html src tmp from avava;
$ echo "${msg}"
*** select * from avava;

Similar Posts:

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください