连接函数的所有参数的好方法是什么?
我现在得到的是迭代它们并连续附加它们:
func(){
concat=
for arg in "$@"
do
concat=$concat$arg
done
echo $concat
}
我想做一些类似的事情:
another_func() {
echo $(remove_spaces $@)
}
答案1
concat () (
IFS=''
printf '%s\n' "$*"
)
该函数使用"$*"
(双引号很重要),它将扩展为单个字符串,其中位置参数(参数)的值与$IFS
作为分隔符的第一个字符的值连接。
我们设置IFS
为空字符串,这意味着"$*"
将扩展到没有分隔符的所有参数连接。
$IFS
另请注意,我们通过将shell 脚本的其余部分( ... )
(而不是通常的{ ... }
.
在另一个函数中调用这个函数可能看起来像
other_func () {
printf '%s\n' "$( concat "$@" )"
}
或者更短,无需实际调用该concat
函数:
other_func () {
( IFS=''; printf '%s\n' "$*" )
}
要删除参数列表中的所有空格,请使用
printf '%s\n' "$*" | tr -d ' '
例如,
concat_delete_sp () {
printf '%s\n' "$*" | tr -d ' '
}
测试:
$ concat 1 2 3 "h h h" o o o
123h h hooo
$ concat_delete_sp 1 2 3 "h h h" o o o
123hhhooo
答案2
对于基于第二个示例的方法的少量资源快速解决方案:
func(){
a=$@;echo ${a// /}
}
通过这种方式,您将删除所有空格。但如果您打算使用包含空格的参数,请记住@kusalananda 的方法。
答案3
在zsh
shell 中,您可以使用j:separator:
参数扩展标志将数组的元素与任意分隔符连接起来。所以你可以这样做:
concat=${(j::)argv}
或者
concat=${(j::)@}
$argv
连接aka数组的元素,$@
而不必修改像这样的全局参数$IFS
。
如果只是要打印参数,使用类似 Bourne 的 shell,您始终可以这样做:
concat() {
printf %s "$@" || return
[ "$#" -eq 0 ] || printf '\n' # empty output if no argument
}
andprintf
的内置函数还可以将结果存储在变量中:bash
zsh
printf -v variable %s "$@"
通过fish
shell,您可以使用:
echo -s -- $argv
(如果是空列表,则打印空行$argv
)。