2017-02-18 2 views
0

Пользователь предоставит любое количество позиционных параметров, которые они хотят (которые являются всеми программами на C). Я хочу сделать так, чтобы все программы на С компилировались. Однако это не работает; у кого-нибудь есть решение?Как выполнить итерацию через позиционные переменные в bash?

echo '#!/bin/bash' >> compile 
echo if [ "-o"='$1' ] >> compile 
echo then >> compile 
echo for (i=3; i<='$#'; i++) >> compile 
echo do >> compile 
echo gcc -o '$2' '${i}' >> compile 
echo fi >> compile 
+1

Можете ли вы разработать на «нерабочую» часть? * Как это не работает? Пожалуйста, найдите время, чтобы [прочитать о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask). –

+0

Я не полностью понимаю, чего вы пытаетесь достичь, но я уверен, что «Makefile», вероятно, сделает лучшую работу. – Ctx

+0

он продолжает давать мне синтаксическую ошибку здесь echo for (i = 3; i <= '$ #'; i ++) >> компилировать, как правило, должен работать то, что я делаю? – zee

ответ

2

Не использовать кучу echo заявлений, использовать здесь-док. Помещение котировок вокруг токена после << предотвращает расширение переменных внутри this-doc.

cat <<'EOF' >>compile 
'#!/bin/bash' 
if [ "-o" = "$1" ] 
then 
    for ((i=3; i <= $#; i++)) 
    do 
     gcc -o "$2" "${!i}" 
    done 
fi 
EOF 

В противном случае, вам нужно бежать или цитировать все специальные символы - вы получаете сообщение об ошибке, потому что вы не избежать < в for() линии.

Другие ошибки: вам нужно пространство вокруг = в команде [, и вы пропали без вести done в конце цикла for. И чтобы косвенно коснуться переменной, вам нужно использовать синтаксис ${!var}.

Обычный способ для перебора всех аргументов с простым:

for arg 

петля. Когда нет in после for variable, он перебирает аргументы. Вам просто нужно удалить -o outputfile аргумент первый:

output=$2 
shift 2 # remove first 2 arguments 
for arg 
do 
    gcc -o "$output" "$arg" 
done 
+0

Я хотел сделать так, чтобы команды добавились к другому скрипту (так как я пытаюсь записать его в другом скрипте), все равно я могу это сделать? – zee

+0

Вы не видите '' compile' в первой строке скрипта? – Barmar

+0

oh извините, большое спасибо – zee

2

Вот как я бы изменить то, что вы первоначально отвечал:

$ cat test.sh 
echo -e "#!/bin/bash" > compile.sh 
echo -e "if [ \"\${1}\" == \"-o\" ]; then" >> compile.sh 
echo -e "\tlist_of_arguments=\${@:3} #puts all arguments starting with \$3 into one argument" >> compile.sh 
echo -e "\tfor i in \${list_of_arguments}; do" >> compile.sh 
echo -e "\t\techo \"gcc \${1} '\${2}' '\${i}'\"" >> compile.sh 
echo -e "\tdone" >> compile.sh 
echo -e "fi" >> compile.sh 
$ ./test.sh 
$ cat compile.sh 
#!/bin/bash 
if [ "${1}" == "-o" ]; then 
     list_of_arguments=${@:3} #puts all arguments starting with $3 into one argument 
     for i in ${list_of_arguments}; do 
       echo "gcc ${1} '${2}' '${i}'" 
     done 
fi 
$ chmod +x compile.sh 
$ ./compile.sh -o one two three four five 
gcc -o 'one' 'two' 
gcc -o 'one' 'three' 
gcc -o 'one' 'four' 
gcc -o 'one' 'five' 

для демонстрации замыслил я повторил команду gcc в test.sh. Для того, чтобы на самом деле запустить GCC вместо вторя его, изменить линию пять в test.sh от:

echo -e "\t\techo \"gcc \${1} '\${2}' '\${i}'\"" >> compile.sh 

в

echo -e "\t\tgcc \${1} '\${2}' '\${i}'" >> compile.sh 

или трубе эхо ШГ так:

echo -e "\t\techo \"gcc \${1} '\${2}' '\${i}'\" \| sh" >> compile.sh