SC2004 Shell 計算參數值時無須代入 $ / $ {}

小編最近在協助公司撰寫設備檢查 Shell Script,使用了工具 VS code 裡面有套件協助檢查編輯或是程式語法錯誤等問題。發現在編輯習慣上會導致的錯誤,也近一步得到修正,順便就把有修正的錯誤做的紀錄,提醒自己變更寫作習慣。

錯誤代碼:

echo $(($n + ${arr[i]}))

正確代碼:

echo $((n + arr[i]))

修正原因:

在計算的上下文忠,變量符號 $ 或 ${..} 是不必要的,甚至會因此而導致加減乘除的優先順序的計算錯誤。因為變數中的內容會先被解析成字串後,然後再作為表達示求值:

$ a='1+1'
$ echo $(($a*5)) #公式將解析成 1+1*5 答案為 6
6 
$ echo $((a*5)) # 公式將解析成 (1+1)*5 答案為 10
10

$對於諸如$1vs 1,$#vs的特殊變量,這是不可避免的#。向參數擴展(例如${#var}或)中添加修飾符時,也需要使用此屬性${var%-}。ShellCheck不會對這些情況發出警告。
該$還需要(而不是警告)當您需要指定基地的變量值:

$ a=09
$ echo $((a + 1))   # leading zero forces octal interpretation
bash: 09: value too great for base (error token is "09")
$ echo $((10#a + 1))
bash: 10#a: value too great for base (error token is "10#a")
$ echo $((10#$a + 1))
10

參考資料:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *