回答:
if [ ! -z "$var" ] && [ -e "$var" ]; then
# something ...
fi
-aたものの代わりにこれが助言されるのを見てとても嬉しい。
bashマンページから:
[[ expression ]]-条件式expressionの評価に応じて、0または1のステータスを返します。
そして、式の場合、オプションの1つは次のとおりです。
expression1 && expression2-expression1との両方expression2が真の場合は真。
したがってand、次のようにまとめることができます(-nの反対な-zので、を取り除くことができます!)。
if [[ -n "$var" && -e "$var" ]] ; then
echo "'$var' is non-empty and the file exists"
fi
ただし、この場合-e xyzzyは必要ないと思いxyzzy ます。ファイルが存在し、空の文字列を非常に簡単に処理できる場合はそうです。それが必要な場合は、実際には-z空でないチェックは必要ありません。
pax> VAR=xyzzy
pax> if [[ -e $VAR ]] ; then echo yes ; fi
pax> VAR=/tmp
pax> if [[ -e $VAR ]] ; then echo yes ; fi
yes
つまり、次のように使用します。
if [[ -e "$var" ]] ; then
echo "'$var' exists"
fi
[[ -e "$var" ]] && echo "'$var' exists"
if [ -n "$var" -a -e "$var" ]; then
do something ...
fi
bashタグがあり、POSIXについて言及されていないため、このバージョンとbash他のいくつかの最新のシェルで動作するバージョンを投稿します。
bashまたは他の最新のシェルの使用を想定している場合、推奨する理由はさらに少なくなり-aます。
[ "$var1" -o "$var2" ]; if var1=(との場合、またはが空でないかどうかではなく、空でないvar2=)かどうかをテストします。この種のあいまいさは、現代(つまり90年代以降)のコマンドで正しい引用符が付けられたイディオムの唯一の正当な理由であり、そのイディオムは火事で死ぬ必要があります。-ovar1var2x$vartest
変数を引用するだけです:
[ -e "$VAR" ]
これは空[ -e "" ]かどうかを評価し$VARます。
はと評価されるため、バージョンは機能しません[ -e ]。この場合、bashは単一の引数(-e)が空でない文字列であるかどうかを確認するだけです。
マンページから:
testと[は、引数の数に基づく一連のルールを使用して条件式を評価します。...
1つの引数
引数がnullでない場合にのみ、式はtrueになります。
(また、このソリューションには、スペースを含むファイル名を操作するという追加の利点があります)
bashます。ただし、「バシズム」を最大限に活用するには、@ paxdiabloの回答を参照してください。