Bash:语法错误:“(”意外

时间:2017-02-13 03:21:40

标签: bash

以下是我的脚本片段,它在运行时抛出错误:

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=("$@")
for ((i = 1; $i < $#; i=$i+2)) ; do 
    echo ${ARGS[$i]}
    echo "#include \"${ARGS[$i]}.H\"">> $1
done 

ARGS=("$@")中报告的错误,我无法弄清楚为什么会将此报告为错误。使用以下输入

调用脚本
..//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"

请详细说明如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

您需要确保您的脚本是使用bash shell运行的,因为标准的Posix shell(系统上可能是sh)不会实现数组。为此,您应该添加一个shebang行作为脚本的第一行:

#!/usr/bin/bash

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

#!/usr/bin/env bash

会在PATH中找到bash,但需要env位于固​​定位置。

您可以使用以下命令从bash中找到bash可执行文件的路径:

which bash

可以对此脚本进行一些改进,其中一些我在快速浏览中注意到:

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

     echo '#include "Factory.H"' > "$1"
    
  2. 更好的是,使用here-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}"
    

    这利用了shell printf实用程序不断重复格式直到它耗尽了所有参数的事实,这可能非常有用。在这种情况下,我使用%.0s(即打印最大长度为0的字符串)不打印奇数参数。 "${@:2}"是一个bash扩展,类似于"$@",但它以参数2开头。

答案 1 :(得分:-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=("$@")
for ((i = 1; $i < $@; i=$i+2)) ; do 
    echo ${ARGS[$i]}
    echo "#include \"${ARGS[$i]}.H\"">> $1
done