2016-11-08 4 views
2

У меня есть строковая переменная, которая содержит цикл.как передать строку команде bash как параметр

loopVariable="for i in 1 2 3 4 5 do echo $i done" 

Я хочу передать эту переменную команде bash внутри сценария оболочки. Но я всегда получаю сообщение об ошибке

bash $loopVariable 

Я попытался также

bin/bash $loopVariable 

Но это также не работает. Бэш обрабатывает строку, дающую мне ошибку. Но теоретически это исполняет. Я не уверен, что я делаю неправильно

bash: for i in 1 2 3 4 5 do echo $i done: No such file or directory 

Я также попытался использовать этот подход, используя цикл while. Но получить такую ​​же ошибку

i=0 
loopValue="while [ $i -lt 5 ]; do make -j15 clean && make -j15 done" 
bash -c @loopValue 

, когда я использую Баш -c "@loopValue" я получаю следующее сообщение об ошибке

bash: -c: line 0: syntax error near unexpected token `done' 

и когда я использую просто использовать Баш -c @loopValue

[: -c: line 1: syntax error: unexpected end of file 
+0

Ваш 'while' цикл должен быть' в то время как [$ я -lt 5]; make make -j15 clean && make -j15; done', (missing ';' before' done') и ваша команда bash: 'bash -c $ loopValue', а не' bash - c @ loopValue'. – SLePort

+0

теперь его предоставление '-c: строка 1: синтаксическая ошибка: неожиданный конец файла –

+0

My bad ...двойная кавычка переменная: 'bash -c '$ loopValue" ' – SLePort

ответ

7

Вы можете добавить опцию -c, чтобы прочитать команду из аргумента. Следующие должны работать:

$ loopVariable='for i in 1 2 3 4 5; do echo $i; done' 
$ bash -c "$loopVariable" 
1 
2 
3 
4 
5 

от человека Баш:

-c   If the -c option is present, then commands are read from the 
      first non-option argument command_string. If there are argu‐ 
      ments after the command_string, they are assigned to the 
      positional parameters, starting with $0. 

Другой способ заключается в использовании стандартного ввода:

bash <<< "$loopVariable" 

Что касается обновленной команды в этом вопросе, даже если мы исправим проблемы с котировками и тот факт, что переменная не экспортируется, вы все равно остаетесь с бесконечным циклом с $i никогда не меняется:

loopValue='while [ "$i" -lt 5 ]; do make -j15 clean && make -j15; done' 
i=0 bash -c "$loopValue" 

Но это почти всегда будет лучше использовать функцию как в @Kenavoz' answer.

+0

и что делает -c? –

+0

Это позволяет bash читать команду, которая будет выполнена из списка аргументов, вместо стандартного ввода. – user000001

+0

Могу ли я использовать тот же подход с циклом while? –

2
loopvariable='for i in 1 2 3 4 5; do echo $i; done' 
bash -c "$loopvariable" 
4

Вам не нужно открывать новый процесс с помощью bash -c. Вы можете использовать функцию Bash вместо:

function loopVariable { 
    for i in 1 2 3 4 5; do echo $i; done 
} 

loopVariable 

Пожалуйста, обратите внимание, что поскольку ни suprocess не будет создан, вам не нужно экспортировать переменные, чтобы использовать их в дочернем процессе, как с bash -c. Все они доступны в области сценария.

выход:

1 
2 
3 
4 
5 
Смежные вопросы