bashのifとtestとサブシェル

ハマったので適当なまとめ

if 1

1はコマンドではないので文法エラー

if x

xはコマンドではないので文法エラー。

ifの次にはコマンドを書かなければならない。

if uname

unameはコマンドで正常終了して0を返す。0は真と扱われる。

uname -b

unameには-bというオプションはないので、エラーになり1が返される。0以外は偽と扱われる。

if $(command)

$(command)はコマンドではなく、commandを実行した結果の標準出力なので文法エラー。

if [ $(command) ]

[はコマンド。$(command)[の引数、$(command)commandを実行し結果の標準出力の文字列を表す。][の引数。[の終わりを表す。[は文字列が与えられたときは長さが0でないときは真になる。unameを実行すると標準出力に文字を出力するので真になる。

if [ $(command -b) ]

uname -bはエラーになって標準出力にはなにも出力されないので、[には長さ0の文字列が与えられ偽になる。

問題:システムの種類によって処理を分ける

システムがMingかどうかを判定するif unameの出力がgrep -qの入力になり、MINGWで始まるときは0を返すので真になる。-qは標準出力に結果を表示しない。つまり戻り値だけを見る。

別回答

unameの出力がMINGWで始まるときはgrepが標準出力に結果を表示するので、それがあれば真になる。

ここでは[[[の違いは考慮してないが同じだと思う。[は古い形式のただのコマンド。[[はバッシュの組み込みだと思う。[[のほうがいいといわれている。

ダメな回答

grep -qは決して標準出力に出力しないので常に偽になる。

ソース

https://github.com/ambiesoft/blogprogs/tree/master/5786

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)