假设您有一个以空格为分隔符的字符串:
newline_separated=${space_separated// /$'\n'}
但是,您可能会问错问题。(不一定,例如,这可能会在makefile中出现。)用空格分隔的文件名列表实际上并不起作用:如果其中一个文件名包含空格,该怎么办?
如果程序接收文件名作为参数,请不要使用空格将它们连接在一起。用于"$@"
一一访问它们。尽管echo "$@"
打印的参数之间带有空格,但这是由于echo
:它打印的参数带有空格作为分隔符。somecommand "$@"
将文件名作为单独的参数传递给命令。如果要在单独的行上打印参数,则可以使用
printf '%s\n' "$@"
如果您确实有用空格分隔的文件名,并且希望将它们放在数组中以对其进行处理,则可以使用不带引号的变量扩展来拆分字符上的值IFS
(您需要使用禁用通配符扩展set -f
,否则使用glob模式将在值中扩展):
space_separated_list='/path/to/file1 /path/to/file2 /path/to/file3'
IFS=' '; set -f
eval "array=(\$space_separated_list)"
for x in "${array[@]}"; do …
您可以将其封装在一个函数中,该函数可以还原-f
设置和设置IFS
完成后的值:
split_list () {
local IFS=' ' flags='+f'
if [[ $- = *f* ]]; then flags=; fi
set -f
eval "$1=($2)"
set $flags
}
split_list array '/path/to/file1 /path/to/file2 /path/to/file3'
for x in "${array[@]}"; do …