bash参数扩展更改原始字符串

时间:2009-07-27 14:50:31

标签: bash shell

我继承了一个shell脚本。它所做的一件事是解析文件名列表。对于列表中的每个文件名,它执行以下命令:

fs_item="`echo ${fs_item%/}`"

这个命令(在这种情况下,我认为,在最后一次斜杠之后删除所有内容的一部分)是用一个空格替换filename中的空格:

in:  aa bbbb              ccc
out: aa bbbb ccc

此时文件名已损坏。

所以,问题是:我能以某种方式告诉bash不要替换空格吗?

3 个答案:

答案 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 = “”