bashスクリプトでの論理AND


10

私が持っているif2つのファイルのいずれかが存在する場合、彼らはそれが試合をエコーすべき存在しない場合は、チェックする必要が私のbashスクリプトで。

私が持っているコード:

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

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

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

私はbashスクリプトを初めて使用するので、何が問題なのかわかりません。


投稿された回答が実際に質問に対応しているとは思いません。テストを個別に試すとどうなりますか?やる[[ ! -f /etc/.../... ]]; echo $?ごとに。
jw013 2012

警告[[ -f xxx ]]xxxが存在、通常のファイル(または通常のファイルへのシンボリックリンク)である場合、trueを返します。存在しない場合、または存在するかどうか、存在しないが通常のファイル(ディレクトリ、パイプ、デバイス、ソケットなど)ではない場合、またはシンボリックリンクの場合は、falseを返します。存在しないファイル、またはファイルが存在するかどうか、または通常のファイルではないかどうかを判断できない場合... [[ -e $file ]] || [[ -L $file ]]存在のテストに近いです。ls -d -- "$file" > /dev/null 2>&1さらに近いです。そして原則として、この種のテストは競合状態につながります。多分別の方法があります。
ステファンChazelas

回答:


12

どちらかが必要な場合は、必要ORではありませんAND

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
  • これは、一方または両方のファイルが欠落している場合に一致します。
  • コードはmatch両方が存在しない場合にのみ印刷されます。

しかし、あなたは言った:

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

したがって、あなたの発言はそれ自体と矛盾しています。そのコードを実行している場合、これらのファイルの少なくとも1つが存在している必要あります。

ifステートメントがどのように評価されているかを確認したい場合は、で実行し-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
$ 

どちらのファイルも存在しない場合は「一致」をエコーし​​、存在する場合は一致を出力しません。-xで試してみる
Peppercat101

その場合、元のコードで問題ありません。そして、それは実際に私のために働きます。
バハマート2012

3

それはこのようではないですか?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"

今まで使用しないでください[bash。それを除けば、これがどのように質問に答えるかはわかりません。
jw013 2012

[ ! -f ${var} -a ! -f {var}.class ] && echo "match"そのはず。クエストは次のとおりでした:彼ら(両方)が存在しない場合は、存在する必要がありecho matchます。
hschou 2016

0

コードは要件を満たします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'

私の通常の好みは、stdoutへのデータの流れの中断を避けるためにデバッグメッセージをstderrに送ることですが、あなたが初心者であると言ったので、ここではそれを避けました。stdoutに書き込む方法を示す1つの例を次に示します。

echo '@ About to enter if...fi block' >&2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.