2016-06-08 90 views
0

是否有建立這樣一個varible方式:殼:具有多個路徑建立變量和命令

var="-i \"/path to/file 1.mp4\" -i \"/path to/file 2.mp4\"" 

然後用這個後面的程序:

ffmpeg $var 

我知道\"沒有按沒有工作,並且eval以某種方式工作,但是eval可能是醜陋的。

是否有沒有eval的解決方案?

+0

您在問題中構建變量的方式不工作嗎?我看起來很好。另外,什麼外殼? POSIX?慶典?如果您使用的是更高級的shell,如bash/zsh/ksh/fish,那麼通過閱讀有關數組的文檔,您可能會獲得有用的結果。 – ghoti

+0

@ ghoti這是企圖不好。其目的是讓'$ var'擴展爲4個參數,但在這個例子中,它在符合POSIX的shell中擴展爲8:'-i',''/ path','to/file','1.mp4 「','-i',''/ path','to/file'和'2.mp4''。嵌入的引號是文字字符,不能保護包圍的空白不受字詞拆分的影響。 – chepner

+0

@chepner當然,我應該更加明確。擴展符合預期使用'eval'分詞的功能;我的測試是按照顯示完成任務,然後是'eval set -i $ var',然後檢查'$ 1','$ 2'等。如果您可以相信您的輸入不會破壞事情,那麼使用'eval '。如果OP的shell支持它,我仍然認爲一個簡單的數組可能是要走的路。 – ghoti

回答

1

接下來最好的方法是構建一個數組。當你把${var[@]}放在某個地方時,它會用完整的數組內容替換它。如果你把"${var[@]}"地方(帶引號),數組中的元素將被引用,因此與空間元素不會在空白分成多個元素進行分割:

#!/bin/bash 

function test() { 
    for ((i=0; i<$#; i++)) { 
     echo "Param $i: ${!i}" 
    } 
} 

var[0]="-i" 
var[1]="https://stackoverflow.com/a/path" 
var[2]="-i" 
var[3]="/second/path with space/" 

test "${var[@]}" 

將輸出:

Param 0: test.sh 
Param 1: -i 
Param 2: /a/path 
Param 3: -i 

,這正是你需要的。 我只在bash中試過,其他shell可能會有不同的表現。

+0

謝謝丹尼斯!這正是我需要的!陣列也適合我的腳本。 –

+0

很高興看到我能幫上忙! –