特に詳しく説明することもないですが [ ] (test) で使える演算子の -a (AND) と -o (OR) は POSIX では非推奨(廃止とマーク)となっているので移植性を重視する場合は使わないようにしましょう。[ 条件1 -a 条件2 ] の代わりに [ 条件1 ] && [ 条件2 ]、[ 条件1 -o 条件2 ] の代わりに [ 条件1 ] || [ 条件2 ] と書けば十分です。 -a と -o が不要ということは ( ) があってもしょうがないのでこちらも廃止されます。複雑な条件式は避けた方が良いと思いますが、優先順位を指定したいのであれば [ 条件1 ] && { [ 条件2 ] || [ 条件3 ]; } のように { } を使用します。( )を使って [ 条件1 ] && ( [ 条件2 ] || [ 条件3 ] ) と書いても動きますがサブシェルが生成され遅くなる