Shell-Script

關於引用的 ShellCheck 警告 (‘A’B’C’)

  • December 27, 2020

我正在編寫簡單的 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"
}

單弦

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

是相同的

"ifconfig_$Bridge=addm $NIC"

(不需要大括號,整個字元串可以用一組雙引號引起來)

由於您使用雙引號來引用同一字元串的兩個單獨部分,ShellCheck 想知道您是否可能意味著引號的“內部對”是文字的並且實際上是字元串的一部分,即您是否打算編寫fconfig_"${Bridge}\"=\"addm ${NIC}".

既然你沒有,最好像我之前展示的那樣重寫字元串,只是為了清楚地表明它是一個沒有嵌入引號的單個字元串。

請注意,關於此處的引用,您的程式碼沒有出錯,並且 ShellCheck 只是詢問您的意圖,因為當您確實需要在字元串中包含文字雙引號時,這(可以說)是一個常見錯誤。

如果您對引用字元串的方式有強烈的感覺,那麼您可以在受影響的行之前的註釋中使用指令禁用ShellCheck 警告:

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

這基本上意味著“我知道我在做什麼,規則 SC2140 不適用於這裡,非常感謝。”

引用自:https://unix.stackexchange.com/questions/626241