2017-03-06 35 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"