2017-09-05 76 views
0

我想这样执行shell命令单独的参数(包括引号):庆典:在功能上构建的命令行的部分,将被解释为

convert input.png -pointsize 40 -font "$HOME/Library/Fonts/Droid Sans.ttf" \ 
-background black -fill red -stroke blue label:"Foo Bar" \ 
-gravity center -composite output.png 

但它是一个脚本的一部分,有些内容是动态,我从一个函数中获得。基本上,我想是这样的:

function GetTextCommands { 
    echo "-pointsize $2 -font \"$HOME/Library/Fonts/$1.ttf\" \ 
    -background black -fill red -stroke blue label:\"$3\" \ 
    -gravity center -composite" 
} 

bla=$(GetTextCommands "Droid Sans" 40 "Foo Bar") 
convert input.png $bla output.png 

不过,我不断收到这种报价相关的麻烦。要么它不承认Sans.ttf部分,认为这是一个不同的论点。或者,如果我在convert命令的$bla变量周围加上引号,它会将整个事件解释为一个参数(当然,这当然是无效的)。

请注意,如果我在convert命令之前放置echo以预览我的命令行的实际外观,它看起来与我打算的方式完全相同。但是我意识到当整条线路被回显时,一些引用可能会消失。

这是怎么回事?

回答

2

一个正确的做法是让你的函数填充一个包含参数的全局数组:

getTextCommands() { 
    args=(
     -pointsize "$2" 
     -font "$HOME/Library/Fonts/$1.ttf" 
     -background black 
     -fill red 
     -stroke blue 
     "label:$3" 
     -gravity center 
     -composite 
    ) 
} 

getTextCommands "Droid Sans" 40 "Foo Bar" 
convert input.png "${args[@]}" output.png 

一个缺点是使用getTextCommands要求你知道它设置的变量的名称。

+0

谢谢,用这种方式使用数组非常整齐! – RocketNuts

3

而不是试图产生一个字符串来执行(这将需要传递给eval,也许你正在寻找解决的方法就是调用eval convert input.png "$bla" output.png,但也有陷阱,所以我不建议这样做),只是使呼叫你的函数:

function ExecTextCommands { 
    convert input.png "$1" -pointsize "$2" -font "$HOME/Library/Fonts/$1.ttf" \ 
    -background black -fill red -stroke blue label:"$3" \ 
    -gravity center -composite output.png 
} 

ExecTextCommands "Droid Sans" 40 "Foo Bar" 
+0

是的,我认为这是很好,但我上面的例子实际上是一个更复杂的情况,在那里我有_multiple_变量部件在命令行中,从_multiple_功能来简化版本。 'eval'听起来很有用,但是你有没有提到你提到的陷阱? – RocketNuts