以下是我的脚本片段,它在运行时抛出错误:
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"
请详细说明如何解决这个问题。
答案 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
可以对此脚本进行一些改进,其中一些我在快速浏览中注意到:
您可以使用单引号来避免反斜杠转义双引号(但仅当您的字符串中没有单引号或变量扩展时)。另一方面,应引用可变扩展:
echo '#include "Factory.H"' > "$1"
更好的是,使用here-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}"
这利用了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