Bashスクリプトの論理AND

Bashスクリプトの論理AND

私のbashスクリプトの1つは、ifこれら2つのファイルのいずれかが存在することを確認し、存在しない場合は一致を再表示する必要があります。

コードがあります。

if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

しかし、これは何らかの理由で動作しないようです。

私はこれら2つのファイルが存在しないと110%確信しています。エラーは発生せずif

私はbashスクリプトに初めて触れたので、何が間違っているのかわかりません。

答え1

欲しいなら誰でもまあ、あなたが望むものではORありませんAND

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
  • 一方または両方のファイルが見つからない場合は一致します。
  • matchあなたのコードは、次の場合にのみコードを印刷します。両方存在しない。

しかし、、そう言います:

私はこれら2つのファイルが存在しないと110%確信しています。エラーは発生せず、ifを入力しません。

だからあなたの声明は矛盾しています。ファイルの少なくとも1つ〜しなければならない存在する、もしあなたは走っているそれパスワード。

if文がどのように評価されるかを見るには、run itを使用してください-x

#!/bin/bash -x
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

これで実行プロセスを確認できます。

$ ./test.sh
+ [[ ! -f /etc/benchmarking/code ]]
+ [[ ! -f /etc/benchmarking/code.class ]]
+ echo match
match
$ 

答え2

こんなことはありませんか? Aはファイル、Bはファイル、blablaです。

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; 
then  
  echo "match"
fi

答え3

これはあなたがしたいことにも適しているかもしれません。今日、単一の括弧は、あまり一般的ではありませんが、bashまだオプションです。使用は-o実際には「OR」演算であり、!条件を無効にします。

var=/etc/benchmarking/code
[ ! -f "$var" -o ! -f "$var.class" ] && echo "match"

答え4

matchコードは目的のアクションを実行します。ファイルが見つからない場合は印刷します。

matchだから印刷しない理由は別の場所にあります。複数のデバッグメッセージでコードブロックを囲み、完了できるコードブロックに到達したことを確認する必要があります。たとえば、次のようになります。

echo '@ About to enter if...fi block'
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
echo '@ Finished if...fi block'

私が一般的に好むのはデバッグメッセージです標準エラーデータフローが中断されないように標準出力ところで、ここではあなたが初心者と言ったのでそれを避けました。以下は、作成方法を示す例です。標準エラー:

echo '@ About to enter if...fi block' >&2

関連情報