2012-06-18 23 views
0

我有一個字符串,其中包含一個我想在bash腳本中執行的命令。我怎樣才能做到這一點? 對不起,如此基本的問題,但我是新的bash。 這是我的代碼:在bash中的字符串中執行命令

echo "What is the path to save the result files?" 
read out_path 

end_cm1=$"fastqc -o "$out_path$" --noextract -fastq "$files1 

我想執行是在end_cm1變量的指令。

+1

你爲什麼想這樣做?請參閱[BashFAQ/050](http://mywiki.wooledge.org/BashFAQ/050)。 –

回答

3

首先,你不必把該命令字符串中的所有:你可以這樣做:

fastqc -o "$out_path" --noextract -fastq $files1 

(而且我建議把$out_path引號這裏萬一路徑具有我沒有把$files1放在引號中,因爲你的變量是複數,所以我認爲這裏有多個;你應該小心這些文件名中的空格)

其次,你問的問題的答案是eval

eval $end_cm1 
+0

這裏不需要'eval'; 'x =「echo bob」; $ x' – chepner

+0

確實,這*可能*在這裏是真實的。但是你讓這個問題複雜化了。 – ams

+0

只要有可能就避免使用'eval',它有一個聲名狼借的怪癖來源。如果您必須使用它,請至少雙引號(即'eval「$ end_cm1」')。鬆散地說,'$ end_cm1'在執行之前會執行一些(但不是全部)正常的解析; 'eval $ end_cm1'做了一些解析,然後*再解析它*; 'eval「$ end_cm1」'解析它一次。更好的選擇,請參閱丹尼斯的鏈接。 –

0

你只需要在你的字符串有輕微的語法問題:

end_cm1="fastqc -o $out_path --noextract -fastq $files1" 
$enc_cm1 

話雖如此,@ams是正確的大約不需要這個 分配給擺在首位的字符串,以及關於所涉及的風險 中未引用$files1

+0

具體而言,如果您在'$ end_cm1'內有額外的引用級別或未展開的變量,那麼您*需要*'eval'。如果你沒有引用和沒有變量,那麼'eval'將和沒有引用一樣。我更喜歡使用它,所以我知道我在做什麼。人們應該意識到,用戶輸入可能會有被評估的東西(使用任一選項),所以不要在可能被利用來破解您的系統的腳本中執行此操作! – ams