我继承了一个shell脚本。它所做的一件事是解析文件名列表。对于列表中的每个文件名,它执行以下命令:
fs_item="`echo ${fs_item%/}`"
这个命令(在这种情况下,我认为,在最后一次斜杠之后删除所有内容的一部分)是用一个空格替换filename中的空格:
in: aa bbbb ccc
out: aa bbbb ccc
此时文件名已损坏。
所以,问题是:我能以某种方式告诉bash不要替换空格吗?
答案 0 :(得分:1)
摆脱反引号和echo命令。在这种情况下,它比无用更糟糕,因为它不会增加任何东西,并导致你试图在这里解决的问题。
fs_item="${fs_item%/}"
答案 1 :(得分:0)
回声真的有必要吗?你可以简单地删除它:
fs_item="${fs_item%/}"
如果您的实际问题有所不同,并且您无法摆脱回声(或其他一些命令调用),则添加一些引号应该有效:
fs_item="`echo \"${fs_item%/}\"`"
运行反引号echo
命令时,空格消失。内部字段分隔符包含空格字符,因此由一个或多个空格的序列分隔的单词将作为单独的参数传递给echo
。然后,echo只打印由单个空格分隔的参数。
由于我们在内部字段分隔符主题上,更改IFS也应该有效(但通常在脚本的其他地方有其他可能不良影响):
IFS=$'\n'
这会将内部字段分隔符设置为换行符。在此之后,空格不再被视为列表的分隔符。 echo命令只接收一个参数(除非你的文件名中包含换行符),空格将保持不变。
答案 2 :(得分:0)
尝试将IFS设置为其他内容,例如IFS = “”