我的脚本读取当前目录中的文件夹名称:
for D in */ ; do
echo $D
done
结果是:
folder1 /
folder2 /
folder3 /
但是当我想像这样使用$ D时:
mv *.zip /home/user/$D/zipfolder
它使两个/ -s像/ home / user / folder1 // zipfolder 它失败了
如何删除额外的/?
答案 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