Bret Joseph Asked: 2018-12-14 02:19:32 +0800 CST2018-12-14 02:19:32 +0800 CST 2018-12-14 02:19:32 +0800 CST 如何使用括号进行扩展,但在输出中使用逗号而不是空格作为分隔符? 772 我需要这样做IFS=",";echo {1..5}才能输出1,2,3,4,5而不是1 2 3 4 5. 如何制作 bash echo {1..5} 并用逗号输出值? bash-expansion 5 个回答 Voted Sir Jo Black 2018-12-14T02:30:44+08:002018-12-14T02:30:44+08:00 尝试使用: seq --separator="," 1 5 Best Answer ilkkachu 2018-12-14T12:09:50+08:002018-12-14T12:09:50+08:00 使用 Bash 的内置函数: 这有点难看,因为我们需要分隔5以避免尾随逗号: $ printf '%s,' {1..4}; echo 5 1,2,3,4,5 虽然因为printf可以直接输出到变量,但可以解决这个问题,并通过参数扩展删除最后的逗号: $ printf -v tmpvar "%s," {1..5}; echo "${tmpvar%,}" 1,2,3,4,5 或 with "$*",它使用 的第一个字符连接IFS。这会破坏全局状态,但您可以通过在子shell或函数中运行它来轻松避免这种情况local IFS: $ IFS=,; set -- {1..5}; echo "$*"; 1,2,3,4,5 如果限制在变量中,那么使用循环手动执行它可能是最简单的,因为您不能将变量用作大括号扩展范围中的端点。同样,上限是在特殊情况下: a=1; b=5 for (( i=a ; i<b ; i++ )); do printf "$i,"; done; printf "$b\n" fra-san 2018-12-14T12:55:05+08:002018-12-14T12:55:05+08:00 这更多是为了进一步扩展扩展而不是提供实际的解决方案:以下内容比其他答案中提出的替代方案更简洁和有效。 在 Bash 中,内部字段分隔符 ( IFS) 不用于大括号扩展——因此,IFS=","; echo {1..5}它不会像您希望的那样工作。但是,在扩展其他一些内容时使用它,包括: 位置参数 关于特殊参数的扩展*,引用man bash: 当扩展出现在双引号内时,它会扩展为一个单词,每个参数的值由 IFS 特殊变量的第一个字符分隔。 我们可以用一个函数来举例说明: $ function fnc () { > IFS=',' > printf '%s\n' "$*" > } $ fnc {1..5} 1,2,3,4,5 请注意,此函数还设置IFS调用环境的值。这可以通过将函数体括在圆括号(fnc () ( IFS=... )即POSIX,但在多个 shell 中可用),或在函数结束之前设置回其原始值。local IFS=,localIFS 数组 当使用下标访问数组的项目时*,再次引用man bash: 如果单词是双引号,则${name[*]}扩展为单个单词,其中每个数组成员的值由 IFS 特殊变量的第一个字符分隔,... 示例(同样,不要忘记设置IFS回适当的值): $ arr=( {1..5} ) # Populate an array with brace expansion and compound assignment $ IFS=',' $ echo "${arr[*]}" # Reference all the items with the * subscript 1,2,3,4,5 RudiC 2018-12-14T11:51:31+08:002018-12-14T11:51:31+08:00 如果您允许空格和逗号,请尝试 $ echo {1..5}, 1, 2, 3, 4, 5, Jeff Schaller 2018-12-14T12:35:34+08:002018-12-14T12:35:34+08:00 由于您使用的是数字大括号扩展,因此唯一会出现的空格是数字之间的空格,因此您可以对结果进行后处理: output=$(echo {1..5} | tr ' ' ',') 或者 output=$(echo {1..5} | sed 's/ /,/g')
尝试使用:
使用 Bash 的内置函数:
这有点难看,因为我们需要分隔
5
以避免尾随逗号:虽然因为
printf
可以直接输出到变量,但可以解决这个问题,并通过参数扩展删除最后的逗号:或 with
"$*"
,它使用 的第一个字符连接IFS
。这会破坏全局状态,但您可以通过在子shell或函数中运行它来轻松避免这种情况local IFS
:如果限制在变量中,那么使用循环手动执行它可能是最简单的,因为您不能将变量用作大括号扩展范围中的端点。同样,上限是在特殊情况下:
这更多是为了进一步扩展扩展而不是提供实际的解决方案:以下内容比其他答案中提出的替代方案更简洁和有效。
在 Bash 中,内部字段分隔符 (
IFS
) 不用于大括号扩展——因此,IFS=","; echo {1..5}
它不会像您希望的那样工作。但是,在扩展其他一些内容时使用它,包括:位置参数
关于特殊参数的扩展
*
,引用man bash
:我们可以用一个函数来举例说明:
请注意,此函数还设置
IFS
调用环境的值。这可以通过将函数体括在圆括号(fnc () ( IFS=... )
即POSIX,但在多个 shell 中可用),或在函数结束之前设置回其原始值。local IFS=,
local
IFS
数组
当使用下标访问数组的项目时
*
,再次引用man bash
:示例(同样,不要忘记设置
IFS
回适当的值):如果您允许空格和逗号,请尝试
由于您使用的是数字大括号扩展,因此唯一会出现的空格是数字之间的空格,因此您可以对结果进行后处理:
或者