回答:
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年代以降)のコマンドで正しい引用符が付けられたイディオムの唯一の正当な理由であり、そのイディオムは火事で死ぬ必要があります。-o
var1
var2
x$var
test
変数を引用するだけです:
[ -e "$VAR" ]
これは空[ -e "" ]
かどうかを評価し$VAR
ます。
はと評価されるため、バージョンは機能しません[ -e ]
。この場合、bashは単一の引数(-e
)が空でない文字列であるかどうかを確認するだけです。
マンページから:
testと[は、引数の数に基づく一連のルールを使用して条件式を評価します。...
1つの引数
引数がnullでない場合にのみ、式はtrueになります。
(また、このソリューションには、スペースを含むファイル名を操作するという追加の利点があります)
bash
ます。ただし、「バシズム」を最大限に活用するには、@ paxdiabloの回答を参照してください。