bash if文で条件付きスクリプト演算子-a -oをネストする方法

bash if文で条件付きスクリプト演算子-a -oをネストする方法

if文で-aと-oスクリプト演算子を結合するにはどうすればよいですか?例えば:

if [ ( -e file.txt -a -r file.txt ) -o ( -e file2.txt -a -r file2.txt ) ]; then .... fi

私はこのようなことができますか?このプログラムを実行しようとするとエラーが発生します。

ベストアンサー1

二重括弧を使用してください(参照:引用符なしの空白パラメータ拡張が二重括弧 "[["内では機能しますが、単一括弧"["内では機能しないのはなぜですか?)。およびテスト/単一括弧条件演算子の代わりに、および二重括弧&&条件演算子を使用してください。これはbash、ksh、zshでも機能しますが、通常のshでは機能しません。||-a-o

if [[ ( -e file.txt && -r file.txt ) || ( -e file2.txt && -r file2.txt ) ]]; then

または、単一の角かっこの場合は、角かっこ内とテスト演算子を使用するのではなく、角括弧の外側とシェル演算子を使用して単一[チェックを使用してグループ化します(参照&&||-a-o{ … }端末で括弧と中括弧の違いは何ですか?)。これはすべてのshスタイルのシェルで動作します。

if { [ -e file.txt ] && [ -r file.txt ]; } ||
   { [ -e file2.txt ] && [ -r file2.txt ]; }
then …

あるいは、単一の角かっこ内で\(\)または括弧を参照する他の方法)を使用することもできます(再度参照)。引用符なしの空白パラメータ拡張が二重括弧 "[["内では機能しますが、単一括弧"["内では機能しないのはなぜですか?説明のため)。ただし、ファイル名がテスト演算子((、、、、...)のように見える場合、条件は誤って解析される可能性があります。=-e

おすすめ記事