庆典|在转义空格时为变量赋值

时间:2017-03-06 16:42:53

标签: bash ffmpeg escaping

这是打印视频帧率的bash脚本,它所包含的参数可能包含空格。此参数也将在脚本内的命令中使用。

struct Pi {
    template <class T> 
    decltype(pi<T>) operator*(T val) { return val * pi<T>; }

    template <class T> 
    friend decltype(pi<T>) operator*(T val, Pi) { return pi<T> * val; }
};

执行时

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

所以文件名正确传递但是空格没有被转义,因此没有来自ffmpeg的输出

有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分: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脚本没有正确传递参数,并且你无法做任何事情来适应它。

答案 1 :(得分: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"