0

我试图遵循 如何在 Bash 中的“if”语句中比较两个字符串变量的答案?,但接受的解决方案不起作用。正如您从下面的脚本中看到的那样,我的语法遵循该问题的解决方案,这给了我在此处找到的错误 Bash syntax error: "[[: not found"。是的,我也尝试了他们的解决方案。

我有以下脚本,我试图从目录中删除所有数据。在我删除所有数据之前,我想将一个变量与一个标准输出值进行比较,以验证我是否拥有正确的目录。

为了避免从错误的目录中删除所有数据,我试图将脚本中的变量与存储在 *.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.

从输出中可以看出,这两个值是相同的。但是,当脚本比较这两个变量时,它认为它们是不同的值。

这是因为值是不同的类型吗?我在if 语句中使用了错误的比较运算符吗?提前致谢。

4

1 回答 1

3

在进行了更多搜索之后,我发现比较目录内容是一种验证两个变量是否指向同一个目录的有效方法。

这是一种方法:

#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

如果其中一个目录是无效路径,则条件会捕获问题并且不会尝试删除目录内容。

如果目录路径不同但指向有效目录,则条件语句会看到它们具有不同的内容,并且不会尝试删除目录内容。

如果两个目录路径不同并指向有效目录,并且这些目录的内容相同,则脚本将删除其中一个目录中的所有内容。所以,这不是一个万无一失的方法。

第二种方法可以在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 回答