dash shell中如何将变量完整传入自定义base64编码函数并保留原始格式
问题原因
你当前的代码存在两个核心问题:
base64_encode函数内没有读取输入的逻辑,${input}变量为空,导致输入内容没有被正确传入编码流程- 如果你需要保留变量末尾的换行符,要确保传递内容时没有被截断,同时不要错误删除编码后的有效字符
修复方案
方案1:支持管道传入内容(适配你当前的调用写法)
dash 属于 POSIX 兼容 shell,函数可以直接通过读取标准输入获取管道传递的内容,修改后的完整代码如下:
#!/bin/dash payload1='{ "currency": "ABC", "transaction": "1-8ef2b11f1b" } ' payload2='{x}' # 移除bash专属的function关键字,适配dash语法 base64_encode() { # 读取标准输入的所有内容到input变量 input=$(cat) printf '%s' "${input}" | base64 | tr -d '=' | tr '/+' '_-' | tr -d '\n' } # 调用逻辑保持不变即可 printf '%s' "$(printf '%s' "${payload1}" | base64_encode)" # 输出换行方便区分结果 echo printf '%s' "$(printf '%s' "${payload2}" | base64_encode)" echo
运行后 payload1 输出结果就是你需要的 ewogICJjdXJyZW5jeSI6ICJBQkMiLAogICJ0cmFuc2FjdGlvbiI6ICIxLThlZjJiMTFmMWIiCn0K。
方案2:支持直接传变量作为参数(更适合变量编码场景)
如果不需要承接其他命令的管道输出,也可以直接把变量作为参数传给函数,实现更简单:
base64_encode() { # 直接读取第一个入参作为输入内容 input="$1" printf '%s' "${input}" | base64 | tr -d '=' | tr '/+' '_-' | tr -d '\n' } # 调用方式改为直接传变量 printf '%s' "$(base64_encode "${payload1}")" echo printf '%s' "$(base64_encode "${payload2}")" echo
实现说明
- 两种方案都是 POSIX 兼容的通用实现,除了 dash 外也可以在 bash、zsh 等其他常见 shell 中运行
- 代码里的
tr -d '='、tr '/+' '_-'是 URL 安全 Base64 的标准转换逻辑,如果你不需要 URL 安全格式可以删掉这两行 - 所有输出都用
printf '%s'而不用echo,避免 echo 自动追加换行、转义特殊字符的问题,确保内容完全原样处理
内容的提问来源于stack exchange,提问作者KarlsD
相关产品推荐
相关产品推荐

