переменные скрипта bash не правильные

263
kram

Я немного обновил его, но я все еще не получаю результаты, которые я должен получить:

#!/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
Вы, кажется, оставили `$` вне audioChannels в операторе `if`. dogoncouch 6 лет назад 0

1 ответ на вопрос

1
Gordon Davisson

Вы не говорите, но предполагается, что это не запускать для 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" "$" "$" "$(basename "$f")" 

Похожие вопросы