为什么 shell 脚本中的 printf 命令会出错

为什么 shell 脚本中的 printf 命令会出错

我有一个脚本,可以向我发送有关不同机器的一些信息,它在 Fedora 机器上运行良好,但 Ubuntu 20.04 只给我一个 printf 错误。我似乎看不出我做错了什么。所以语句是:

#printf "Last logins (last -10) \n `last -10` \n"
Last logins (last -10) 
bash: printf: ` ': invalid format character
 vecn1    pts/8        tmux(1233684).

而类似的语句则可以正常工作:

printf "Default gw (ip ro ls) \n`ip ro ls` \n"
Default gw (ip ro ls) 
default via 192.168.111.1 dev en0 proto dhcp src 192.168.111.6 metric 100 
192.168.111.0/24 dev en0 proto kernel scope link src 192.168.111.6 
192.168.111.1 dev en0 proto dhcp scope link src 192.168.111.6 metric 100 

我做错了什么?也许是那些“%”数字?不知道为什么会有这些数字。通常只是一个主机名(ip)。如果我这样做,last -10以下是输出

vecn1    pts/8        tmux(1233684).%3 Mon Dec 26 11:29 - 12:01  (00:31)
vecn1    pts/7        tmux(1233684).%2 Mon Dec 26 11:29 - 12:01  (00:31)
vecn1    pts/6        tmux(1233684).%1 Mon Dec 26 11:29 - 12:01  (00:31)
vecn1    pts/5        tmux(1233684).%0 Mon Dec 26 11:29 - 11:29  (00:00)
vecn1    pts/8        tmux(1232989).%3 Mon Dec 26 11:27 - 11:29  (00:01)
vecn1    pts/7        tmux(1232989).%2 Mon Dec 26 11:27 - 11:29  (00:01)
vecn1    pts/6        tmux(1232989).%1 Mon Dec 26 11:27 - 11:29  (00:01)
vecn1    pts/5        tmux(1232989).%0 Mon Dec 26 11:27 - 11:27  (00:00)
vecn1    pts/8        tmux(1198190).%3 Mon Dec 26 11:03 - 11:04  (00:00)
vecn1    pts/7        tmux(1198190).%2 Mon Dec 26 11:03 - 11:04  (00:00)

wtmp begins Wed Jun 22 17:27:34 2022

谢谢

答案1

是的,很可能是%符号。

您应该始终避免将代码注入函数的格式字符串;而是使用适当的格式说明符(如果是字符串)printf将命令的结果作为参数传递:%s

printf 'Last logins (last -10)\n%s\n' "`last -10`"

或更好(避免使用已弃用的反引号形式的命令替换)

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

相关内容