在Mac OSX中使用bash shell
我一直在尝试编写一个简短的shell脚本来处理我编译过程的一部分,但是当我尝试在每个文件上运行脚本时,通配符似乎不像我期望的那样到。
脚本如下:
rm *.cs
rm *.bin
protoc -I. *.proto -o*.bin
mono protogen -i:*.bin -o:*.cs
现在,当我在命令行中为每个文件手动输入时,它可以正常工作。但是,当使用通配符运行此shell脚本时,它最终会创建“* .bin”和“* .cs”,而不是为每个不同的输入创建单独的.bin和.cs文件。我是在滥用通配符,还是只是变得奇怪?
答案 0 :(得分:2)
通配符不会那样工作。它们只是被现有匹配文件名列表所取代。所以,如果你是rm * .bin,则* .bin在下一个语句中不匹配任何内容。他们并没有神奇地捕捉"来自同一命令行中另一个标记的替换值。
在bash中,结果是* .bin保持不变,因此它应该创建文件* .bin,而不是.bin。但是你可能正在使用不同的shell。
顺便说一句,你可以使用make轻松完成这项任务。
答案 1 :(得分:1)
protofiles="*.proto"
rm *.cs
rm *.bin
for i in $protofiles; do
binfile=${i/.proto/.bin}
protc -I. $i -o$binfile
done
binfiles="*.bin"
for i in $binfiles; do
csfile="${i/.bin/.cs}
mono prtogen -i:$i -o:$csfile
done
无论如何......我建议你使用Makefiles来完成这项工作。尝试这样的事情(未经测试):
CSFILES=a.cs b.cs d.cs e.cs
clean:
rm *.cs *.bin
%.bin: %.proto
protoc -I. $< -o $@
%.cs: %.bin
mono prtogen -i:$< -o:$@
all: $(CSFILES)