使用脚本输出中的空元素创建bash数组

时间:2017-10-16 15:32:42

标签: arrays bash

以下代码段完全符合我的要求:

array=( "one" "" "three" ); echo "${array[@]}"; two=${array[1]}; echo two=$two

它返回:

one  three
two=

因此变量$ 2被指定为空。完善。现在让我们尝试从另一个脚本中捕获一些输出,在这里,我们将说"脚本"是一个简单的回声。

array=( $( echo "one" "" "three" ) ); echo "${array[@]}"; two=${array[1]}; echo two=$two

返回:

one three
two=three
哦,哦。但这一点很简单,echo在处理其参数时会删除引号。让我们保护那些:

array=( $( echo \"one\" \"\" \"three\" ) ); echo "${array[@]}"; two=${array[1]}; echo two=$two

现在我们得到:

"one" "" "three"
two=""

因此,即使在回声之后,所有变量都被包装在引号中,而不是获得一个空变量。删除这些引号非常烦人(您可以使用eval或sed或其他东西,但速度对于此应用程序至关重要)。

为什么:

array=( "one" "" "three" ); echo "${array[@]}"; two=${array[1]}; echo two=$two

表现不同于:     array =($(echo \" one \" \" \" \" three \")); echo" $ {array [@]}&#34 ;; 2 = $ {阵列[1]}; echo two = $ two

即使:

$( echo \"one\" \"\" \"three\" )

返回:

"one" "" "three"

或者,更一般地说,脚本的适当输出是什么,以便它可以传递到数组? (或者我应该在" outer"脚本中创建一个函数,该脚本将" inner"脚本调用为可以轻松获取数组返回的函数。)

由于

2 个答案:

答案 0 :(得分:0)

这是命令行解析动态。以这种方式尝试使用eval -

 eval "array=( $( echo \"one\" \"\" \"three\" ) )"
 echo "${array[@]}"
 two=${array[1]}
 echo two=$two

这将评估 ""而不是将其指定为字符串,并将如此评估的〜empty~分配到数组位置。

答案 1 :(得分:0)

你可以这样试试。

OLDIFS=$IFS;IFS=',';array=($(echo 'one','','three')); IFS=$OLDIFS;echo "${array[@]}"; two=${array[1]}; echo two=$two