Base64 编码在脚本中有所不同



我正在尝试在 bash 脚本中对 user:password 字符串进行 base64 编码,但是脚本中的结果与我在 shell 中运行命令的结果不同。

在外壳中(预期输出):

echo -n "user:password" | base64
dXNlcjpwYXNzd29yZA==

在脚本 (w/-n) 中:

USER=$(echo -n "user:password" | base64)
echo $USER
LW4gdXNlcjpwYXNzd29yZAo=

在脚本中(不带 -n,末尾有额外的字符):

USER=$(echo "user:password" | base64)
echo $USER
dXNlcjpwYXNzd29yZAo=

有人可以告诉我我在这里错过了什么。谢谢

通过使用#!/bin/shshebang,您很可能会要求bash(或/bin/sh后面的任何 shell,现在几乎总是指向另一个 shell 的链接)以符合 POSIX 的模式执行您的脚本:

如果使用名称 sh 调用 bash,它会尝试尽可能模仿 sh 历史版本的启动行为,同时也符合 POSIX 标准。

您的问题是 POSIXecho没有定义-n标志,因此在您的命令中将其理解为要在输出中显示的另一个参数。事实上,LW4gdXNlcjpwYXNzd29yZAo=-n user:password的 base64 编码。

你应该使用printf而不是echo,它的行为定义得更好,并且在实现之间变化较小。

此外,除非你需要你的脚本是可移植的,并且可能在bash不可用的平台上运行,否则我建议你使用#!/usr/bin/env bashshebang而不是你的#!/bin/sh,这样你就可以享受bash好东西。

相关内容

最新更新