en utilisant la variable "file" obtenue de `pour" file "in` et passer à un autre script échoue

J'essaie de searchr tous les files .mkv dans mon dossier actuel, puis en utilisant mediainfo je veux mettre la height de ses métadonnées à une variable, mais il semble qu'il échoue.

Cet extrait:

 height=$(mediainfo "input.mkv" | grep -E 'Height'); echo $height; height=${height//[!0-9]/}; echo $height; 

fonctionne très bien, il produit le résultat que je veux si j'insère manuellement le nom du file:

 # height=$(mediainfo 'input.mkv' | grep -E 'Height'); echo $height; height=${height//[!0-9]/}; echo $height; Height : 720 pixels 720 

Mais, lorsque j'essaie de le mettre dans mon for file in pour que je n'ai pas besoin d'insert manuellement le nom de file, il continue à échouer:

 for file in *.{mkv}; do height=$(mediainfo "$file" | grep -E 'Height'); echo $height; height=${height//[!0-9]/}; echo $height; done 

La sortie de la variable $height est vide.

 # for file in *.{mkv}; do height=$(mediainfo "$file" | grep -E 'Height'); echo $height; height=${height//[!0-9]/}; echo $height; done (null) (null) 

J'ai déjà essayé, en changeant "$file" en '$file' et $file , mais aucun d'eux ne fonctionne, est-ce que je manque quelque chose?

Vous avez écrit *.{mkv} au lieu de *.mkv . Par conséquent, la boucle ne boucle qu'environ le seul "file" *.{mkv} qui n'existe pas. Dans ce cas, la sortie de mediainfo est simplement vide.

Ajoutez quelque chose comme echo "$file" dans votre boucle pour vérifier.

Supprimez le '{}' de la partie 'pour le file'. Il devrait être comme ceci à la place:

for file in *.mkv; do height=$(mediainfo "$file" | grep -E 'Height'); echo $height; height=${height//[!0-9]/}; echo $height; done

Dans votre code, le "*. {Mkv}" s'étend à tous les files se terminant par '. {Mkv}' dont je suppose qu'il n'y en a pas, donc la list dans l'instruction for revient vide.