在 awk 内部和外部使用变量

问题描述 投票:0回答:1

我正在尝试使用 awk 从拉取请求中检测 .cls 文件中的 System.debug 语句,不包括在 try/catch 块中找到的语句:

awk '
  BEGIN {
    IGNORECASE = 1
  }

  /try\s*{/ {
    in_try_block=1
  }

  /catch\s*\(/ {
    in_catch_block=1
  }

  /}/ {
      if (in_catch_block) {
        in_catch_block=0
      } else if (in_try_block) {
        in_try_block=0
      }
    }
  
  /System\.debug/ && !in_try_block && !in_catch_block {
    print "\033[1;31mError: System.debug found in " FILENAME ": Line " NR ": " $0 "\033[0m"
  }
' "$file"

效果很好,但是当我在检测到 sytstem.debug 时开始引入失败时,问题就开始了。

我尝试了退出1

/System\.debug/ && !in_try_block && !in_catch_block {
  print "\033[1;31mError: System.debug found in " FILENAME ": Line " NR ": " $0 "\033[0m"
  exit 1   
}

但它会退出并且不会进一步处理system.debugs。然后我引入了增量变量,例如:

/System\.debug/ && !in_try_block && !in_catch_block {
  print "\033[1;31mError: System.debug found in " FILENAME ": Line " NR ": " $0 "\033[0m"
  i++   
}
' "$file"

if [[ i -gt 0 ]]; then
   exit 1
fi

但是变量值没有反映。 所以我试图找到将 awk 变量/值传递到 shell 的最短方法。

示例类为:

    @isTest
public class GenerateDocumentTest {
    public static final String AUTH_PATH = 'Auth Path';
    public static final String SAMPLE_DATA = '{"key": "value"}';

    @TestSetup
    static void setupTestData() {
        try {
            // Insert test site
            insert new Site__c(Active__c = true, Site_Code__c = 'TestCode');

            // Insert test contact
            insert new Contact(FirstName = 'John', LastName = 'Doe', Email = '[email protected]');

            // Insert test account
            insert new Account(Name = 'Test Account', Phone = '123456789', Email = '[email protected]');

            // Insert test product and pricebook entry
            Product2 testProduct = new Product2(Name = 'Sample Product', IsActive = true);
            insert testProduct;

            insert new PricebookEntry(
                Product2Id = testProduct.Id,
                Pricebook2Id = Test.getStandardPricebookId(),
                UnitPrice = 100,
                IsActive = true
            );
        } catch (Exception ex) {
            System.debug('Setup error: ' + ex.getMessage());
        }
    }

    @isTest
    static void testDocumentGeneration() {
        try {
            System.debug('Testing document generation...');
            // Add test logic here
        } catch (Exception ex) {
            System.assert(false, 'Test failed: ' + ex.getMessage());
        }
    }
}
bash awk error-handling
1个回答
0
投票

awk 不是 shell,如果调用 shell 脚本可以访问 awk 变量的值,那么它会是紧密耦合的(即糟糕的软件)。

而不是这个:

awk '
    {
        print "foo"
        i++
    }
' file

echo "$i"

这样做:

i=$(awk '
    {
        print "foo" >"/dev/stderr"
        i++
    }
    END { print i+0 }
' file)

echo "$i"
© www.soinside.com 2019 - 2024. All rights reserved.