如何在bash中打印感叹号?

时间:2013-02-21 20:43:02

标签: linux bash unix scripting

我需要printf一个简单的脚本并将输出重定向到一个文件,但当我这样做时:

printf "#!/bin/bash\ntouch /tmp/1234567890_$RUN" > /tmp/password-change-script_$RUN.sh

我收到此错误:

bash:!/ bin / bash \ ntouch:找不到事件

如果我逃避感叹号:

printf "#\!/bin/bash\ntouch /tmp/1234567890_$RUN" > /tmp/password-change-script_$RUN.sh

然后转义字符仍然存在于文件中。

cat /tmp/password-change-script_$RUN.sh
#\!/bin/bash
touch /tmp/1234567890_111

顺便说一句,在这种特殊情况下,#!/ bin / bash必须在文件中。由于某种原因,执行该脚本的二进制文件将不会读取该文件。

2 个答案:

答案 0 :(得分:11)

!字符在双引号字符串中展开,但不在单引号字符串中。

printf '#!/bin/bash\ntouch /tmp/1234567890_'"$RUN"

当它本身或一个词的结尾出现时,它也没有扩展;这不是那么干净但是:

printf "#%c/bin/bash\ntouch /tmp/1234567890_$RUN" !

您也可以通过(临时)将$histchars设置为空字符串来临时关闭历史记录替换;这关闭了!的特殊处理:

histchars=
printf "#!/bin/bash\ntouch /tmp/1234567890_$RUN"
unset histchars

或者您可以在脚本中而不是以交互方式执行printf命令(默认情况下,仅对交互式shell执行历史记录替换)。

答案 1 :(得分:7)

尝试这样做:

printf "\041"

这是!字符

的八进制ASCII表示

man ascii

另一种解决方案:

(
    set +o histexpand 
    printf "!"
)

(括号用于更改子shell 中的终端设置,因此更改是暂时的)

help set
set -o