You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dash shell中如何将变量完整传入自定义base64编码函数并保留原始格式

问题原因

你当前的代码存在两个核心问题:

  1. base64_encode 函数内没有读取输入的逻辑,${input} 变量为空,导致输入内容没有被正确传入编码流程
  2. 如果你需要保留变量末尾的换行符,要确保传递内容时没有被截断,同时不要错误删除编码后的有效字符

修复方案

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:15:10