重写 bash 命令以符合 ShellCheck

Posted

技术标签:

【中文标题】重写 bash 命令以符合 ShellCheck【英文标题】:Rewrite bash command to be ShellCheck compliant 【发布时间】:2018-01-24 00:21:23 【问题描述】:

如何重写以下 bash 命令以符合 ShellCheck 标准?

memory=$(cat /proc/meminfo | grep 'MemTotal:' | awk 'print $2' 2> /dev/null)

目前正在抱怨:

没用的猫。考虑'cmd 这个 是字面意思。

【问题讨论】:

我认为您的意思是“无用”而不是“除非”(考虑在将来剪切和粘贴错误)。我已经编辑它以适应。您是否考虑过按照该工具的建议进行更改? 【参考方案1】:

shellcheck 投诉是

使用cat <em>filename</em> | grep '<em>pattern</em>' 代替grep '<em>pattern</em>' <em>filename</em> awk 命令中的第一个大括号在单引号的外面,因此是字面的;应该是awk '<em>command</em>'

所以,满足 shellcheck 的版本应该是这样的

memory=$(grep 'MemTotal:' /proc/meminfo | awk 'print $2')

我不确定你为什么重定向标准错误,所以我放弃了它。

但是,将 grep 输出通过管道传输到 awk 很少是最好的解决方案; awk 几乎可以做任何 grep 可以做的事情,因此您可以进一步简化为

memory=$(awk '/MemTotal:/  print $2 ' /proc/meminfo)

没有管道!

【讨论】:

【参考方案2】:

只是猜测,你可能想要:

memory=$(grep 'MemTotal:' /proc/meminfo | awk 'print $2' 2> /dev/null)

但是,这是对 shellcheck 输出的直接解释,所以我不确定您要问什么。就目前而言,您本质上是在问:“为什么这不起作用?”。

【讨论】:

完美。谢谢。

以上是关于重写 bash 命令以符合 ShellCheck的主要内容,如果未能解决你的问题,请参考以下文章

ShellCheck 警告:“删除周围的 $() 以避免执行输出。[SC2091]”

linux bash 命令重定向和多命令执行

bash重命名所有符合模式的文件

Bash 语法错误

在 bash shell 中使用重命名命令重命名文件

如何在传递 ShellCheck 时通过环境变量将 glob 传递给 shell 脚本