我试图将目录名称与文本文件中的一行进行比较。然而,即使目录的名称和文本文件中的行相同,我似乎也无法让它们“相等”。
#!/bin/bash
for dir in /mnt/hgfs/VM/Command_for_Dozing_Logs/*/
do
dir=${dir%*/}
dir=${dir:(-10)}
echo "Dir:$dir:"
while read p; do
echo "File:$p:"
if [ "$dir" == "$p" ]
then
echo "Variables are equal!"
fi
done </mnt/hgfs/VM/copiedFolders.txt
done
我尝试匹配的文件夹位于Command_for_Dozing_Logs文件夹。里面的文件夹是:
2015.07.07
2015.07.08
我的文本文件是这样的:
2015.07.08
2015.05.23
所以应该至少有一场比赛,对吧?但不是。我将其作为我的输出:
Dir:2015.07.07:
:ile:2015.07.08
:ile:2015.05.23
Dir:2015.07.08:
:ile:2015.07.08
:ile:2015.05.23
我真的很困惑这里发生了什么。为什么那个冒号会取代第一个字母?如何使两个变量匹配?
答案1
其原因(几乎可以肯定)是因为CR
文件中每一行的末尾都有一个字符。这是在 Windows 和 Mac 系统上创建的文件的典型情况;基于 Linux/Unix 的系统用作NL
行结束符。
您可以使用此命令修复您的文件,从而允许您使用/tmp/fixed_copiedFolders.txt
而不是原始文件。
tr -d '\015' < /mnt/hgfs/VM/copiedFolders.txt > /tmp/fixed_copiedFolders.txt
或者,您可以将其直接合并到您的脚本中:
#!/bin/bash
for dir in /mnt/hgfs/VM/Command_for_Dozing_Logs/*/
do
dir=${dir%*/}
dir=${dir:(-10)}
echo "Dir:$dir:"
tr -d '\015' </mnt/hgfs/VM/copiedFolders.txt |
while read p; do
echo "File:$p:"
if [ "$dir" == "$p" ]
then
echo "Variables are equal!"
fi
done
done