删除额外的斜线

时间:2018-04-09 12:15:17

标签: bash

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

for D in */ ; do echo $D done

结果是:

folder1 /

folder2 /

folder3 /

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

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

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

如何删除额外的/?

2 个答案:

答案 0 :(得分:1)

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

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

但正如下面评论中正确建议的那样,可能是你没有斜线作为最后一个字符的情况,仍然会删除最后一个字符上方的解决方案......

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

时没有任何反应

答案 1 :(得分:1)

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

使用mv * .zip的示例没有多大意义,因为一旦文件被移动,为什么还需要for-loop?所以我将样本更改为更好的可重复性。

亚伦提出了我会给出的建议,但由于他没有回答,而克里斯蒂安米特克的回答并不令人满意,我重复评论作为答案。

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