2017-03-06 6 views
0

これはビデオのフレームレートを出力するbashスクリプトで、引数にはスペースが含まれている可能性があります。この引数もスクリプト内のコマンドで使用されます。bash |空白をエスケープしながら変数に引数を代入する

#!/bin/bash 
inputVid="$*" 

#checking if $inputVid has full path 
echo $inputVid 

frames=`ffmpeg -i $inputVid 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p"` 
echo $frames 

私は

$./frameRate.sh ../Downloads/FlareGet/Videos/Why\ .mp4 

出力が実行します。

../Downloads/FlareGet/Videos/Why .mp4 

ので、ファイル名が正しく渡さなっているが、スペースが

をffmpegのからの出力されないので、エスケープ取得されていませんこれを解決する方法はありますか?

+1

ファイル名を二重引用符で囲みますか? – codeforester

+0

@codeforester別のpythonスクリプトから変数を引数として渡すので、ファイル名を引用するのは私の選択肢ではありません! –

答えて

3

コマンドに引数が1つしかない場合は、$1を使用します。オリジナルの引数の両方をスクリプト内のパラメータ$1に正しく引用するだけです。

# Equivalent invocations 
$ ./frameRate.sh ../Downloads/FlareGet/Videos/Why\ .mp4 
$ ./frameRate.sh ../Downloads/FlareGet/Videos/"Why .mp4" 
$ ./frameRate.sh "../Downloads/FlareGet/Videos/Why .mp4" 

「スクリプトは

inputVid="$1" 
ffmpeg -i "$inputVid" 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p" 

または単に

ffmpeg -i "$1" 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p" 

このdoes't作業は、その後、あなたのPythonスクリプトが正しく引数を渡すされていない場合は、だろうとISNがあります本当にあなたがそれを受け入れるためにできることは何もありません。

3

入力変数の前後に二重引用符を使用することに加えて、ffmpegの代わりにffprobeを使用して、メディアファイル情報を取得する必要があります。 ffmpegの出力は情報提供のみを目的としており、スクリプトによって解析されるものではありません。「壊れやすい」とみなされ、標準的で一貫したフォーマットを保証するものではありません。 ffprobeを使用すると、sedを削除することもできます。

#!/bin/bash 

# Output file path and name 
echo "$1" 

# Output average frame rate 
ffprobe -loglevel error -select_streams v:0 -show_entries stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 "$1" 
関連する問題