私はこのコードを持っています:
#!/bin/bash
num=${1:-undefined}
cmd=$(which {banner,echo} | head -n1)
until [[ "$num" =~ ^[0-9]+$ ]]; do
read -p "Type a number: " num
done
for ((num;num>=0;num--)); do
$cmd $num
sleep 1
done
しかし、プログラムがインストールされているかどうかを知るより良い方法があると思います。私はこれを試しました。しかし、私はそれが明確ではないと思います。
which banner && cmd=banner || cmd=echo
cmd=$(eval 'which '{banner,echo}'||' :)
cmd=$(which {banner,echo} | head -n1)
cmd=$(which banner || which echo)
私は他のものよりも3を好むが、誰かがこれを行うための良い方法を見つけるのを助けることができると思いました。type
または必要に応じてhash
使用を受け入れます。command
これは簡潔なコードチャレンジなので、一行にして短く保ち、変数名やコマンド(||
、&&
などは除く)を繰り返さないようにしました。
ベストアンサー1
関数ベースのアプローチは、最も明確なコードを生成します。少なくとも2つのバリエーションがあり、そのうちの1つはFloHimが上記のコメントで提案したものです(これは私の好きな方法ではありません)。
function myprint
{
if type banner >/dev/null
then banner "$@"
else echo "$@"
fi
}
myprint "Hello World!"
または - 私が好むバリアント - 使用条件付き関数の定義:
if type banner >/dev/null
then function myprint { banner "$@" ;}
else function myprint { echo "$@" ;}
fi
myprint "Hello World!"
if
呼び出しごとの条件付きオーバーヘッドがなく、文字列や変数式を繰り返す必要はありません(他の提案のように)。