编译期间使用Bash脚本检查字符串长度

编译期间使用Bash脚本检查字符串长度,bash,compilation,makefile,Bash,Compilation,Makefile,我试图在编译期间检查目标名称(在Makefile中定义)。例如,如果目标名称的名称超过10个字符,编译过程将中止,并抛出错误消息“目标名称超过10个字符” 守则的一部分: TARGETNAME: @if [ ${#TARGET_NAME} -ge 10 ]; then \ echo "TARGET name exceeds 10 chars"; \ exit; \ fi 然后,当我尝试编译时,make TARGETNAME,我收到一条错误消息: /bin/sh: line 0: [: -ge

我试图在编译期间检查目标名称(在Makefile中定义)。例如,如果目标名称的名称超过10个字符,编译过程将中止,并抛出错误消息“目标名称超过10个字符”

守则的一部分:

TARGETNAME:
@if [ ${#TARGET_NAME} -ge 10 ]; then \ 
echo "TARGET name exceeds 10 chars"; \
exit; \
fi
然后,当我尝试编译时,
make TARGETNAME
,我收到一条错误消息:

/bin/sh: line 0: [: -ge: unary operator expected
我不确定这个Makefile是用Bash还是其他语言编写的。语法看起来像是在Bash脚本中,但我在代码中没有看到类似于
SHELL:=/bin/Bash
的命令


谢谢大家的帮助,问题已解决

${#TARGET_NAME}
是对Makefile变量的引用,该变量的名称可能无效。如果这是未定义的(除非找到创建疯狂Makefile变量名的方法),则在shell上下文中计算的语句是
If[-ge 10];然后
,这将导致您看到的错误。您需要使用
if[${TARGET\u NAME}-ge10];然后
这将导致在shell上下文中处理${{TARGET_NAME}。

您可能希望这样:

TARGETNAME:
    t=$@ && [ $${#t} -lt 10 ] || { echo "Target name $$t has 10 or more chars"; false; }

编辑。看来你并不是真的喜欢这个东西。请做以下小实验:在一个空目录中,创建一个名为
Makefile
的文件,其内容如下:

short:
    t=$@ && [ $${#t} -lt 10 ] || { echo "Target name $$t has 10 or more chars"; false; }

longtargetname:
    t=$@ && [ $${#t} -lt 10 ] || { echo "Target name $$t has 10 or more chars"; false; }
然后,在此目录中:

$ make short
t=short && [ ${#t} -lt 10 ] || { echo "Target name $t has 10 or more chars"; false; }
$ make longtargetname 
t=longtargetname && [ ${#t} -lt 10 ] || { echo "Target name $t has 10 or more chars"; false; }
Target name longtargetname has 10 or more chars
make: *** [longtargetname] Error 1
看到了吗?该行在执行之前打印(这是
make
的默认设置)。您可以通过将
@
前置到行来禁用打印

在GNU
make
中,如果您想要更精致的东西,可以定义一个函数:

define check_length
    @t=$@; \
    if [ $${#t} -ge 10 ]; then \
        echo "Target name $$t has 10 or more chars"; \
        false; \
    fi
endef

short:
    $(call check_length,$@)

longtargetname:
    $(call check_length,$@)

1.10点后留下空位。2.用echo替换ercho。@SMA我在这篇文章中打错了字,但在代码中它和你说的一模一样。在if之前,@在做什么?你能发布真实的脚本吗(如果它很大的话,也可以发布它的一部分)@IgnacioVazquez Abrams我对用bash脚本生成文件是完全陌生的。我使用它来获得TARGETNAME的长度,并将其与10进行比较。@M.S这不是Bash。这是有效的伯恩壳牌,或同等产品。错误甚至会显示
/bin/sh
@
是一个虚构的东西。
如果[${#TARGET_NAME}-ge 10]
修复了错误消息,但是无论我在if语句中添加了什么条件,编译都会继续。然后似乎出现了不同的问题,你应该发布另一个带有a的问题,以尽快找到问题的底部。这行打印内容将打印出来,而不是执行。这个生成文件可能不是Bash脚本,我正在添加更多的代码。@m.S:您试过了吗?只要把我写的行放在一个空的Makefile中,然后运行
make
maketargetname
。这里的关键点是使用
t=$@
将Makefile变量传输到shell。您还可以将目标名称
TARGETNAME
替换为模板
%
。感谢您的否决票!如果你认为这个答案是错误的或者没有用,请留下评论…也许我可以改进它(也许我会在这个过程中学到一些东西)。谢谢你的帮助,我已经尝试了你的代码。它只是被打印出来,而不是被执行。这是否意味着这个Makefile是用另一种语言编写的?顺便说一句,我没有否决你的答案。@M.S你说的只是打印出来,而不是执行是什么意思?它被执行了!您将看到它打印在终端输出上,因为这是
make
的默认设置。在行前面加上
@
以禁用打印:
@t=$@&[$${t}-lt 10]
。。。这段代码是用make的语言编写的。