Выполнить команду как строку в Bash

Я тестирую короткий bash script. Я хотел бы выполнить строку как команду.

#!/bin/bash

echo "AVR-GCC"
$elf=" main.elf"
$c=" $main.c"
$gcc="avr-gcc -mmcu=atmega128 -Wall -Os -o $elf$c"
eval $gcc
echo "AVR-GCC done"

Я знаю, что это некрасиво и все, но разве он не должен выполнять команду avr-gcc? Ошибки заключаются в следующем:

./AVR.sh: line 4: = main.elf: command not found
./AVR.sh: line 5: = .c: command not found
./AVR.sh: line 6: =avr-gcc -mmcu=atmega128 -Wall -Os -o : command not found

Ответ 1

Я не знаю, какова ваша конечная цель, но вместо этого вы можете использовать следующий более надежный способ: использовать массивы в bash. (Я не буду обсуждать несколько синтаксических ошибок, которые у вас есть в вашем script.)

Не помещайте свои команды и их аргументы в строку, как вы, а затем eval строку (кстати, в вашем случае eval бесполезен). Я понимаю ваш script как (эта версия не даст вам упомянутых вами ошибок, сравните с вашей версией, особенно нет значков доллара для переменных присваиваний):

#!/bin/bash

echo "AVR-GCC"
elf="main.elf"
c="main.c"
gcc="avr-gcc -mmcu=atmega128 -Wall -Os -o $elf $c"
eval $gcc
echo "AVR-GCC done"

У вас очень скоро возникнут проблемы, когда, например, вы сталкиваетесь с файлами с пробелами или смешными символами (подумайте о файле с именем ; rm -rf *). Вместо этого:

#!/bin/bash

echo "AVR-GCC"
elf="main.elf"
c="main.c"
gcc="avr-gcc"
options=( "-mmcu=atmega128" "-Wall" -"Os" )
command=( "$gcc" "${options[@]}" -o "$elf" "$c" )
# execute it:
"${command[@]}"

Попытайтесь понять, что происходит здесь (я могу прояснить любые конкретные вопросы, которые вы попросите), и понять, насколько безопаснее это, чем положить команду в строку.

Ответ 2

Вы не используете визирование доллара при создании переменных, только при их доступе.

Итак, измените

$elf=" main.elf"
$c=" $main.c"
$gcc="avr-gcc -mmcu=atmega128 -Wall -Os -o $elf$c"

к

elf=" main.elf"
c=" $main.c"
gcc="avr-gcc -mmcu=atmega128 -Wall -Os -o $elf$c"