以下代码段完全符合我的要求:
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"脚本调用为可以轻松获取数组返回的函数。)
由于
答案 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