2017-02-13 111 views
0

下面是我的脚本的代码段在运行它会抛出错误:击:语法错误:“(”意外

echo "#include \"Factory.H\"" > $1 
echo "#include \"Stub.H\"" >> $1 
echo "#include \"Ref.H\"" >> $1 

# 
# a loop to include all of the headers for the stubs. 
# 
ARGS=("[email protected]") 
for ((i = 1; $i < $#; i=$i+2)) ; do 
    echo ${ARGS[$i]} 
    echo "#include \"${ARGS[$i]}.H\"">> $1 
done 

ARGS=("[email protected]")报告的错误,我无法弄清楚这是为什么。报告为一个错误的脚本被调用,有以下输入

..//scripts/makestubfactory ./obj/_stubfactory.C RegistryImpl_Stub "com.frco.fievel.comm.registry.RegistryImpl_stub" ObserverBrokerImpl_Stub "com.frco.fievel.observer.ObserverBrokerImpl_stub" SubjectAccessImpl_Stub "com.frco.fievel.observer.SubjectAccessImpl_stub" 

请阐明如何来解决这个问题,一些灯光

+0

如果您有报价$# –

+0

'$#'开头不需要引用。 – codeforester

+0

为了提高效率,可以将“$ 1”部分保留在循环之外。 '完成>>“$ 1”'。 – codeforester

回答

2

你需要确保你的脚本在Bash shell中运行,因为一个标准的POSIX外壳(这是什么sh可能是您的系统上)没有实现阵列。要做到这一点,你应该添加shebang行作为脚本的第一行:

#!/usr/bin/bash 

路径/usr/bin/bash必须是完整路径bash可执行文件,这可能是在你的机器上的其他位置。有些人喜欢使用

#!/usr/bin/env bash 

将发现bash无论它是在PATH,但需要env是在固定的位置。

您可以通过使用命令找到的路径,从bash的bash的可执行文件:

which bash 

有一些可能对这个脚本进行改进,其中一些我所提到的快速浏览:

  1. 您可以使用单引号,以避免反斜杠转义双引号(但只有当你没有你的字符串中的单引号或可变扩展)。可变扩张,而另一方面,应该被引用:

    echo '#include "Factory.H"' > "$1" 
    
  2. 更妙的是,使用这里-doc的复制整个模板:

    cat >"$1" <<"EOF" 
    #include "Factory.H" 
    #include "Stub.H" 
    #include "Ref.H" 
    EOF 
    
  3. 你并不真的需要一个数组,因为你可以使用bash的间接运算符来访问命令行参数:

    for ((i=2; i<$#; i+=2)); do 
        echo "${!i}" 
        echo "#include \"${!i}\".H" >> "$1" 
    done 
    

    注意使用i+=2而非i=$i+2

    另一种解决方案,使用printf输出所有的参数在一个调用:

    printf '#include "%s.H"\n%.0s' "${@:2}" 
    

    这利用的,壳printf实用程序不断重复的格式,直到它已用完了所有的参数,这一事实可以非常有帮助。在这种情况下,我使用%.0s(即打印最大长度为0的字符串)不打印奇数参数。"${@:2}"是bash的扩展,它是像"[email protected]"只是它的参数2.

+0

这似乎不是shebang线的问题。 – codeforester

+1

我的脚本在脚本的顶部有'#!/ bin/sh',因此我遇到了这个问题。感谢您指出“'sh'没有实现数组”。我将'#!/ bin/sh'行改为'#!/ usr/bin/env bash',现在可以正常工作。 – Panch

+1

@codeforester:显然在*你的系统上,'sh'是'bash'。并非每个人都以这种方式配置他们的机器 – rici

-1

试试这个:

echo "#include \"Factory.H\"" > $1 
echo "#include \"Stub.H\"" >> $1 
echo "#include \"Ref.H\"" >> $1 

# 
# a loop to include all of the headers for the stubs. 
# 
ARGS=("[email protected]") 
for ((i = 1; $i < [email protected]; i=$i+2)) ; do 
    echo ${ARGS[$i]} 
    echo "#include \"${ARGS[$i]}.H\"">> $1 
done 
+1

'$我<$ @'是错误的。 – codeforester