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