Bash 删除多余的斜杠
我的脚本读取当前目录中文件夹的名称: *中的D的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} 但正如下
;做
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:谢谢,你说得对。我一定是在测试时做错了什么。再次测试,它成功了。更正。