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"

请阐明如何解决此问题。

您需要确保脚本与bash shell一起运行,因为标准的Posix shell(这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. 更好的是,使用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}"
    

    这利用了以下事实:shellprintf实用程序会不断重复该格式,直到用完所有参数为止,这可能会很有帮助。在这种情况下,我使用%.0s(即打印最大长度为0的字符串)不打印奇数参数。"${@:2}"是bash扩展名,类似于bash扩展名,"$@"只是它以参数2开头。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章