所以我有一个名为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
谢谢。
答案 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")'