我正在尝试在bash脚本中对user:password字符串进行base64编码,但是该脚本中的结果与在shell中运行命令的结果不同。
在外壳中(预期输出):
echo -n "user:password" | base64
dXNlcjpwYXNzd29yZA==
在脚本中(带-n):
USER=$(echo -n "user:password" | base64)
echo $USER
LW4gdXNlcjpwYXNzd29yZAo=
在脚本中(不带-n,结尾处有多余的字符):
USER=$(echo "user:password" | base64)
echo $USER
dXNlcjpwYXNzd29yZAo=
有人可以告诉我我在这里想念的东西吗?谢谢
答案 0 :(得分:3)
通过使用#!/bin/sh
shebang,您最有可能要求bash
(或/bin/sh
后的任何shell(如今几乎总是指向另一个shell的链接))执行脚本在POSIX兼容模式下:
如果使用名称sh调用bash,则它会尝试尽可能模仿sh的历史版本的启动行为,同时也要符合POSIX标准。
您的问题是POSIX echo
没有定义-n
标志,因此在您的命令中将其理解为仅在输出中显示的另一个参数。实际上,LW4gdXNlcjpwYXNzd29yZAo=
是-n user:password
的base64编码。
您应该使用printf
代替echo
,后者的行为定义得更好,并且在实现之间的差异也较小。
此外,除非您需要脚本可移植并且可以在无法使用bash
的平台上运行,否则建议您使用#!/usr/bin/env bash
shebang代替#!/bin/sh
您将享受bash
的美味。