Переменные скрипта 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"), но не получаю "Direct play способны" "эхо.

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")"
Другие вопросы по тегам