シェルスクリプトを作成していますが、スクリプトの一部にファイルが存在しないか、指定されたファイル名が空であること(つまり、ファイル名が指定されていない)を確認する必要があります。
これは私のコードです -
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
[
bash
file_name='='
これはロジックを変更しなくても-z
システムへのクエリを含まないため、小切手を最初に移動したため、コストが安くなります。 stdoutの代わりにstderrにエラーメッセージを送信するecho
ように最初のメッセージを置き換えました。echo>&2