如何在bash中迭代位置变量?

时间:2017-02-18 01:30:26

标签: c linux bash unix ubuntu

用户将提供他们想要的任何数量的位置参数(这些都是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  

2 个答案:

答案 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