我正在编写简单的 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}"