在bash脚本中将变量作为命令参数插入

时间:2013-03-24 23:01:01

标签: bash

我在linux上有一个用于截屏的文件,我想根据用户输入修改部分内容。目前我甚至无法在变量的命令中使用参数。

#!/bin/bash -x

fps="30"
capturesize="hd1080"
outputsize="720"

filter=-vf 'scale=${outputsize}'

avconv \
-f x11grab -r $fps -s $capturesize -i :0.0 \
-f alsa -ac 2 -i pulse \
-f alsa -ac 2 -i pulse \
-f alsa -ac 1 -i pulse \
-map 0:0 -map 1:0 -map 2:0 -map 3:0 \
-vcodec libx264 \
$filter \
-pre:v lossless_ultrafast \
-acodec libmp3lame \
-threads 4 \
-y $@

$fps$capturesize已正确评估,但$filter任务给出了一个不错的信息:

+ filter=-vf
+ 'scale=${outputsize}'
~/bin/screencap: line 9: scale=${outputsize}: command not found

将行更改为:

filter="-vf 'scale=$outputsize'"

给人一种更不愉快的感受:

+ filter='-vf '\''scale=720'\'''
+ avconv -f x11grab [...] -vf ''\''scale=720'\''' [...]
[...]
No such filter: 'scale=720'
Error opening filters!

2 个答案:

答案 0 :(得分:2)

使用数组。它具有保护包含空间的物品的额外好处 如果您尝试将其存储在以空格分隔的列表中,则无法执行此操作。

#!/bin/bash -x

fps="30"
capturesize="hd1080"
outputsize="720"

filter=( -vf "scale=${outputsize}" )

avconv \
-f x11grab -r "$fps" -s "$capturesize" -i :0.0 \
-f alsa -ac 2 -i pulse \
-f alsa -ac 2 -i pulse \
-f alsa -ac 1 -i pulse \
-map 0:0 -map 1:0 -map 2:0 -map 3:0 \
-vcodec libx264 \
"${filter[@]}" \
-pre:v lossless_ultrafast \
-acodec libmp3lame \
-threads 4 \
-y "$@"

您可以将所有选项放在一个数组中;一个小例子:

options=( -f x11grab -r "$fps" -s "$capturesize" )
options+=( -i :0.o )
# etc
avconv "${options[@]}" -y "$@"

答案 1 :(得分:0)

filter="-vf scale=${outputsize}"