bash - 如何将多个变量分配给固定大小的“表”输出
问题描述
我想解析一个mediainfo输出并将每一行分配给它自己的变量。
我的问题是,如果输出的行数发生变化,那么 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.000 FPS(第 2 行)并将分配给 var B
16:9纵横比 (line2) 并将分配给 var B 应该为空
解决方案
由于您依赖命令word splitting
中的read
,因此会将连续的空值放在一起导致结果不一致。
请您尝试一下:
# 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]}"
...
尽管将数组视为数组会更方便。
推荐阅读
- javascript - 无法通过 react 组件设置背景图片,报错
- java - 我在 Firebase RTDB 中为 Android 上的实时绘图应用程序的路径类存储什么类型的值?
- java - 两个共享许多方法但没有“是”关系的 Java 类
- java - 通过 Web 门户 (OAuth2) 获取访问令牌作为响应
- google-sheets - 谷歌表格首先按高度活跃的非空白对行进行排序?
- aws-lambda - 如何使用 type-graphql 和 aws-lambda-graphql 运行 Graphql 订阅
- java - handlePurchase 的 Google 结算问题
- qt - 将 Qt 私有标头添加到 CMake 项目
- xdebug - 尽管进行了设置,Xdebug 仍会自动打开
- javascript - 找不到变量: tweetsElement?