tech.guitarrapc.cóm

Technical updates

BashでFileやDirecotryの存在を確認する

シェルスクリプトのワンライナーは色々PowerShellを扱うに当たって勉強になります。 Ruby内部でshを呼び出すときに、変数を用いずにファイルやディレクトリの存在を確認して条件判定をする方法が面白かったのでどうぞ。

-fと-dを利用する

とりあえず実例で。 これは、~/ (ホームディレクトリ)にhoge.shファイル(拡張子.shの「ファイル」を一つ明示しなくてはいけない)存在する場合に、その*.shを~/binにcp (コピー)するワンライナーです。 if ~ testで直接ファイル有無を判定できる所が勉強になります。

if [ -f "~/hoge.sh" ]; then cp *.sh ~/bin ; fi

ディレクトリ判定なら-fではなく-dとすればOKです。

if [ -d bin ]; then echo "folder exist" ; fi

否定するなら

!を使います。例えば「~/binが存在しない場合にbinを作成する」ならこうです。

if [ ! -d ~/bin ]; then mkdir ~/bin; fi'

testでファイル指定は一つしかできない(ワイルドカード*が使えない)

結構困ります。PowerShellのswtichのようにループできないので、for文の中でtestに渡せばいいです。

for i in `ls -1 *.sh`; do if [ -f $i ]; then cp $i ~/bin ; fi; done

どんな時に使うの

不要な変数を設けずに済むので、ssh越しのshで取得した変数を利用できない場合に助かります。例えば、CapistranoでRubyコマンドをrunで実行する場合などにサクッと書けます。 PowerShellならパスの存在はTest-Pathで判定できるので楽ですね。

if(Test-Path ".\bin"){mkdir ~\bin}

New-Item使って書くならこうですね。

 if(!(Test-Path ".\bin")){New-Item -Path ~\bin -ItemType directory}