シェルスクリプトのワンライナーは色々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}