Bash case 语句不适用于使用 jq 的 json 字符串值
Bash case statement doesnt work with json string value using jq
我正在研究从媒体容器(mkv、mp4...等)中提取所选曲目的功能。它的主要功能之一是 "auto output file extension assigner".
流程如下...
步骤 1) 当我给脚本我要提取的曲目编号时,它会自动使用 mediainfo 检查源文件并以 JSON 格式输出结果。
步骤 2) 使用 JQ,我从所选曲目中查询 "track" 键的值,并将其保存到 "mediaFormat" 变量中。
步骤 3) 将此变量放入 switch 语句中并与预定义的开关列表进行比较。如果匹配,那么它将初始化 "mediaExtension" 变量
具有适当的值,将用作输出文件的扩展名。
现在我只想回显 "mediaExtension" 变量,看看它是否有效。而且它没有用。
问题是第 1-2 步按预期工作,但不知何故 switch 语句(第 3 步)不起作用。只有 (*) 开关会被执行,这意味着它不识别 "AVC" 开关。
#!/bin/bash
# INCLUDES
# mediainfo binary
PATH=/cygdrive/c/build_suite/local64/bin-video:$PATH;
# jq binary
PATH=/cygdrive/c/build_suite/local64/bin-global:$PATH;
# BASH SETTINGS
set -x;
# FUNCTION PARAMETER
function inspectExtension () {
mediaFormat=$(mediainfo "" --Output=JSON | jq ".media.track[].Format");
case $mediaFormat in
"AVC") mediaExtension="264";;
*) echo "ERROR";;
esac
set "$mediaExtension";
echo "$mediaExtension";
}
inspectExtension "test.mp4" "1";
read -p "Press enter to continue...";
如您所见,在此脚本中我激活了跟踪 (set -x),这就是我在控制台中看到的 window(我在 windows 10 上使用 cygwin)。
+ inspectExtension test.mp4 1
++ mediainfo test.mp4 --Output=JSON
++ jq '.media.track[1].Format'
' mediaFormat='"AVC"
+ case $mediaFormat in
+ echo ERROR
ERROR
+ set ''
+ echo ''
+ read -p 'Press enter to continue...'
Press enter to continue...
有什么想法吗?或者是我在这里想念的东西?
感谢您的帮助!
假设您希望 mediaFormat 是一个 JSON 值(即,假设调用 jq 是您拥有它的方式),case
语句中的 "AVC"
应该被引用:
'"AVC"' ) ...
此外,引用case
的论点可能更安全。
也许您唯一想念的是像这样使用 jq
的 --raw-output
选项:
mediaFormat=$(mediainfo "" --Output=JSON | jq --raw-output ".media.track[].Format");
每当您使用 jq
访问某些 string
值时,最好使用 --raw-output
选项,因为它去掉了引号。
我正在研究从媒体容器(mkv、mp4...等)中提取所选曲目的功能。它的主要功能之一是 "auto output file extension assigner".
流程如下...
步骤 1) 当我给脚本我要提取的曲目编号时,它会自动使用 mediainfo 检查源文件并以 JSON 格式输出结果。
步骤 2) 使用 JQ,我从所选曲目中查询 "track" 键的值,并将其保存到 "mediaFormat" 变量中。
步骤 3) 将此变量放入 switch 语句中并与预定义的开关列表进行比较。如果匹配,那么它将初始化 "mediaExtension" 变量 具有适当的值,将用作输出文件的扩展名。
现在我只想回显 "mediaExtension" 变量,看看它是否有效。而且它没有用。
问题是第 1-2 步按预期工作,但不知何故 switch 语句(第 3 步)不起作用。只有 (*) 开关会被执行,这意味着它不识别 "AVC" 开关。
#!/bin/bash
# INCLUDES
# mediainfo binary
PATH=/cygdrive/c/build_suite/local64/bin-video:$PATH;
# jq binary
PATH=/cygdrive/c/build_suite/local64/bin-global:$PATH;
# BASH SETTINGS
set -x;
# FUNCTION PARAMETER
function inspectExtension () {
mediaFormat=$(mediainfo "" --Output=JSON | jq ".media.track[].Format");
case $mediaFormat in
"AVC") mediaExtension="264";;
*) echo "ERROR";;
esac
set "$mediaExtension";
echo "$mediaExtension";
}
inspectExtension "test.mp4" "1";
read -p "Press enter to continue...";
如您所见,在此脚本中我激活了跟踪 (set -x),这就是我在控制台中看到的 window(我在 windows 10 上使用 cygwin)。
+ inspectExtension test.mp4 1
++ mediainfo test.mp4 --Output=JSON
++ jq '.media.track[1].Format'
' mediaFormat='"AVC"
+ case $mediaFormat in
+ echo ERROR
ERROR
+ set ''
+ echo ''
+ read -p 'Press enter to continue...'
Press enter to continue...
有什么想法吗?或者是我在这里想念的东西?
感谢您的帮助!
假设您希望 mediaFormat 是一个 JSON 值(即,假设调用 jq 是您拥有它的方式),case
语句中的 "AVC"
应该被引用:
'"AVC"' ) ...
此外,引用case
的论点可能更安全。
也许您唯一想念的是像这样使用 jq
的 --raw-output
选项:
mediaFormat=$(mediainfo "" --Output=JSON | jq --raw-output ".media.track[].Format");
每当您使用 jq
访问某些 string
值时,最好使用 --raw-output
选项,因为它去掉了引号。