2013-03-24 125 views
0

我有一個用於linux上screencasting的文件,我想根據用戶輸入修改它的一部分。目前我甚至無法讓它在變量的命令中插入一個參數。將變量作爲命令參數插入到bash腳本中

#!/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 [email protected] 

$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

使用數組。它還具有保護包含空格的項目的額外好處,如果您嘗試將其存儲在空格分隔的列表中,則無法執行某些操作 。

#!/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 "[email protected]" 

您可以將所有選項放在一個數組中;一個小例子:

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

這...工作。我不知道爲什麼或者如何,當空格插入到vf值時,它會自動添加引號!... Bash似乎非常不可預知,很高興SO是如此充滿了bash高手:P – 2013-03-24 23:33:17

+0

當數組展開時* in引號*使用'[@]'索引運算符,數組中的每個元素都被引用,因此它被視爲單個單詞。 – chepner 2013-03-24 23:45:41

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

結果應該是:'-vf'scale = 720'' - 你的沒有單引號。 – 2013-03-24 23:10:15

相關問題