我想知道以下内容:
1.为什么这个不工作的例子不工作。
1.是否有比工作示例中给出的方法更干净的方法。
- 非工作示例 *
> ids=(1 2 3 4);echo ${ids[*]// /|}
1 2 3 4
> ids=(1 2 3 4);echo ${${ids[*]}// /|}
-bash: ${${ids[*]}// /|}: bad substitution
> ids=(1 2 3 4);echo ${"${ids[*]}"// /|}
-bash: ${"${ids[*]}"// /|}: bad substitution
- 工作示例 *
> ids=(1 2 3 4);id="${ids[@]}";echo ${id// /|}
1|2|3|4
> ids=(1 2 3 4); lst=$( IFS='|'; echo "${ids[*]}" ); echo $lst
1|2|3|4
在上下文中,sed命令中用于进一步分析的分隔字符串。
4条答案
按热度按时间e4yzc0pl1#
数组到
bash
中的字符串1.数组到字符串,使用
$IFS
因为括号是用来分隔数组,而不是字符串:
一些样品:用两个字符串填充
$ids
:a b
和c d
最后:
其中数组被组装,由
$IFS
的第一个字符分隔,但在数组的每个元素中用|
替换空格。当您这样做时:
你把array
ids
通过一个空格合并后的字符串构建转移到一个类型为string的新变量中。注意:当
"${ids[@]}"
给予一个 * 空格分隔 * 的字符串时,"${ids[*]}"
(使用星星*
而不是at符号@
)将呈现一个由$IFS
的第一个字符分隔的字符串。man bash
说:使用
$IFS
:字面上是一个
space
,一个tabulation
和 (意思是或) 一个line-feed
。第一个字符是空格。*
的使用将与@
的使用相同。但是:
注意:
IFS=: read -a array < <(...)
行将使用:
作为分隔符,不会永久设置$IFS
。这是因为输出行#2
将空格作为分隔符。1.1使用函数 localize
$IFS
只打印数组
或者合并数组。
2.字符串数组到字符串数组(
[@]
vs[*]
)以下两者之间存在显著差异:
"$@"
和"${var[@]}"
生成字符串数组"$*"
和"${var[*]}"
生成唯一字符串仔细阅读:
man '-Pless +/Special\ Parameters' bash
为此,我将引号每个参数,以便不会在 * 命令行扩展 * 时被
$IFS
拆分,使用双引号允许 * 变量扩展 *。其中:
$IFS
字符分隔。注意:
${var// /something}
会用 something 替换每一个 spaces,但是${var[*]}
只会使用一个第一个字符来合并数组:是的:通过使用
${var// / ... }
,您可以将1空格替换为您想要的任何内容,包括更多空格。3.数组转字符串,使用
printf
正如我们所看到的,使用
$IFS
仅限于1个字符。如果需要在字段之间插入更多字符。使用printf
:3.1数组到字符串,通过
printf
,转换成函数或者合并数组。
mv1qrgav2#
您也可以使用
printf
,无需任何外部命令或操作IFS:iyzzxitl3#
您的第一个问题已经在F. Hauri's answer中得到了解决。下面是连接数组元素的规范方法:
有些人会大声说
eval
是邪恶的,但它在这里是完全安全的,这要归功于单引号。这只有好处:没有子shell,IFS
没有全局修改,它不会修剪尾随的换行符,它非常简单。x6h2sr284#
一个将参数数组连接到分隔字符串的实用函数:
输出量:
现在有了Bash 4.2+的nameref变量,不再需要使用子shell输出捕获。