我想解析一个媒体输出并将每行赋值给自己的变量。
我的问题是,如果输出的行数发生变化,那么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]}"
...
尽管将数组视为数组会更方便。