我已经阅读了关于echo的手册页,它告诉我-e参数将允许转义字符(例如换行符的转义n)具有其特殊含义.当我输入命令
$ echo -e 'foo\nbar'
Run Code Online (Sandbox Code Playgroud)
进入一个交互式bash shell,我得到了预期的输出:
foo
bar
Run Code Online (Sandbox Code Playgroud)
但是,当我使用相同的命令(我已尝试将此命令字符作为测试用例的字符)时,我得到以下输出:
-e foo
bar
Run Code Online (Sandbox Code Playgroud)
这就好像echo将-e解释为一个参数(因为换行仍然显示),但它也将-e解释为一个回显的字符串.这里发生了什么?如何防止-e出现?
Pau*_*ce. 34
您需要将#!/bin/bash脚本用作第一行.如果您没有,或者您使用#!/bin/sh,该脚本将由Bourne shell运行,并且它echo无法识别该-e选项.通常,建议使用所有新脚本printf而不是echo可移植性是否重要.
在Ubuntu中,sh由符号链接提供/bin/dash.
不同的实现echo以令人烦恼的不同方式表现。有些不接受选项(即只会-e按照您的描述进行回显)并自动解释其参数中的转义序列。有些带有标志,除非给出标志,否则不会解释转义-e。有些采用标志,并根据-e标志是否被传递来解释不同的转义序列。如果你试图让它们以可预测的方式行事,有些会让你抓狂……哦,等等,这就是全部。
echo您可能在这里看到的是内置版本bash与/bin/echo其他 shell 内置版本之间的差异。当 Mac OS X v10.5 内置 bash 时,这让我很不爽echo回显标志的 bash 内置函数时,这让我很不舒服,这与我所有脚本的预期不同......
无论如何,有一个解决方案:使用printf替代。它始终解释其第一个参数(格式字符串)中的转义序列。问题是它不会自动添加换行符(所以你必须记住明确地添加换行符),而且它还解释%第一个参数中的序列(毕竟,它是一个格式字符串)。通常,您希望将所有格式化内容放入格式字符串中,然后将变量字符串放入其余参数中,以便您可以控制如何通过将它们%插入到输出中的格式来解释它们。一些例子:
printf "foo\nbar\n" # this does what you're trying to do in the example
printf "%s\n" "$var" # behaves like 'echo "$var"', except escapes will never be interpreted
printf "%b\n" "$var" # behaves like 'echo "$var"', except escapes will always be interpreted
printf "%b\n" "foo\nbar" # also does your example
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21573 次 |
| 最近记录: |