11

我正在测试一个简短的 bash 脚本。我想执行一个字符串作为命令。

#!/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
4

2 回答 2

17

我不知道您的最终目标是什么,但您可以考虑使用以下更强大的方式:在 bash 中使用数组。(我不打算讨论脚本中的几个语法错误。)

不要像你那样把你的命令和它的参数放在一个字符串中,然后eval是字符串(顺便说一句,在你的情况下,eval 是没用的)。我理解你的脚本(这个版本不会给你提到的错误,与你的版本相比,特别是变量赋值没有美元符号):

#!/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[@]}"

试着理解这里发生了什么(我可以澄清你会问我的任何具体点),并意识到它比将命令放在字符串中要安全得多。

于 2013-11-05T10:12:25.287 回答
5

创建变量时不使用美元视线,仅在访问它们时使用。

所以改变

$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"
于 2013-11-05T10:02:47.633 回答