Arrays 输出包含空格的元素的数组
我已经成功地创建了一个连接函数,它使用delimeter将数组连接到字符串:Arrays 输出包含空格的元素的数组,arrays,bash,Arrays,Bash,我已经成功地创建了一个连接函数,它使用delimeter将数组连接到字符串: function join() # Usage: string=$(join "delimeter" "${array[@]}" ) { local array=( "${@:2}" ) OLD_IFS="$IFS" IFS="$1" local string="${array[*]}" IFS="$OLD_IFS" echo "$string" } 我还尝试了一个拆分
function join() # Usage: string=$(join "delimeter" "${array[@]}" )
{
local array=( "${@:2}" )
OLD_IFS="$IFS"
IFS="$1"
local string="${array[*]}"
IFS="$OLD_IFS"
echo "$string"
}
我还尝试了一个拆分函数,它应该做相反的事情:
function split() # Usage: array=( $(split "delimeter" "$string") )
{
OLD_IFS="$IFS"
IFS="$1"
local array=( $2 )
IFS="$OLD_IFS"
echo "${array[@]}"
}
但是,当我使用split命令并且结果包含空格时,它将无法按预期工作。
例如:
最后一个元素“foo-bar”也被拆分。
我认为解决方案是您必须执行
array=(“$(split'|'“$string”)”
,但我可能不知道如何嵌套引号。问题在于split()
函数的末尾。将数组序列化回字符串!所以它也是由空格分隔的字符串,不能识别空格是否在项中。因此,我知道它不是很干净,但是您必须使用全局变量从split()
函数返回值(在示例中省略关键字local
,并简化调用,对for命令和其他一些修饰性更改加双引号,然后它就工作了…:
function split() # Usage: array=( $(split "delimeter" "$string") )
{
OLD_IFS="$IFS"
IFS="$1"
array2=( $2 )
IFS="$OLD_IFS"
}
array=( "foo" "bar" "baz" "foo bar" )
string=$(join "|" "${array[@]}")
echo $string
split "|" "$string"
for i in "${array2[@]}"
do
echo $i
done
不知道是否有更干净的方法来避免全局变量,但我怀疑。问题在您的
拆分()
函数。您将数组序列化回字符串!因此它也是由空格分隔的字符串,无法识别空格是否在项中。因此,我知道它不是很干净,但您必须使用全局变量从split()
函数返回值(在本例中,省略关键字local
,简化调用,并对for命令和其他一些修饰性更改使用双引号,它可以工作…:
function split() # Usage: array=( $(split "delimeter" "$string") )
{
OLD_IFS="$IFS"
IFS="$1"
array2=( $2 )
IFS="$OLD_IFS"
}
array=( "foo" "bar" "baz" "foo bar" )
string=$(join "|" "${array[@]}")
echo $string
split "|" "$string"
for i in "${array2[@]}"
do
echo $i
done
不知道是否有更干净的方法来避免全局变量,但我怀疑。请注意,IFS可以是函数中的局部变量,因此您不必备份和恢复其值:
join () { local IFS="$1"; local s="${@:2}"; printf "%s" "$s"; }
以下是需要评估的拆分实现:
# usage: split varName separator stringToSplit
split () {
local var="$1"
local IFS="$2"
set -- $3
echo "declare -a $var=( $(printf "\"%s\" " "$@") )"
}
示范
$ a=( foo bar "hello world" baz )
$ s=$(join , "${a[@]}")
$ echo $s
foo,bar,hello world,baz
$ split b , "$s"
declare -a b=( "foo" "bar" "hello world" "baz" )
$ eval $(split b , "$s")
$ for x in "${b[@]}"; do echo "$x"; done
foo
bar
hello world
baz
请注意,IFS可以是函数中的局部变量,因此不必备份和恢复其值:
join () { local IFS="$1"; local s="${@:2}"; printf "%s" "$s"; }
以下是需要评估的拆分实现:
# usage: split varName separator stringToSplit
split () {
local var="$1"
local IFS="$2"
set -- $3
echo "declare -a $var=( $(printf "\"%s\" " "$@") )"
}
示范
$ a=( foo bar "hello world" baz )
$ s=$(join , "${a[@]}")
$ echo $s
foo,bar,hello world,baz
$ split b , "$s"
declare -a b=( "foo" "bar" "hello world" "baz" )
$ eval $(split b , "$s")
$ for x in "${b[@]}"; do echo "$x"; done
foo
bar
hello world
baz