好的,我是bash的新手,并且在for循环中将字符串与另一个字符串进行比较时遇到了一些问题。
#loop through usb repo main folder to gather file names. Then check in that folder to find out if 'repodata' exists. If it does then do a createrepo -update if not then run a regular createrepo to make the file
RepoPath="/media/My Passport/RHEL_Repo/rhel-6-workstation-all"
for j in "$RepoPath"/*
do
if [[ "$j" != "$RepoPath/repodata" ]]
then
for repoDir in "$j"/*
do
#I would like this to evaluate if the directory ends with a folder named "repodata"...it is currently incomplete
if [[ -d "$repoDir"]]
then
echo "$repoDir"
echo folder exists
#createrepo -v -update /media/My Passport/RHEL_Repo/rhel-6-workstation-all/$j
else
echo "$repoDir"
echo does not exist
#createrepo -v /media/My Passport/RHEL_Repo/rhel-6-workstation-all/$j
fi
done
else
echo Incorrect Eval
fi
done
问题是变量字符串“RepoPath”中有一个空格。这导致循环将前半部分分离为第一个var而第二个分成另一个是外翻路径。内部嵌套的“if”然后评估为“else”并打印每个片段并且echo“不存在”。
我对此感到困惑,并且想知道是否有人可以帮我修复这个问题,这个问题似乎是由路径变量中的空间引起的。感谢。
答案 0 :(得分:1)
您在变量$RepoPath
周围遗漏了一些双引号:
if [[ "$j" != "$RepoPath/repodata" ]]
您可以将整个字符串包装在相同的引号中,没有任何问题。 实际上,您不需要这里的引号,因为您正在使用bash的增强型[[
,但这仍然是一种很好的做法。
此外:
for repoDir in "$j"/*
这里,*
应保持不加引号,以便扩展,而不是按字面解释。这个肯定需要引用。