如何将多个变量分配给固定大小的"table"输出

  • 本文关键字:table 输出 分配 变量 bash
  • 更新时间 :
  • 英文 :


我想解析一个媒体输出并将每行赋值给自己的变量。

我的问题是,如果输出的行数发生变化,那么var的逻辑值也会发生变化。

#!/usr/bin/env bash
function tester_mediainfo() {

#this must be done with the hard new line, its a mediainfo quirk 
template="General;%OverallBitRate/String%|
Video;%Width%|%Height%|%FrameRate/String%|%DisplayAspectRatio/String%|%ScanType/String%|%FrameRate/String%|%ChromaSubsampling/String%|%BitDepth%|%InternetMediaType%|%Format/String%|%Format_Profile%|%Format_Settings%|%BitRate_Mode/String%|%BitRate_Nominal/String%|%BitRate_Maximum/String%|%ColorSpace%|
Audio;%BitRate/String%|%Format/String%|%Channel(s)/String%|%BitRate_Mode/String%|%BitRate/String%|%SamplingRate/String%"
maker=$(mediainfo --Output="$template" "$1" | sed 's/video///g' | tr '|' 'n '| awk '{ print $1 }')
read -r A B C D E F G H I J K L M N< <(echo $maker)
}
tester_mediainfo $1

我希望能够输出在IF中使用的变量列表语句之后,因此它们的逻辑含义不能改变!

假设脚本输出:

output:     variable:
15.7            A 
25.000      B                   #this changes 
16:9            C
MBAFF           D
25.000      E           #this changes 
4:2:0           F
8                   G
H264            H
AVC             I
High            J
CABAC           K

就是11行输出。

现在,如果我在另一个媒体文件上再次运行脚本:

output:     variable:
10.5                A
16:9                B
Progressive C
4:2:0               D
8                       E
H264                F
AVC                 G
Main@L4.1       H
CABAC               I
Constant        J
10                  K

25.000FPS(第2行),它将被分配给变量B

16:9的宽高比(line2),它将被分配给变量B,应该是null

由于您依赖于read命令中的word splitting,连续的空值放在一起会导致结果不一致。

请您试试:

# no changes in your original template
template="General;%OverallBitRate/String%|
Video;%Width%|%Height%|%FrameRate/String%|%DisplayAspectRatio/String%|%ScanType/String%|%FrameRate/String%|%ChromaSubsampling/String%|%BitDepth%|%InternetMediaType%|%Format/String%|%Format_Profile%|%Format_Settings%|%BitRate_Mode/String%|%BitRate_Nominal/String%|%BitRate_Maximum/String%|%ColorSpace%|
Audio;%BitRate/String%|%Format/String%|%Channel(s)/String%|%BitRate_Mode/String%|%BitRate/String%|%SamplingRate/String%"
mapfile -t info < <(mediainfo --Output="$template" "$1" | sed 's/video///g' | tr '|' 'n' | awk '{ print $1 }')
for i in "${info[@]}"; do
echo "$i"
done

mapfile内置命令从标准输入中读取行为每一行分配一个数组(这里是info)。它保留空行as is,然后结果始终具有相同的长度。如果要将单个标量变量分配给数组的元素,你可以这样说:

A="${info[0]}"
B="${info[1]}"
C="${info[2]}"
...

尽管将数组视为数组会更方便。