击:语法错误:“(”意外
下面是我的脚本的代码段在运行它会抛出错误:击:语法错误:“(”意外
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"
请阐明如何来解决这个问题,一些灯光
你需要确保你的脚本在Bash shell中运行,因为一个标准的POSIX外壳(这是什么sh
可能是您的系统上)没有实现阵列。要做到这一点,你应该添加shebang行作为脚本的第一行:
#!/usr/bin/bash
路径/usr/bin/bash
必须是完整路径bash可执行文件,这可能是在你的机器上的其他位置。有些人喜欢使用
#!/usr/bin/env bash
将发现bash
无论它是在PATH,但需要env
是在固定的位置。
您可以通过使用命令找到的路径,从bash的bash的可执行文件:
which bash
有一些可能对这个脚本进行改进,其中一些我所提到的快速浏览:
-
您可以使用单引号,以避免反斜杠转义双引号(但只有当你没有你的字符串中的单引号或可变扩展)。可变扩张,而另一方面,应该被引用:
echo '#include "Factory.H"' > "$1"
-
更妙的是,使用这里-doc的复制整个模板:
cat >"$1" <<"EOF" #include "Factory.H" #include "Stub.H" #include "Ref.H" EOF
-
你并不真的需要一个数组,因为你可以使用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.
这似乎不是shebang线的问题。 – codeforester
我的脚本在脚本的顶部有'#!/ bin/sh',因此我遇到了这个问题。感谢您指出“'sh'没有实现数组”。我将'#!/ bin/sh'行改为'#!/ usr/bin/env bash',现在可以正常工作。 – Panch
@codeforester:显然在*你的系统上,'sh'是'bash'。并非每个人都以这种方式配置他们的机器 – rici
试试这个:
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
'$我 codeforester
如果您有报价$# –
'$#'开头不需要引用。 – codeforester
为了提高效率,可以将“$ 1”部分保留在循环之外。 '完成>>“$ 1”'。 – codeforester