以下是我的脚本的片段,该片段在运行时引发错误:
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
可以对该脚本进行很多改进,其中一些我快速浏览了一下:
您可以使用单引号来避免反斜杠转义双引号(但前提是您的字符串中没有单引号或变量扩展名)。另一方面,应使用变量扩展名:
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}"
这利用了以下事实:shellprintf
实用程序会不断重复该格式,直到用完所有参数为止,这可能会很有帮助。在这种情况下,我使用%.0s
(即打印最大长度为0的字符串)不打印奇数参数。"${@:2}"
是bash扩展名,类似于bash扩展名,"$@"
只是它以参数2开头。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句