Bash-Skriptvariablen nicht richtig

355
kram

Ich habe es ein wenig aktualisiert, aber ich bekomme immer noch nicht die Ergebnisse, die ich erhalten sollte:

#!/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 

Ich führe dies auf einem Ordner aus, der eine Datei enthält, die alle if-Bedingungen erfüllt ("h264 aac 2 ./Black.Mass.(2015)/Black.Mass.(2015).mp4"), aber nicht die "Direct Play-Fähigkeit" erhält "Echo

1
Sie scheinen in der if-Anweisung ein $ aus Audiokanälen ausgelassen zu haben. dogoncouch vor 6 Jahren 0

1 Antwort auf die Frage

1
Gordon Davisson

Sie sagen nicht, aber soll es nicht für DTS-Audio laufen? In jedem Fall funktioniert diese Zeile nicht richtig:

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

Da es keine Leerzeichen um die Gleichheitszeichen gibt, werden sie als Teil von Zeichenfolgen und nicht als Vergleichsoperatoren analysiert. Verwenden Sie stattdessen diese:

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

(Doppelte Gleichheitszeichen, wie Sie sie in den früheren Vergleichen verwendet haben, würden ebenfalls funktionieren. Aber auch hier sind Leerzeichen erforderlich.)

Übrigens empfehle ich nachdrücklich, doppelte Anführungszeichen zu verwenden (dh "$f"statt nur $f). Aber die Art $cli_videound Weise, wie Sie sie verwenden und $cli_audionicht funktionieren würden, wenn sie in doppelte Anführungszeichen gesetzt würden, also tun Sie es ihnen nicht an. Der richtige Weg, um solche Parameter zu speichern, ist die Verwendung von Arrays anstelle von einfachen Variablen wie diese:

 cli_video=(-c:v copy) ... cli_audio=(-c:a copy) ... ffmpeg -i "$f" "$" "$" "$(basename "$f")"