用户将提供他们想要的任何数量的位置参数(这些都是C程序)。我想这样做所有的C程序编译。但这不起作用;有没有人有解决方案?
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
答案 0 :(得分:2)
不要使用一堆echo
语句,请使用here-doc。在<<
之后在令牌周围加上引号可以防止在here-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
答案 1 :(得分: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
中更改第5行:
echo -e "\t\techo \"gcc \${1} '\${2}' '\${i}'\"" >> compile.sh
到
echo -e "\t\tgcc \${1} '\${2}' '\${i}'" >> compile.sh
或将回声传递给sh,如下所示:
echo -e "\t\techo \"gcc \${1} '\${2}' '\${i}'\" \| sh" >> compile.sh