linux - 如何使用 Bash 中的变量检查文件夹是否相同?

标签 linux bash macos scripting directory

<分区>

给出下面的 bash 代码,我正在定义一个变量来表示一个文件夹,我正在检查它是否是一个文件夹。我什至可以使用变量名浏览它。

这里有一个小问题,我用“/”作为最后一个字符定义了文件夹的名称,因为制表符完成以这种方式完成了字符串。

#! /bin/bash


VAR_LOG='/var/log/'


echo $VAR_LOG
echo $PWD

echo "browsing to log directory"
cd $VAR_LOG
echo $PWD


if [ -d $VAR_LOG ]; then
    echo "$VAR_LOG is a directory"
fi

if [ ${VAR_LOG} != ${PWD} ]
then echo not same
else 
echo same
fi

但如您所见,$PWD 定义了相同的路径/文件夹,但没有将“/”作为最后一个字符,并且字符串比较结果为 false。即使我在同一个文件夹中,并且 cd $LOG_DIR 会将我带到同一个文件夹。

User1-MBP:log User1$ $HOME/tmp.sh 
/var/log/
/Users/User1
browsing to log directory
/var/log
/var/log/ is a directory
not same

那么,在 bash 中处理目录的最佳方式是什么?将它们保留为字符串有点容易出错。

(注意:这是一个 MacOS 系统 - 我不确定它是否会有所不同)

非常感谢..

最佳答案

如果您只关心字符串相等性,您可以通过使用 ${VAR_LOG%/> 扩展( 删除匹配的后缀模式)。这将从 VAR_LOG 中删除一个(最后一个 / 如果存在,如果不存在则保持不变:

if [ "${VAR_LOG%/}" != "${PWD}" ]; ...

但是,您也可以(并且可能应该)使用 -ef 测试:

FILE1 -ef FILE2 FILE1 and FILE2 have the same device and inode numbers

即:

if [ ! "${VAR_LOG}" -ef "${PWD}" ]; ...

确保两个文件/目录名称引用同一个文件。

这与目录无关,但引用相同 inode(硬链接(hard link))的不同文件名在 -ef 测试中的计算结果为 0

关于linux - 如何使用 Bash 中的变量检查文件夹是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51582864/

相关文章:

linux - 杀死除一个 python 脚本和 grep 进程之外的所有 python 脚本

php - 在 Mac OS X Yosemite 上安装 php-cgi

Ruby 脚本即服务

linux - 需要拔出/插入才能访问 USB 端口 Chrome 应用程序

bash - 使用 AWK 的最小-最大规范化

bash - shell命令含义(反斜杠和grep)

php - Linux 上 Apache 的文件权限错误

java - `touch` 在 Linux 上使用 ACL 的文件导致 "Operation not permitted"

c - dl_iterate_phdr 在 Mac 上等效

macos - 在 Mac OS X 上获取 CPU 描述