当我在Mac OS运行在我的终端,这些行我得到正确的结果庆典VS sh脚本不同的结果
hex=$(echo -n 'betty' | xxd -p)
echo $hex
6265747479
,但是当我在bash脚本运行它们,我得到完全不同的东西
sh myscript.sh
62657474790a
这就像它由于某种原因将回车放在最后。为什么?
当我在Mac OS运行在我的终端,这些行我得到正确的结果庆典VS sh脚本不同的结果
hex=$(echo -n 'betty' | xxd -p)
echo $hex
6265747479
,但是当我在bash脚本运行它们,我得到完全不同的东西
sh myscript.sh
62657474790a
这就像它由于某种原因将回车放在最后。为什么?
不同版本的echo
做不同的事情给出-n
作为他们的第一个参数的时候。有些人将其作为他们输出的一部分进行打印,有些人将其解读为旗帜,谁知道会发生什么。根据POSIX standard for echo
,“如果第一个操作数是-n
,或者任何操作数包含反斜杠字符,则结果是实现定义的。”
在printf
之后打印没有换行的字符串的最可靠的方法。它稍微复杂一点,因为您必须给它一个格式字符串以及要打印的字符串:
hex=$(printf "%s" 'betty' | xxd -p)
我明白了,即使它们是相同的命令,运行时(sic)也可以用不同的方式处理它们。 – Peter
尝试bash
而不是sh
。由于echo
是内置的命令,它依赖于shell如何执行。对我来说,从SH回声似乎并不支持-n
:
sh-3.2$ echo -n hello
-n hello
sh-3.2$ echo $(echo -n 'betty' | xxd -p)
2d6e2062657474790a
无法重现。请添加'cat myscript.sh的输出; sh myscript.sh' – Leon
@Peter:首先,它不是*回车*,它是*换行*。其次,似乎涉及不同的炮弹。在你的第二个例子中,你提供'sh'作为shell,并且我们不知道sh在你的机器上连接到哪里。如果两者都是bash shell,它们可能是不同的版本(在两种版本中都做一个'print $ BASH_VERSION'),它们以不同的方式实现'echo'。 – user1934428
我很惊讶'echo -n'betty''会产生输出,这个输出看起来是'betty'后跟一个换行符。我希望不带换行符的'betty',或换行符的'-n betty'。与'echo -n betty'相比,'sh -c'echo -n betty'' print究竟是什么? 'ls -l/bin/sh'说什么? –