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;

cronでの実行時刻を秒まで指定したい

毎分0秒と30秒に実行したいプログラムがあったのであるけれども、cronで指定できる時刻の最小単位は 分 までであるから工夫を凝らさなければならない。そこでプログラムの実行前にsleepを実施するのである。これで時刻を秒単位まで意のままに指定できるのである。

$ crontab -e
* * * * * sleep 30; /bin/bash /home/guro/scripts/avava.sh