単一の if 文で複数の条件を連結する際にエラーが発生しました。

単一の if 文で複数の条件を連結する際にエラーが発生しました。

シェルスクリプトを作成していますが、スクリプトの一部にファイルが存在しないか、指定されたファイル名が空であること(つまり、ファイル名が指定されていない)を確認する必要があります。

これは私のコードです -

if ! [[ -e "$file_name" ] ||  [[ -z "$file_name" ]]  ; then
    echo "File doesn't exist"
    exit 2
else
    echo "ok"
fi

このスクリプトを実行すると、このコードスニペットで構文エラーが発生した場合、またはifステートメント内でコードを実行する必要があるときにelseコードが実行されます。

私のコードにいくつかの構文問題があることを知っています(論理も悪いですか?)。

これについてさらに調査しようとしましたが、必要なすべてをカバーする良いリソースが見つからないようです。

これについて既に多くの質問がありますが、問題は、これらの状況の1つでnot演算子をどのように使用するのかよくわかりません。

それでは、私は何を変えたいですか?

答え1

コードにタイプミスがあります。最初の設定をオフにする必要が]あります。]][[...]]

努力する:

if [[ -z "$file_name" || ! -e "$file_name" ]]; then
    echo>&2 "File doesn't exist"
    exit 2
else
    echo ok
fi

これはksh構文(現在のbashを含む他のいくつかのシェルでサポートされています)です。

if [ -z "$file_name" ] || [ ! -e "$file_name" ]; then
    echo>&2 "File doesn't exist"
    exit 2
else
    echo ok
fi

これは標準sh+[構文です。

Korn シェルの[ユーティリティと条件の構成は、対応するテスト式では否定演算子として理解されますが、シェル演算子を使用することもできます。[[...]]!!

if [ -z "$file_name" ] || ! [ -e "$file_name" ]; then
    echo>&2 "File doesn't exist"
    exit 2
else
    echo ok
fi

この[[...]]構成には独自の||演算子もあります。ただし、呼び出しの間にシェル演算子を使用する||ことも、メソッドのように条件式演算子の代わりにシェル演算子を使用することもできます。[[...]]!!

if [[ -z "$file_name" ]] || ! [[ -e "$file_name" ]]; then
    echo>&2 "File doesn't exist"
    exit 2
else
    echo ok
fi

この[ユーティリティに-oまたはただし、この演算子は廃止され、信頼できないテスト式を生成するため、使用しないでください。たとえば、当時、シェルの組み込み機能はエラー[ -z "$file_name" -o ! -e "$file_name" ]のため失敗しました。too many arguments[bashfile_name='='

これはロジックを変更しなくても-zシステムへのクエリを含まないため、小切手を最初に移動したため、コストが安くなります。 stdoutの代わりにstderrにエラーメッセージを送信するechoように最初のメッセージを置き換えました。echo>&2

関連情報