2017-03-06 69 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

# 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" 

如果開不工作,那麼你的Python腳本沒有正確地傳遞參數,有ISN」實際上你可以做任何事情來適應它。

3

除了在輸入變量周圍使用雙引號,您應該使用ffprobe而不是ffmpeg來獲取媒體文件信息。 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"