将变量的全部内容传递给函数
Posted
技术标签:
【中文标题】将变量的全部内容传递给函数【英文标题】:Pass the entire content of the variable into a function 【发布时间】:2022-01-09 06:07:39 【问题描述】:我需要将变量的内容原样转换为base64。我决定制作一个函数并将变量的内容传递给它,稍后再输出。到目前为止,我有以下内容
#!/bin/dash
payload1='
"currency": "ABC",
"transaction": "1-8ef2b11f1b"
'
payload2='x'
function base64_encode()
# must first receive the data
# ...
printf '%s' "$input" | base64 | tr -d '=' | tr '/+' '_-' | tr -d '\n'
# something like:
printf '%s' "$(printf '%s' "$payload1" | base64_encode)"
printf '%s' "$(printf '%s' "$payload2" | base64_encode)"
最重要的是,我应该从payload1
变量中准确获取ewogICJjdXJyZW5jeSI6ICJBQkMiLAogICJ0cmFuc2FjdGlvbiI6ICIxLThlZjJiMTFmMWIiCn0K
,而不是ewogICJjdXJyZW5jeSI6ICJBQkMiLAogICJ0cmFuc2FjdGlvbiI6ICIxLThlZjJiMTFmMWIiCn0
。问题是我不知道如何将变量的内容放入base64_encode
函数中。
有没有通用的方法来做到这一点?或者我的方法通常是错误的?
【问题讨论】:
function funcname()
不符合 POSIX,我很惊讶 dash 已经开始接受它。声明函数的 POSIX 标准方法是 funcname()
,前面没有 function
。见wiki.bash-hackers.org/scripting/obsolete
顺便说一句,你真的需要 sh/dash 兼容性吗?使此代码符合 POSIX 标准的简单方法倾向于丢弃尾随换行符(使用 input=$(cat)
或任何其他命令替换从标准输入读取变量会丢弃它们)
...关于不同的主题——如果你描述了某人如何说服自己带有尾随 K
的输出是正确的,而不是在没有解释的情况下断言它是正确的,那将会很有帮助。
不要删除结尾的 =
符号,它们很重要:en.wikipedia.org/wiki/Base64#Output_padding
另外,那些tr
命令将使编码的字符串不可解码:下划线和减号不是合法的base64字符:en.wikipedia.org/wiki/Base64#Base64_table
【参考方案1】:
由于您要将数据通过管道传输到函数中,因此让 base64 直接从标准输入读取:
base64_encode()
base64 # removed questionable `tr` commands
【讨论】:
tr -d '\n'
是必要的,因为 GNU base64
每 76 个字符添加换行符。另一个tr
用于将base64
转换为base64 URL
。
...GNU base64 只这样做,除非它被告知不要这样做,它非常可能。 base64 -w 0
你来了。
是的,但是其他操作系统上的base64
不添加这些换行符(至少是 BSD 和 Solaris),所以 portable 解决方案是 tr -d '\n'
以上是关于将变量的全部内容传递给函数的主要内容,如果未能解决你的问题,请参考以下文章