关于引用(“A”B“C”)的 ShellCheck 警告

关于引用(“A”B“C”)的 ShellCheck 警告

我正在编写简单的 shell 脚本,当我检查我的脚本时https://www.shellcheck.net它在第 14 行给了我错误

Line 14:
  sysrc ifconfig_"${Bridge}"="addm ${NIC}"
                            ^-- SC2140: Word is of the form "A"B"C" (B indicated). Did you mean "ABC" or "A\"B\"C"?

https://github.com/koalaman/shellcheck/wiki/SC2140

事实上我不明白如何纠正它

#!/bin/sh

Setup() {
  # Determine interface automatically
  NIC="$(ifconfig -l | awk '{print $1}')"
  # Enabling the Bridge
  Bridge="$(ifconfig bridge create)"
  # Next, add the local interface as member of the bridge.
  # for the bridge to forward packets,
  # all member interfaces and the bridge need to be up:
  ifconfig "${Bridge}" addm "${NIC}" up
  # /etc/rc.conf
  sysrc cloned_interfaces="${Bridge}"
  sysrc ifconfig_"${Bridge}"="addm ${NIC}"

  # Create bhyve startup script
  touch /usr/local/etc/rc.d/bhyve
  chmod +x /usr/local/etc/rc.d/bhyve
  cat << 'EOF' >> /usr/local/etc/rc.d/bhyve
#!/bin/sh
# PROVIDE: bhyve
# REQUIRE: DAEMON
# KEYWORD: shutdown
. /etc/rc.subr
name=bhyve
start_cmd="${name}"_start
bhyve_start() {
}
load_rc_config "${name}"
run_rc_command "$1"
EOF
  sysrc bhyve_enable="YES"
}

答案1

单串

ifconfig_"${Bridge}"="addm ${NIC}"

是相同的

"ifconfig_$Bridge=addm $NIC"

(不需要大括号,整个字符串可以用一组双引号引起来)

由于您使用双引号来引用同一字符串的两个单独部分,因此 ShellCheck 想知道您是否可能将“内部一对”引号视为文字,并且实际上是字符串的一部分,即您是否打算编写fconfig_"${Bridge}\"=\"addm ${NIC}".

既然你没有,最好像我之前展示的那样重写该字符串,只是为了清楚地表明它是一个没有嵌入引号的单个字符串。

请注意,关于此处的引用,您的代码中没有犯任何错误,并且 ShellCheck 只是询问您的意图,因为这是(可以说)当您想要在字符串中包含文字双引号。

如果您对引用字符串的方式有强烈的感觉,那么您可以禁用ShellCheck 警告在受影响的行之前的注释中带有指令:

# shellcheck disable=SC2140
sysrc ifconfig_"${Bridge}"="addm ${NIC}"

这基本上意味着“我知道我在做什么,并且 SC2140 规则在这里不适用,非常感谢。”

答案2

如果您遵循SC2140 的建议解释链接,你得到这个文本,

有问题的代码:

echo "<img src="foo.png" />" > file.html

或者

export "var"="42"

正确代码:

echo "<img src=\"foo.png\" />" > file.html

或者

export "var=42"

看看第二个例子——它的结构几乎与你的代码相同

sysrc ifconfig_"${Bridge}"="addm ${NIC}"

您被告知的是检查双引号是否应该是字符串的一部分,或者您是否只是有不需要的额外双引号。在你的情况下,这是第二个选项,这一行可能应该更好地写为

sysrc "ifconfig_${Bridge}=addm ${NIC}"

相关内容