Bash脚本执行时Base64编码结果末尾为何多出K字符?
问题:脚本执行Base64编码结果末尾多出K字符的原因
直接执行命令的结果
执行以下命令:
$ echo -ne "Apps:apps1" | openssl enc -base64 QXBwczphcHBzMQ==
输出结果为 QXBwczphcHBzMQ==。
脚本执行的结果
将逻辑写入temp.sh脚本:
#!/bin/sh echo -ne "Apps:apps1" | openssl enc -base64
执行sh temp.sh后,输出结果为 LW5lIEFwcHM6YXBwczEK。
执行环境
$ sh --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin22) Copyright (C) 2007 Free Software Foundation, Inc.
原因分析
问题核心是不同Shell环境对echo参数的解析规则不一致:
- 直接执行命令时,你用的是Bash环境,Bash的
echo支持-ne参数:-n控制不输出末尾换行,-e用于解析转义字符。这里目标字符串无转义内容,实际输出就是Apps:apps1,没有额外换行,Base64编码结果符合预期。 - 但脚本指定的Shebang是
#!/bin/sh,在macOS系统中,/bin/sh是Bash的POSIX兼容模式,而POSIX标准的echo并不支持-ne参数。此时echo会把-ne当作普通字符串输出,再拼接目标字符串和默认的换行符,实际输出内容是-ne Apps:apps1\n。
验证一下:-ne Apps:apps1\n的Base64编码恰好是LW5lIEFwcHM6YXBwczEK,末尾的K就是换行符\n的编码结果。
解决方法
有两种可靠的修复方案:
- 改用POSIX兼容的
printf替代echo,printf的行为在所有POSIX Shell中一致,不会出现参数解析问题:#!/bin/sh printf "Apps:apps1" | openssl enc -base64 - 如果确认脚本仅在Bash环境运行,将Shebang改为
#!/bin/bash,让Bash的echo参数规则生效。
内容的提问来源于stack exchange,提问作者Sujay Kumar
相关产品推荐
相关产品推荐

