bashスクリプトの論理積

bashスクリプトにifがあり、次のいずれかをチェックする必要があります。 2つのファイルが存在しますが、存在しない場合はエコー一致する必要があります。

コード:

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

しかし、これは存在しません」なんらかの理由で動作しないようです。

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

bashスクリプトを初めて使用するため、何ができるかわかりません。間違っています。

コメント

  • 投稿された回答のいずれも実際に質問に対応しているとは思いません' 。テストを個別に試すとどうなりますか?それぞれに対して[[ ! -f /etc/.../... ]]; echo $?を実行してください。
  • 警告[[ -f xxx ]]は、xxxが存在し、が通常のファイル(または通常のファイルへのシンボリックリンク)である場合にtrueを返します。存在しない場合はfalseを返します'存在しない、または'存在するかどうか、または存在するが通常のファイル(ディレクトリ、パイプ、デバイス、ソケットなど)ではないかどうかを判断できない場合'存在しないファイルへのシンボリックリンク'が存在する場合、または存在する可能性がある場合'存在するかどうか、または通常のファイルではないかどうかを確認します… [[ -e $file ]] || [[ -L $file ]]は存在のテストに近いです。 ls -d -- "$file" > /dev/null 2>&1はさらに近くにあります。そして、原則として、この種のテストは競合状態につながります。たぶん'別の方法があります。

回答

If どちらかが必要な場合は、iv id = “1c6e578ed1ではなくORが必要です。 “>

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

しかし、あなたは次のように述べています。

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

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

ifステートメントがどのように評価されているかを確認するには、。

#!/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 $ 

コメント

  • エコーする" match " ifどちらのファイルも存在しません。存在する場合、一致するファイルは出力されません。-xで試してみます
  • その場合、元のコードで問題ありません。実際、私にとっては機能します。

回答

このようにすべきではありませんか? Aはファイル、またはBはファイル、次にblablaです。

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

回答

これはあなたがやろうとしていることにもうまくいくかもしれません。現在、bashではシングルブラケットは一般的に使用されていませんが、これはオプションです。 「-o」の使用は事実上「OR」操作であり、「!」条件を無効にします。

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

コメント

  • ドン' bash[を使用しないでください。それを除けば、これが質問にどのように答えるかわかりません。
  • [ ! -f ${var} -a ! -f {var}.class ] && echo "match"そうあるべきです。探求は次のとおりでした:それらが(両方とも)'存在しない場合、echo matchである必要があります。

回答

コードは要件を満たしています。どちらのファイルも見つからない場合は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" 

通常の設定では、デバッグメッセージを stderr stdout へのデータの流れが中断されないようにするためですが、初心者だと言ったので、ここでは避けました。 stdout

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Deep Theme Powered by WordPress