我正在尝试在 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/sh
shebang,您很可能会要求bash
(或/bin/sh
后面的任何 shell,现在几乎总是指向另一个 shell 的链接)以符合 POSIX 的模式执行您的脚本:
如果使用名称 sh 调用 bash,它会尝试尽可能模仿 sh 历史版本的启动行为,同时也符合 POSIX 标准。
您的问题是 POSIXecho
没有定义-n
标志,因此在您的命令中将其理解为要在输出中显示的另一个参数。事实上,LW4gdXNlcjpwYXNzd29yZAo=
是-n user:password
的 base64 编码。
你应该使用printf
而不是echo
,它的行为定义得更好,并且在实现之间变化较小。
此外,除非你需要你的脚本是可移植的,并且可能在bash
不可用的平台上运行,否则我建议你使用#!/usr/bin/env bash
shebang而不是你的#!/bin/sh
,这样你就可以享受bash
好东西。