以特定方式阅读脚本的输出

时间:2016-05-23 23:48:04

标签: bash shell unix

所以我有一个名为sortByDates的脚本。正如您可能已经猜到的那样,它按日期排序。
我想向它发送一堆行(存储在我的主脚本中的数组中)并读取行sortByDates返回。
像这样的东西。说我有:

One 26 One 4 4000 0575342 18.3.2016
Two 27 Two 3 3100 0599342 24.3.2016
Three 28 Three 2 2950 0556742 4.3.2016
Four 29 Four 3 3150 0562342 2.4.2016

这些行存储为:

arr[0]=One 26 One 4 4000 0575342 18.3.2016
arr[1]=Two 27 Two 3 3100 0599342 24.3.2016
arr[2]=Three 28 Three 2 2950 0556742 4.3.2016
arr[3]=Four 29 Four 3 3150 0562342 2.4.2016

我想将这些行发送到sortByDates,例如:

$(printf "%s\n" "${arr[@]}" | sortByDates

这就是我通常会做的事情,但我希望这个实现有点不同。类似的东西:

while read -r line; do
    sortedLines+=("$line")
done < <(sortByDates < $(printf "%s\n" "${arr[@]}"))

这就是我跌跌撞撞的地方。上面的代码不起作用。我无法理解如何将一堆行(或数组)重定向到另一个脚本,同时我将新行(脚本的输出)读取到一个名为sortedLines的新数组。

输出应该是这样的:

Three 28 Three 2 2950 0556742 4.3.2016
One 26 One 4 4000 0575342 18.3.2016
Two 27 Two 3 3100 0599342 24.3.2016
Four 29 Four 3 3150 0562342 2.4.2016

所以我希望sortedLines成为:

sortedLines[0]=Three 28 Three 2 2950 0556742 4.3.2016
sortedLines[1]=One 26 One 4 4000 0575342 18.3.2016
sortedLines[2]=Two 27 Two 3 3100 0599342 24.3.2016
sortedLines[3]=Four 29 Four 3 3150 0562342 2.4.2016

谢谢。

1 个答案:

答案 0 :(得分:2)

sortedLines=()
while read -r line; do
    sortedLines+=("$line")
done < <(printf "%s\n" "${arr[@]}" | sortByDates)
printf "%s\n" "${sortedLines[@]}"

这会产生输出:

Three 28 Three 2 2950 0556742 4.3.2016
One 26 One 4 4000 0575342 18.3.2016
Two 27 Two 3 3100 0599342 24.3.2016
Four 29 Four 3 3150 0562342 2.4.2016

使用进程替换将``的结果提供给while循环。

除此之外:命令sortByDates < $(printf "%s\n" "${arr[@]}")告诉shell提供sortByDates作为$(printf "%s\n" "${arr[@]}"文件内容的输入。那是你想要的。

调试

尝试在bash -x下运行脚本。或者,尝试这个脚本:

sortedLines=()
while read -r line; do
    echo line=$line
    sortedLines+=("$line")
    declare -p sortedLines
done < <(printf "%s\n" "${arr[@]}" | sortByDates)
declare -p sortedLines

对我而言,以上产生:

line=Three 28 Three 2 2950 0556742 4.3.2016
declare -a sortedLines='([0]="Three 28 Three 2 2950 0556742 4.3.2016")'
line=One 26 One 4 4000 0575342 18.3.2016
declare -a sortedLines='([0]="Three 28 Three 2 2950 0556742 4.3.2016" [1]="One 26 One 4 4000 0575342 18.3.2016")'
line=Two 27 Two 3 3100 0599342 24.3.2016
declare -a sortedLines='([0]="Three 28 Three 2 2950 0556742 4.3.2016" [1]="One 26 One 4 4000 0575342 18.3.2016" [2]="Two 27 Two 3 3100 0599342 24.3.2016")'
line=Four 29 Four 3 3150 0562342 2.4.2016
declare -a sortedLines='([0]="Three 28 Three 2 2950 0556742 4.3.2016" [1]="One 26 One 4 4000 0575342 18.3.2016" [2]="Two 27 Two 3 3100 0599342 24.3.2016" [3]="Four 29 Four 3 3150 0562342 2.4.2016")'
declare -a sortedLines='([0]="Three 28 Three 2 2950 0556742 4.3.2016" [1]="One 26 One 4 4000 0575342 18.3.2016" [2]="Two 27 Two 3 3100 0599342 24.3.2016" [3]="Four 29 Four 3 3150 0562342 2.4.2016")'