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 选项,因为它去掉了引号。