在编译过程中使用Bash脚本检查字符串长度



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

部分代码:

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这样的命令。

感谢所有人的帮助,问题已解决

您可能想要这样的东西:

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,$@)

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

最新更新