脚本中的 Base64 编码不同

nbl*_*dfo 1 authentication bash base64 encoding

我尝试在 bash 脚本中对用户:密码字符串进行 Base64 编码,但是脚本中的结果与在 shell 中运行命令时不同。

在 shell 中(预期输出):

echo -n "user:password" | base64
dXNlcjpwYXNzd29yZA==
Run Code Online (Sandbox Code Playgroud)

在脚本中(w/-n):

USER=$(echo -n "user:password" | base64)
echo $USER
LW4gdXNlcjpwYXNzd29yZAo=
Run Code Online (Sandbox Code Playgroud)

在脚本中(w/o -n,末尾有额外字符):

USER=$(echo "user:password" | base64)
echo $USER
dXNlcjpwYXNzd29yZAo=
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我在这里缺少什么吗?谢谢

Aar*_*ron 6

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

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

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

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

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