0

Bash の 'if' ステートメントで 2 つの文字列変数を比較するにはどうすればよいですか?の回答に従おうとしまし た。、しかし受け入れられた解決策は機能しませんでした。以下のスクリプトからわかるように、私の構文はその質問の解決策に従っており、 Bash syntax error: "[[: not found"というエラーが表示されます。はい、私も彼らの解決策を試しました。

ディレクトリからすべてのデータを削除しようとしている次のスクリプトがあります。すべてのデータを削除する前に、変数を stdout 値と比較して、正しいディレクトリがあることを確認したいと考えています。

間違ったディレクトリからすべてのデータを削除しないようにするために、スクリプト内の変数を *.ini.php ファイルに保存されているデータと比較しようとしています。

スクリプトは次のとおりです。

    #!/bin/bash
    #--- script variables ---
     #base path of the timetrex web folder ending with a / character
     timetrex_path=/var/www/timetrex/
     timetrex_cache=/tmp/timetrex/

    #--- initialize script---
     #location of the base path of the current version
     ttrexVer_path=$(ls -d ${timetrex_path}*.*.*)/
     #the timetrex cache folder
     ttrexCache_path=$(sed -n 's/[cache]*dir =*\([^ ]*\)/\1/p' < ${ttrexVer_path}timetrex.ini.php)/
     echo $timetrex_cache
     echo $ttrexCache_path



 #clear the timetrex cache
    if [[ "$ttrexCache_path" = "$timetrex_cache" ]]
    then
      #path is valid, OK to do mass delete
      #rm -R $ttrexCache_path*
      echo "Success: TimeTrex cache has been cleared."
    else
      #path could be root - don't delete the whole server
      echo "Error: TimeTrex cache was NOT cleared."
    fi

スクリプトの出力は次のようになります。

/tmp/timetrex/
/tmp/timetrex/
Error: Timetrex cache was NOT cleared.

出力からわかるように、両方の値は同じです。ただし、スクリプトが 2 つの変数を比較すると、それらは異なる値であると見なされます。

これは、値の型が異なるためでしょうか。if ステートメントで間違った比較演算子を使用していませんか? 前もって感謝します。

4

1 に答える 1

3

さらに検索を行った後、ディレクトリの内容を比較すると、両方の変数が同じディレクトリを指していることを確認するのに効果的な方法であることがわかりました。

これを行う1つの方法は次のとおりです。

#clear the timetrex cache
if [ "$(diff -q $timetrex_cache $ttrexCache_path 2>&1)" = "" ]
then
  #path is valid, OK to do mass delete
  rm -R ${ttrexCache_path}*
  echo "Success: TimeTrex cache has been cleared."
else
  #path could be root - don't delete the whole server
  echo "Error: TimeTrex cache was NOT cleared."
fi

ディレクトリの 1 つが無効なパスである場合、条件は問題をキャッチし、ディレクトリの内容を削除しようとしません。

ディレクトリ パスが異なっていても、有効なディレクトリを指している場合、条件ステートメントはそれらの内容が異なることを認識し、ディレクトリの内容を削除しようとしません。

両方のディレクトリ パスが異なり、有効なディレクトリを指しており、それらのディレクトリの内容が同じである場合、スクリプトはいずれかのディレクトリ内のすべてを削除します。SO、これは絶対確実な方法ではありません。

2 番目の方法は、 https://superuser.com/questions/196572/check-if-two-paths-are-pointing-to-the-same-fileで確認できます。この方法の問題点は、パスの末尾にa を追加する場合に重要な/tmp/timetrexとの違いをこのコードが認識していないことです。/tmp/timetrex/*

最終的に、この問題の最善の解決策は非常にシンプルです。元のコードの構文を変更するだけで済みます。

#clear the timetrex cache
if [ ${timetrex_cache} == ${ttrexCache_path} ] && [[ "${timetrex_cache: -1}" = "/" ]]
then
  #path is valid, OK to do mass delete
  rm -R ${ttrexCache_path}*
  echo "Success: TimeTrex cache has been cleared."
else
  #path could be root - don't delete the whole server
  echo "Error: TimeTrex cache was NOT cleared."
fi

これが誰かに役立つことを願っています!

于 2013-09-06T04:57:04.637 に答える