在bash中,如何将N个参数连接在一起作为空格分隔的字符串
Posted
技术标签:
【中文标题】在bash中,如何将N个参数连接在一起作为空格分隔的字符串【英文标题】:In bash, how do I join N parameters together as a space separated string 【发布时间】:2012-08-30 07:01:09 【问题描述】:我正在尝试编写一个函数,它接受 n 个参数并将它们连接成一个字符串。
在 Perl 中是
my $string = join(' ', @ARGV);
但在 bash 中我不知道该怎么做
function()
??
【问题讨论】:
仅供参考,function
关键字是一个扩展,它使您的代码无缘无故地与 POSIX 不兼容(与 bash 的许多其他实际上增加价值的扩展相比);实际上不需要声明一个函数。
【参考方案1】:
查看 bash
手册页的特殊参数下的“*”条目。
join ()
echo "$*"
【讨论】:
澄清一下,$IFS
的第一个字符用于分隔符。
如果需要处理带引号的参数,其实正确的解决方案是"$@"
。
这里的目标是将所有参数折叠成一个字符串,因此$*
或$@
的选择无关紧要。或者更确切地说,由 join
的使用者来引用结果,而不管使用哪个参数来访问 args。
引用也可用于保护其他特殊字符,而不仅仅是单个空白字符。
"join" 可能打算使用 /usr/bin/join,因此 "spjoin" 可能是一个更安全的名称【参考方案2】:
对于直接的问题,chepner's answer ("$*"
) 是最简单的,但作为如何依次访问每个参数的示例:
func()
str=
for i in "$@"; do
str="$str $i"
done
echo $str#
【讨论】:
为了安全起见,您或许应该声明local str
和 local i
。 for i; do
默认处理 "$@"
但这显然只是一个简写。【参考方案3】:
这个行为类似于 Perl join
:
#!/bin/bash
sticker()
delim=$1 # join delimiter
shift
oldIFS=$IFS # save IFS, the field separator
IFS=$delim
result="$*"
IFS=$oldIFS # restore IFS
echo $result
sticker , a b c d efg
以上输出:
a,b,c,d,efg
【讨论】:
使用local IFS="$delim"
,您不必担心必须恢复它。【参考方案4】:
类似于 perreal 的回答,但带有一个子外壳:
function strjoin () (IFS=$1; shift; echo "$*");
strjoin : 1 '2 3' 4
1:2 3:4
Perl 的连接可以用多个字符分隔,并且在 bash 中使用起来足够快 (直接或使用别名或函数包装器)
perl -E 'say join(shift, @ARGV)' ', ' 1 '2 3' 4
1, 2 3, 4
【讨论】:
以上是关于在bash中,如何将N个参数连接在一起作为空格分隔的字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何在 bash shell 中将一个字符串拆分为多个字符串,至少用一个空格分隔?
如何在不折叠空格的情况下在 bash 脚本中拆分制表符分隔的字符串?