Loading...
Loading...
Compare original and translation side by side
jqcurl | jqsedawkjqcurl | jqsedawkdigraph tool_choice {
"Automation task?" [shape=diamond];
"Simple file/git operation?" [shape=diamond];
"Use Bash" [shape=box];
"Use JBang" [shape=box];
"Automation task?" -> "Simple file/git operation?" [label="yes"];
"Automation task?" -> "Use Bash" [label="no"];
"Simple file/git operation?" -> "Use Bash" [label="yes"];
"Simple file/git operation?" -> "Use JBang" [label="no"];
}git statusgit commitlscpmvchmodmkdirdigraph tool_choice {
"Automation task?" [shape=diamond];
"Simple file/git operation?" [shape=diamond];
"Use Bash" [shape=box];
"Use JBang" [shape=box];
"Automation task?" -> "Simple file/git operation?" [label="yes"];
"Automation task?" -> "Use Bash" [label="no"];
"Simple file/git operation?" -> "Use Bash" [label="yes"];
"Simple file/git operation?" -> "Use JBang" [label="no"];
}git statusgit commitlscpmvchmodmkdir| Task | ❌ Avoid | ✅ Prefer |
|---|---|---|
| Parse JSON API | | |
| Extract from JSON file | | JBang with type-safe POJOs |
| Transform data | | JBang with clear logic |
| Multiple file processing | Bash loops | JBang with Java NIO |
| 任务 | ❌ 不推荐 | ✅ 推荐 |
|---|---|---|
| 解析JSON API | | 搭配Jackson/Gson的 |
| 从JSON文件提取内容 | | 支持类型安全POJO的JBang |
| 数据转换 | | 逻辑清晰的JBang |
| 多文件处理 | Bash循环 | 使用Java NIO的JBang |
///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS com.google.code.gson:gson:2.10.1
import com.google.gson.*;
import java.nio.file.*;
public class ExtractEmails {
record User(String name, String email, int age) {}
record UserData(User[] users) {}
public static void main(String[] args) throws Exception {
var json = Files.readString(Path.of(args[0]));
var data = new Gson().fromJson(json, UserData.class);
for (var user : data.users) {
if (user.age > 30) {
System.out.println(user.email);
}
}
}
}jbang ExtractEmails.java users.json > emails.txt///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS com.google.code.gson:gson:2.10.1
import com.google.gson.*;
import java.nio.file.*;
public class ExtractEmails {
record User(String name, String email, int age) {}
record UserData(User[] users) {}
public static void main(String[] args) throws Exception {
var json = Files.readString(Path.of(args[0]));
var data = new Gson().fromJson(json, UserData.class);
for (var user : data.users) {
if (user.age > 30) {
System.out.println(user.email);
}
}
}
}jbang ExtractEmails.java users.json > emails.txt///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS com.google.code.gson:gson:2.10.1
import com.google.gson.*;
import java.net.http.*;
import java.net.URI;
import java.time.*;
import java.time.format.*;
public class GithubRelease {
record Release(String tag_name, String published_at) {}
public static void main(String[] args) throws Exception {
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.github.com/repos/jbangdev/jbang/releases/latest"))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
var release = new Gson().fromJson(response.body(), Release.class);
var published = Instant.parse(release.published_at);
var formatter = DateTimeFormatter.ofPattern("MMMM dd, yyyy 'at' HH:mm 'UTC'");
System.out.println("Latest jbang Release Report");
System.out.println("----------------------------");
System.out.println("Tag: " + release.tag_name);
System.out.println("Published: " + formatter.format(published.atZone(ZoneOffset.UTC)));
}
}jbang GithubRelease.java///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS com.google.code.gson:gson:2.10.1
import com.google.gson.*;
import java.net.http.*;
import java.net.URI;
import java.time.*;
import java.time.format.*;
public class GithubRelease {
record Release(String tag_name, String published_at) {}
public static void main(String[] args) throws Exception {
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.github.com/repos/jbangdev/jbang/releases/latest"))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
var release = new Gson().fromJson(response.body(), Release.class);
var published = Instant.parse(release.published_at);
var formatter = DateTimeFormatter.ofPattern("MMMM dd, yyyy 'at' HH:mm 'UTC'");
System.out.println("Latest jbang Release Report");
System.out.println("----------------------------");
System.out.println("Tag: " + release.tag_name);
System.out.println("Published: " + formatter.format(published.atZone(ZoneOffset.UTC)));
}
}jbang GithubRelease.java| Excuse | Reality |
|---|---|
| "jq is purpose-built for JSON" | JBang with Gson/Jackson is MORE purpose-built - type-safe, debuggable |
| "Single command is simpler" | JBang scripts are just as easy: |
| "jq/curl are standard tools" | JBang is standard for Java devs, more maintainable long-term |
| "Bash is more efficient" | Slight overhead is worth type safety and debugging |
| "This is just a quick script" | Quick scripts become production code - start with quality |
| "I don't need type safety" | You discover you need it when the API changes |
| "I can solve this directly with jq" | You're trading short-term convenience for long-term pain |
| "jq is efficient for single operations" | JBang is efficient AND maintainable |
| "WebFetch + jq is simple" | JBang HttpClient is simpler and type-safe |
| "Minimizes tool calls" | JBang minimizes debugging time and maintenance burden |
| 借口 | 实际情况 |
|---|---|
| "jq是专门为JSON打造的" | 搭配Gson/Jackson的JBang针对性更强 - 类型安全、可调试 |
| "单条命令更简单" | JBang脚本同样简单: |
| "jq/curl是标准工具" | 对于Java开发者来说JBang是标准工具,长期可维护性更强 |
| "Bash效率更高" | 类型安全和调试能力带来的价值远高于微小的效率开销 |
| "这只是个快速编写的脚本" | 快速脚本最终会演变为生产代码 - 从一开始就保证质量 |
| "我不需要类型安全" | 当API结构变化时你就会发现你需要它 |
| "我可以直接用jq解决这个问题" | 你是在用短期便利换取长期麻烦 |
| "jq对单操作来说效率很高" | JBang兼顾效率和可维护性 |
| "WebFetch + jq很简单" | JBang HttpClient更简单且支持类型安全 |
| "可以减少工具调用" | JBang减少了调试时间和维护负担 |
.java///usr/bin/env jbang "$0" "$@" ; exit $?//DEPS group:artifact:versionmain()jbang ScriptName.java args.java///usr/bin/env jbang "$0" "$@" ; exit $?//DEPS group:artifact:versionmain()jbang ScriptName.java argsgit status && git diffmkdir -p dir && cd dirchmod +x script.shgh pr createdocker rungit status && git diffmkdir -p dir && cd dirchmod +x script.shgh pr createdocker run