Bash 删除多余的斜杠

Bash 删除多余的斜杠,bash,Bash,我的脚本读取当前目录中文件夹的名称: *中的D的;做 echo$D 完成 结果是: 文件夹1/ 文件夹2/ 文件夹3/ 但当我想使用$D时,如下所示: mv *.zip /home/user/$D/zipfolder 它生成两个/-s,如/home/user/folder1//zipfolder 但它失败了 如何删除额外的/?如果您使用的是bash版本4.2或更高版本,则可以使用${D:0:-1},因为添加了对负长度的支持 如果您使用的是早期版本,则需要编写${D:0:${D}-1} 但正如下

我的脚本读取当前目录中文件夹的名称:

*中的D的
;做
echo$D
完成

结果是:

文件夹1/

文件夹2/

文件夹3/

但当我想使用$D时,如下所示:

mv *.zip /home/user/$D/zipfolder
它生成两个/-s,如/home/user/folder1//zipfolder 但它失败了


如何删除额外的/?

如果您使用的是bash版本4.2或更高版本,则可以使用
${D:0:-1}
,因为添加了对负长度的支持

如果您使用的是早期版本,则需要编写
${D:0:${D}-1}

但正如下面的一条评论中正确建议的那样,可能是在最后一个字符没有斜杠的情况下,仍然使用该解决方案,最后一个字符上面的字符将被删除


如果这是不可接受的,您可能希望使用
${D%/}
,因为当最后一个字符不是/

时不会发生任何情况。如果您使用的是bash版本4.2或更高版本,则可以使用
${D:0:-1}
作为对负长度的支持

for D in */ 
do
  echo $D
  ls /home/user/$D/zipfolder
done
如果您使用的是早期版本,则需要编写
${D:0:${D}-1}

但正如下面的一条评论中正确建议的那样,可能是在最后一个字符没有斜杠的情况下,仍然使用该解决方案,最后一个字符上面的字符将被删除

如果这是不可接受的,您可能希望使用
${D%/}
,因为最后一个字符不是/

for D in */ 
do
  echo $D
  ls /home/user/$D/zipfolder
done
使用mv*.zip的示例没有多大意义,因为一旦文件被移动,为什么需要for循环?所以我把样品改成了更好的复制品

Aaron提出了我应该给出的建议,但由于他没有回答,而且克里斯蒂安米特克的回答也不令人满意,我重复这一评论作为回答

a) 两刀不痛

  ls a/b
  ls a//b
  ls a/./b
所有文件都计算到同一目录。这在您的情况下很方便,因为斜杠是变量名的自然终止符

  ls a/b/c
  ls a/bb/c
  ls a/bb/./c
  D=bb/
  ls a/$D/c 
  ls a/$D./c 
即使点也会终止变量名,因此最后一行也会起作用

b) 如果您对两个斜杠感到恼火,可以使用大括号(这是一种规范的方式)将变量名与周围的字符隔离开来:

  ls a/${D}c

使用mv*.zip的示例没有多大意义,因为一旦文件被移动,为什么需要for循环?所以我把样品改成了更好的复制品

Aaron提出了我应该给出的建议,但由于他没有回答,而且克里斯蒂安米特克的回答也不令人满意,我重复这一评论作为回答

a) 两刀不痛

  ls a/b
  ls a//b
  ls a/./b
所有文件都计算到同一目录。这在您的情况下很方便,因为斜杠是变量名的自然终止符

  ls a/b/c
  ls a/bb/c
  ls a/bb/./c
  D=bb/
  ls a/$D/c 
  ls a/$D./c 
即使点也会终止变量名,因此最后一行也会起作用

b) 如果您对两个斜杠感到恼火,可以使用大括号(这是一种规范的方式)将变量名与周围的字符隔离开来:

  ls a/${D}c


额外的斜杠应该不会有问题,但是您可以使用
mv*.zip/home/user/${D}zipfolder
而不是当前路径来删除它。删除
/
后,我们需要将
$D
写为
${D}
,以避免计算
$Dzipfolder
而不是我们的var。额外的斜杠应该不是问题,但您可以使用
mv*.zip/home/user/${D}zipfolder
而不是当前路径来删除它。删除
/
后,我们需要将
$D
写为
${D}
,以避免计算
$Dzipfolder
而不是我们的变量或
${D%/}
?负索引需要Bash 4.3或更高版本,并且无论最后一个字符是什么,它都会删除它。对于
%/
,如果最后一个字符不是
/
,则不会发生任何事情。主要是匹配任何最后一个字符。(bash 4.3:2014-02-26)@BenjaminW。好球!编辑了这篇文章,我想它是在4.2中添加了支持,也许我错了,我想看看你是对的,我在4.3()中查看了
数组[-idx]
中的赋值。在什么情况下,
在*/
中的D可以导致一些$D,而不是以
//code>结尾?为这种情况做准备是否合理?或者
${D%/}
?负索引需要Bash 4.3或更高版本,并且无论最后一个字符是什么,它都会删除它。对于
%/
,如果最后一个字符不是
/
,则不会发生任何事情。主要是匹配任何最后一个字符。(bash 4.3:2014-02-26)@BenjaminW。好球!编辑了这篇文章,我想它是在4.2中添加了支持,也许我错了,我想看看你是对的,我在4.3()中查看了
数组[-idx]
中的赋值。在什么情况下,
在*/
中的D可以导致一些$D,而不是以
//code>结尾?为这种情况做准备合理吗?@Aaron:谢谢,你说得对。我一定是在测试时做错了什么。再次测试,它成功了。更正。@Aaron:谢谢,你说得对。我一定是在测试时做错了什么。再次测试,它成功了。更正。