如何在 bash 中使用 last -10 命令修改 printf

问题描述 投票:0回答:1

我在 Ubuntu 20.04 中有一个脚本,它定期发送一封包含一些服务器信息的电子邮件,最近有一行给我一个错误:

printf "Last logins (last -10) \n"$(last -10)" \n"

output:
Last logins (last -10) 
root     pts/4        192.168.3.120    Mon Mar 20 08:54   still logged in
root     pts/4        192.168.3.120    Mon Mar 20 08:47 - 08:53  (00:06)
reboot   system boot  5.4.0-144-generi Mon Mar 20 08:44   still running
bash: printf: ` ': invalid format character
dcn5     pts/9        tmux(7992).

所以看起来像显示字符串的东西。如果我只是做

last -10
我得到:

root     pts/4        192.168.3.120    Mon Mar 20 08:54   still logged in
root     pts/4        192.168.3.120    Mon Mar 20 08:47 - 08:53  (00:06)
reboot   system boot  5.4.0-144-generi Mon Mar 20 08:44   still running
dcn5     pts/9        tmux(7992).%3    Mon Mar 20 08:02 - 08:15  (00:12)
dcn5     pts/8        tmux(7992).%2    Mon Mar 20 08:02 - 08:15  (00:12)
dcn5     pts/7        tmux(7992).%1    Mon Mar 20 08:02 - 08:15  (00:12)
dcn5     pts/6        tmux(7992).%0    Mon Mar 20 08:02 - 08:02  (00:00)
root     pts/4        192.168.3.120    Mon Mar 20 07:51 - down   (00:52)
reboot   system boot  5.4.0-144-generi Mon Mar 20 07:50 - 08:44  (00:53)
dcn5     pts/8        tmux(25754).%3   Fri Mar 17 23:14 - 23:34  (00:20)

我怀疑这可能是

%
被视为特殊角色。不知道为什么会显示。在 Fedora 中,它永远不会这样显示。 那么如何修改
printf
命令不报错呢?

bash printf
1个回答
1
投票

printf
旨在像这样工作:

printf FORMAT_STRING ARG1 ARG2 ...

格式字符串描述了如何将参数插入到字符串中以及如何格式化它们。

简单的例子:

printf "%s %s!\n" "hello" "world"

%s
将按顺序替换
hello
world
。阅读有关 printf 和格式字符串的更多信息:https://www.gnu.org/software/gawk/manual/html_node/Printf-Examples.html

重要说明:(出于某些传统原因......)根据其签名,将参数传递给

printf
是可选的。这也允许更容易地将它用于常量消息(不包含可变内容的消息)。像这样:

printf "test\n"

代替

printf "%s\n" "test"

我最好的客人是为了方便才这样。但是在使用这个的时候,你必须确保你的消息不包含格式字符

%
.


关于你的例子。要打印的消息包含

%
字符,由
printf
解释为格式字符,您必须使用格式字符串:

printf "Last logins (last -10) \n %s" "$(last -10)"
© www.soinside.com 2019 - 2024. All rights reserved.