【问题标题】:How to check if the folders are the same using variables in Bash? [duplicate]如何使用 Bash 中的变量检查文件夹是否相同? [复制]
【发布时间】:2019-01-06 01:10:14
【问题描述】:

鉴于下面的 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 定义了相同的路径/文件夹,没有'/'作为最后一个字符,字符串比较结果为假。即使我在同一个文件夹中,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 系统 - 我不确定它是否应该有所作为)

非常感谢..

【问题讨论】:

    标签: linux bash macos scripting directory


    【解决方案1】:

    如果您只关心字符串相等性,您可以使用 ${VAR_LOG%/} 扩展从 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(硬链接)的不同文件名在 -ef 测试中将评估为 0

    【讨论】:

      猜你喜欢
      • 2020-10-21
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 2014-02-05
      • 1970-01-01
      • 2018-07-03
      相关资源
      最近更新 更多