Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 输出包含空格的元素的数组_Arrays_Bash - Fatal编程技术网

Arrays 输出包含空格的元素的数组

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" } 我还尝试了一个拆分

我已经成功地创建了一个连接函数,它使用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 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