【问题标题】:Remove extra slash删除多余的斜线
【发布时间】:2018-09-18 20:11:54
【问题描述】:

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

for D in */ ; do echo $D done

结果是:

文件夹 1/

文件夹2/

文件夹3/

但是当我想像这样使用 $D 时:

mv *.zip /home/user/$D/zipfolder

它使两个 /-s 像 /home/user/folder1//zipfolder 它失败了

如何删除多余的 /?

【问题讨论】:

  • 多余的斜线应该不是问题,但您可以使用mv *.zip /home/user/${D}zipfolder 而不是当前路径来删除它。删除 / 后,我们需要将 $D 写为 ${D} 以避免评估 $Dzipfolder 而不是我们的 var。

标签: bash


【解决方案1】:

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

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

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

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

时不会发生任何事情

【讨论】:

  • ${D%/}?负索引需要 Bash 4.3 或更高版本,并且它总是会删除最后一个字符,无论它是什么。使用%/,如果最后一个字符不是/,则不会发生任何事情。
  • 主要匹配任何最后一个字符。 (bash 4.3:2014-02-26)
  • @BenjaminW。好决定!编辑了帖子,我认为是4.2添加了支持,也许我错了,要检查一下
  • 你说得对,我正在查看 array[-idx] 的作业,这是在 4.3 (mywiki.wooledge.org/BashFAQ/061) 中。
  • 在什么情况下for D in */会导致一些$D,而不是以/结尾?为此类案件做准备是否合理?
【解决方案2】:
for D in */ 
do
  echo $D
  ls /home/user/$D/zipfolder
done

mv *.zip 的例子没有多大意义,因为一旦文件被移动,为什么需要一个 for 循环?因此,我将样本更改为可重现性更好的样本。

Aaron 提出了我会给出的建议,但由于他没有回答,而且 Kristianmitk 的回答并不令人满意,我重复评论作为答案。

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

for D in */ 
do
  echo $D
  ls /home/user/${D}zipfolder
done

【讨论】:

  • @Aaron:谢谢,你是对的。在测试它时,我一定做错了什么。再次测试,它工作。已更正。
猜你喜欢
  • 2013-11-10
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 2021-07-11
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多