我试图按照答案 How do I compare two string variables in an 'if' statement in Bash?, 但是接受的解决方案不起作用。从你可以看到 下面的脚本,我的语法遵循该问题的解决方案 给我这里发现的错误 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.
从输出中可以看出,两个值都是相同的。但是,当脚本比较两个变量时,它认为它们是不同的值。
这是因为价值观是不同的类型吗?我在 if语句中使用了错误的比较运算符吗?提前谢谢。
答案 0 :(得分:2)
在做了一些搜索之后,我发现比较目录内容有点是验证两个变量都指向同一目录的有效方法。
这是一种方法:
#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看到第二种方法。此方法的问题在于,此代码不知道/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
希望这对某人有帮助!