2012-06-18 4 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 в кавычки, потому что ваша переменная множественна, поэтому я предполагаю, что существует более одного, вы также должны быть в местах с именами файлов.)

Во-вторых, ответ на заданный вами вопрос is 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

Смежные вопросы