突っ走り書き

見せるほどのものでは..

シェルスクリプトのコマンド存在チェックは文字列化が必要

第1稿: コマンドの存在チェック

あるコマンドが存在するとき exit するスクリプトを次のように書いた.

if which $CMD ; then
    echo "$CMD already exists."
    exit 0
fi

第2稿: 実行可能チェックを追加(バグ入り)

第1稿のスクリプトでは,

  • コマンドへのパスが存在するか

のチェックしかしていない.というわけで,

  • コマンドへのパスが存在していて,かつ
  • コマンドが実行可能かどうか

が成り立つかチェックするようにスクリプトを改造.

if [ -x `which $CMD` ]; then
    echo "$CMD already exists."
    exit 0
fi

第3稿: 文字列化が必要

第2項では,スクリプトが存在しない場合でもif文の中が実行されてしまう.
その理由は以下のスクリプトを実行すれば分かる.

if [ -x ]; then
    echo "こっちが実行される"
else
    echo
fi

if [ -x "" ]; then
    echo
else
    echo "こっちが実行される"
fi

つまり,-x には文字列を与えたほうがいい,ということなので第3稿.

if [ -x "`which $CMD`" ]; then
    echo "$CMD already exists."
    exit 0
fi