本文详解如何将 shell 命令的标准输出(如 `ls /bin`)按行分割为字符串切片,并序列化为标准 json 数组格式,涵盖字符串处理、json 编码及常见边界问题的处理。
在 Go 中,将外部命令输出(如 ls /bin)转化为结构化数据(如 JSON 数组)是一个典型场景,常用于 API 响应、配置生成或跨语言数据交换。核心步骤包括:执行命令 → 捕获输出 → 按行解析为切片 → 序列化为 JSON。
以下是一个完整、健壮的实现示例:
package main
import (
"encoding/json"
"fmt"
"os/exec"
"strings"
)
func main() {
// 1. 执行命令并获取原始输出
cmd := exec.Command("ls", "/bin")
out, err := cmd.Output()
if err != nil {
fmt.Printf("命令执行失败: %v\n", err)
return
}
// 2. 转换为字符串并按换行符分割(注意:末尾可能含空行)
outputStr := string(out)
lines := strings.Split(outputStr, "\n")
// 3. 过滤空字符串(避免因末尾换行导致 []string 中出现空元素)
var filtered []string
for _, line := range lines {
if line != "" {
filtered = append(filtered, line)
}
}
// 4. 序列化为 JSON 数组
jsonBytes, err := json.Marshal(filtered)
if err != nil {
fmt.Printf("JSON 序列化失败: %v\n", err)
return
}
// 5. 输出结果(标准 JSON 格式,无多余空格)
fmt.Println(string(jsonBytes))
// 示例输出: ["unicode_start","unicode_stop","unlink","usleep","vi","view","ypdomainname","zcat"]
}
✅ 关键说明与最佳实践: