Bash 脚本变量不正确

Bash 脚本变量不正确

我稍微更新了一下,但仍然没有得到我应该得到的结果:

#!/bin/bash
find "$1" -type f | while read filename
do

    videoCodec=$(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$filename")
    audioCodec=$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$filename")
    audioChannels=$(ffprobe -v error -select_streams a:0 -show_entries stream=channels -of default=noprint_wrappers=1:nokey=1 "$filename")

    echo $videoCodec $audioCodec $audioChannels $filename

    if [ $videoCodec = "h264" ] && [ $audioCodec = "aac" ] && [ audioChannels = "2" ] ; then
        echo "Direct play capable"
    fi

done

我在包含满足所有 if 条件(“h264 aac 2 ./Black.Mass.(2015)/Black.Mass.(2015).mp4”)的文件的文件夹上运行此命令,但没有得到“可直接播放”的回声。

答案1

你没说,但应该不是运行 DTS 音频?无论如何,此行不会正常工作:

if [[ $video_good="true" && $audio_good="true" ]] ; then

由于等号周围没有空格,因此它们被解析为字符串的一部分,而不是比较运算符。请改用此方法:

    if [[ $video_good = "true" && $audio_good = "true" ]] ; then

(像您在之前的比较中使用的双等号也可以起作用。但同样,它们周围需要有空格。)

顺便说一句,我强烈建议使用双引号括住变量引用(即"$f"而不仅仅是$f)。但是,如果使用双引号,则使用$cli_video和的方式$cli_audio将不起作用,因此不要对它们这样做。存储此类参数的真正正确方法是使用数组而不是普通变量,如下所示:

    cli_video=(-c:v copy)
...
    cli_audio=(-c:a copy)
...
    ffmpeg -i "$f" "${cli_video[@]}" "${cli_audio[@]}" "$(basename "$f")"

相关内容