#! /bin/bash
if [ !\(-f new.bash -o -d new.bash\) ]
then
echo "Neither"
else
echo "yes"
fi
動作しますが、エラーが残ります:
/file_exist_or_not.bash
./file_exist_or_not.bash: line 3: [: too many arguments
yes
ところで、なぜ内側の括弧をエスケープする必要があるのですか?
Bash はスペースを使用してトークンを区切り、コマンドに引数として渡します (この場合、コマンドは ですtest
)。詳細については、man ページを参照しtest
てください。
解決するには、オペランドの間にスペースを追加する必要があります。
if [ ! \( -f new.bash -o -d new.bash \) ]
を使用bash
していて、POSIX との互換性を放棄してもかまわない場合は、次の手順が少し簡単になります。
if [[ ! ( -f new.bash || -d new.bash ) ]]; then
||
の代わりに使用でき-o
、かっこをエスケープする必要はありません。