2016-06-17 8 views
2

クリアケースビューが存在するかどうかをテストし、削除コマンドが存在する場合にのみ実行します。私はLinux 6.x環境のシェルスクリプトからやろうとしています。私は1つのライナーと完全な "if"ステートメントの両方で自分の条件をフォーマットしようとしましたが、動作させることができないようです。 1つのライナーと完全な構文の両方を得るためには何が必要ですか?声明はまた、動作する「場合は、」ここで シェルスクリプトを使用してクリアケースビューを削除する場合は、ライナーを1つ使用してください。

は、その最新の状態

#!/bin/ksh 
# 
STREAMNAME=app_stream_int 
PVOB=domain_pvob 
VOB=domain_app 

viewdir=/opt/local/software/rational/viewstorage 
shareddir=/opt/shared/test 
storagedir=${shareddir}/viewstorage 
projectdir=${shareddir}/projects 

ctdir=/opt/rational/clearcase/bin 
viewname=$viewdir/test_$STREAMNAME.vws 
viewtag=test_$STREAMNAME 

echo "STREAMNAME $STREAMNAME - PVOB $PVOB - VOB $VOB" 
echo "Removing View if it exists ... \n" 

# [ $(${ctdir}/cleartool lsview ${viewname}) ] && { ${ctdir}/cleartool rmview ${viewname}; echo "view removed" } 

# [ ${ctdir}/cleartool lsview -long ${viewtag} ] && { ${ctdir}/cleartool rmview ${viewname}; echo "view removed" } 

# ${ctdir}/cleartool lsview -long ${viewtag} | grep "Tag" && { ${ctdir}/cleartool rmview ${viewname}; echo "view removed" } 

if [ ${ctdir}/cleartool lsview -long ${viewtag} | grep 'Tag' == "0" ] 
then 
    echo "view found" 
    ${ctdir}/cleartool rmview ${viewname} 
fi 

私はソリューションのワンライナータイプを好むだろうに、コードですが、。コマンドを提供

+0

の方法について: '" $ $ {viewname} ">/dev/null 2>&1 && {" $ {ctdir} "/ cleartool rmview" $ {viewname} ";エコー "ビューが削除されました"; } ' – bishop

+0

私はそれを試みます。エコー "ビューを削除できません"というエラー部分を追加したい場合、どうすればいいですか?また、可能であれば、これがどのように機能するか説明できますか? – adbdkb

+0

注:実際にビューを削除するには、タグの解除と登録解除が必要です。http://stackoverflow.com/a/4319090/6309のnukeviewを参照してください。 – VonC

答えて

1

が終了コードのUNIX-規則を、以下の一般ワンライナーは次のようになります。

command && { success1; success2; } || { failure1; failure2; } 

&&コマンドは(0で終了)を成功したときに実行すべきかを指定する以下のリスト、 ||に続くリストは、コマンドが失敗したときに何を実行すべきかを指定します。リストでは、すべてのコマンドが最後のものを含めてセミコロンで終了することに注意してください。あなたの特定のケースについては

が、これはそれがうまくいくようになっています。ここでは

"${ctdir}"/cleartool lsview "${viewname}" && { "${ctdir}"/cleartool rmview "${viewname}" && echo "view removed" || echo "cannot remove view"; } 

は、標準のコマンドを使用して、アクションでこのパターンの例である:

$ ls foo && { rm -f foo && echo 'removed' || echo 'not removed'; } 
ls: cannot access foo: No such file or directory 

$ touch foo 
$ ls foo && { rm -f foo && echo 'removed' || echo 'not removed'; } 
foo 
removed 

$ sudo touch /foo 
$ sudo chmod 600 /foo 
$ ls /foo && { rm -f /foo && echo 'removed' || echo 'not removed'; } 
/foo 
rm: cannot remove ‘/foo’: Permission denied 
not removed 
+0

もう一度ありがとうございます。あなたの以前の答えでは、 ""/dev/null 2>&1 "'の実行で "if"の評価でどのような役割が果たしましたか – adbdkb

+0

@adbdkb stdoutとstderrの両方が '/ dev/null'にリダイレクトされますそれらは無視されます。コマンド 'lsview'は終了値に対してのみ呼び出されます。 0(つまり、ビューが存在する)は、 '&&'が実行された後の2番目の部分を意味します。 1(ビューは存在しません)は、 '&&'が*実行されなかった後の2番目の部分を意味します。 – VonC

+0

'>/dev/null 2>&1'は出力とエラーを抑止します。それは不当な自由を取っていたので、私はこのバージョンでそれを削除しました。パスに空白がある場合は、 '$ {ctdir}'の前後に引用符を残しました。 – bishop

関連する問題