【问题标题】:Bash:Single Quotes and Double Quotes and Exclamation MarkBash:单引号和双引号和感叹号
【发布时间】:2011-05-16 19:58:45
【问题描述】:

我有一个名为example的简单脚本:

#!/bin/sh
echo $'${1}'

请注意这里$'' 的用法是将\n 转换为新行。 ${1} 是传递给这个 shell 脚本的第一个参数。

我想向这个脚本example 传递一个参数,它会打印以下内容:

#1. You're smart!
#2. It's a difficult question!

我尝试了以下方法:

example "#1. You're smart!\n#2. It's a difficult question!"

一个错误:-bash: !\n#2.: event not found

然后我尝试通过单引号转义!,并尝试:

example '#1. You're smart\!\n#2. It's a difficult question\!'

它输出:

${1}

这里有什么解决办法吗?非常感谢!

【问题讨论】:

  • 垫子提供了完美的解决方案!还要感谢 Chris Jester-Young 和 Jan Hudec。你们都是专家!

标签: linux bash shell command-line


【解决方案1】:
$ cat t.sh
#! /bin/bash
echo -e $@

或者echo -e $1,或者echo -e ${1},如果你只想处理第一个参数。

要让 bash 停止尝试扩展 !,请使用 set +H(请参阅 In bash, how do I escape an exclamation mark?

$ set +H
$ ./t.sh "#1. You're smart!\n#2. It's a difficult question!"
#1. You're smart!
#2. It's a difficult question!

【讨论】:

  • 非常感谢!但是我的不能工作,而你的可以:脚本是 echo -e ${1} 并使用 example "#1. You're smart!\n#2. It's a difficult question!" 它打印 #1. You're smart\! #2. It's a difficult question\! 请注意 \! 但我想要 !
  • 我已经编辑了我的评论。换行符有效,但我想要'!虽然它打印'\!'。
  • 那么还有其他问题,使用${1}(或普通$1)不会改变任何输出。尝试启动一个新的 shell,也许你已经搞砸了你的环境。
  • 关于! 的重要一点是set +H 命令(或set +o histexpand)。 (我使用的是 Bash 4.1.9,但这不会改变任何东西。)
  • 那里有一个链接的问题,请阅读。是的,这是每个会话。使用 man bash 并搜索 histexpand 以查看其工作原理和其他选项。
【解决方案2】:

$'' 表达式中的内容必须是文字。您不能在其中扩展其他变量。

但你可以这样做:

echo "${1//\\n/$'\n'}"

Jan Hudec 有一个更好的答案:

echo -e "$1"

【讨论】:

  • Echo 知道自己解释转义序列!它在不同的 shell 中以不同的方式完成,但只要只请求 bash,echo -e "$1" 就可以解决问题。
  • 我知道单引号不会扩展变量。但我需要换行符。 $'' 似乎是唯一的解决方案。
  • @Jan:是的,是的。我也会添加你的答案。 :-)
  • @DocWiki:我已经编辑了我的答案以使用$'',但与您使用它的方式不同。
猜你喜欢
  • 1970-01-01
  • 2021-08-29
  • 2010-10-29
相关资源
最近更新 更多