2017-07-08 108 views
1

我正在編寫一個bash腳本,它使用其他輸入爲命令構建一組複雜的參數。到目前爲止,該腳本使用該技術完美運行:在Bash命令參數中處理引號和轉義空格

whatIwant="command \"$filename-with-spaces-maybe\" -opt1 \"$some_words\" -opt2 $a_number -opt3 \"$a_file_reference\" -opt4 \"$several_sentences\" " 
eval $whatIwant 

雖然它的作品,我很謹慎使用eval,因爲一個壞的文件名進行破壞的風險的。我希望能夠跳過分配變量然後對其進行評估,而只是將該命令放在行首,並讓所有參數都由之前在腳本中構建的適當變量設置。

但是,當我嘗試這樣做時,文件名似乎不被視爲單個變量,而是作爲多個參數傳遞給該命令。我嘗試了幾種雙轉義形式,但沒有設法找到正確評估的東西。這很令人沮喪,因爲當我回顯我建立命令的變量時,它會完美地複製並粘貼到命令行並執行我想要的操作。

在bash腳本中這樣做的最佳做法是什麼?

+0

我們真的需要看看你想要完成什麼,而不是使用哪種技術來提供真正的點對點答案。也就是說,你的問題幾乎肯定由[BashFAQ#50]覆蓋(http://mywiki.wooledge.org/BashFAQ/050)。 –

+0

順便說一句,http://shellcheck.net/是你的朋友捕捉案件時引用是失蹤/丟失。 –

+0

另一方面,'command'是一個實際的內建命令的名稱,使它成爲一個錯誤的名稱用作佔位符/示例。 –

回答

2

這真的這樣簡單:

your_command "$filename_with_spaces_maybe" -opt1 "$some_words" -opt2 "$a_number" -opt3 "$a_file_reference" -opt4 "$several_sentences" 

也就是說:

  • 參數擴展在雙引號(其中一個變量的名字被替換爲它的價值) - 連如果您認爲該值只能是數字。
  • 不要用任何種類的eval,或分配打擾等

唯一需要的引號語法,不是字面 - 「嵌套」或「逃逸」的報價是沒有語法含義的文字字符,所以它們對解析沒有任何影響(沒有額外的解析步驟,如eval生成的那樣,在所有可避免的情況下確實是不好的練習),並且只爲實際運行的命令添加額外的不需要的內容。


因爲當你認爲你需要在一個變量中存儲的命令其他原因(可添加參數是有條件,還是要能夠重複使用),請參閱BashFAQ #50案件。

如果您還沒有確信eval是一個不好的想法,那麼您應該閱讀BashFAQ #48

關於Quotes的Wooledge頁面對於這個問題來說是一個很好的資源。

+0

謝謝!我將使用您的解決方案,並閱讀Bash Faqs和Wooledge頁面以供將來參考。我非常有義務有機會學習。再次感謝。 – user2480136