Переменные скрипта 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")"