bash与sh脚本不同的结果

bash与sh脚本不同的结果,bash,shell,macos-sierra,Bash,Shell,Macos Sierra,当我在macOS上的终端上运行这些线路时,我得到了正确的结果 hex=$(echo -n 'betty' | xxd -p) echo $hex 6265747479 但是当我在bash脚本中运行它们时,我得到了完全不同的结果 sh myscript.sh 62657474790a 这就像是出于某种原因,它把一辆马车停在了终点。为什么?尝试bash而不是sh。由于echo是一个内置命令,它取决于shell如何执行。对我来说,来自sh的回声似乎不支持-n: sh-3.2$ echo -n

当我在macOS上的终端上运行这些线路时,我得到了正确的结果

hex=$(echo -n 'betty' | xxd -p)
echo $hex

6265747479
但是当我在bash脚本中运行它们时,我得到了完全不同的结果

sh myscript.sh

62657474790a

这就像是出于某种原因,它把一辆马车停在了终点。为什么?

尝试
bash
而不是
sh
。由于
echo
是一个内置命令,它取决于shell如何执行。对我来说,来自sh的回声似乎不支持
-n

sh-3.2$ echo -n hello
-n hello
sh-3.2$ echo $(echo -n 'betty' | xxd -p)
2d6e2062657474790a

当将
-n
作为第一个参数时,不同版本的
echo
会做不同的事情。有些人将其打印为输出的一部分,有些人将其解释为一个标志,谁知道会发生什么。根据“如果第一个操作数是
-n
,或者如果任何操作数包含反斜杠字符,则结果由实现定义。”

使用
printf
打印字符串后,不使用换行符打印字符串的最可靠方法。它稍微复杂一点,因为您必须给它一个格式字符串以及要打印的字符串:

hex=$(printf "%s" 'betty' | xxd -p)

不能复制。请添加
cat myscript.sh的输出;sh myscript.sh
@Peter:首先,这不是回车,而是换行。第二,似乎涉及到不同的炮弹。在第二个示例中,您提供了
sh
作为shell,我们不知道sh在您的机器上链接到哪里。如果两者都是bash shell,那么它们可能是不同的版本(在两个变体中都使用
print$bash_VERSION
),它们以不同的方式实现
echo
。我很惊讶
echo-n'betty'
将生成该输出,它似乎是
betty
,后面是一个换行。我希望betty没有换行符,或者betty有换行符。与
echo-nbetty
相比,sh-c'echo-nbetty'到底打印了什么?
ls-l/bin/sh
说什么?
sh-c'echo-n betty'
给我
-n betty
echo-n betty
给我
betty
下一个提示与betty
ls-l/bin/sh
=
-r-xr-xr-x 1根轮630464月29日10:31/bin/sh
我明白了,因此,即使它们是同一个命令,运行时(sic)也可以用不同的方式处理它们。