diff --git a/CHANGELOG.md b/CHANGELOG.md index af762b6..92b65d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - SC2289: Warn when command name contains tabs or linefeeds ### Fixed +- SC2290: Warn about misused = in declare & co, which were not caught by SC2270+ ### Changed - SC2048: Warning about $\* now also applies to ${array[\*]} diff --git a/src/ShellCheck/Checks/Commands.hs b/src/ShellCheck/Checks/Commands.hs index d7452e2..0d8deae 100644 --- a/src/ShellCheck/Checks/Commands.hs +++ b/src/ShellCheck/Checks/Commands.hs @@ -95,6 +95,11 @@ commandChecks = [ ,checkSourceArgs ,checkChmodDashr ,checkXargsDashi + ,checkArgComparison "local" + ,checkArgComparison "declare" + ,checkArgComparison "export" + ,checkArgComparison "readonly" + ,checkArgComparison "typeset" ] optionalChecks = map fst optionalCommandChecks @@ -1143,5 +1148,31 @@ checkXargsDashi = CommandCheck (Basename "xargs") f return $ info (getId option) 2267 "GNU xargs -i is deprecated in favor of -I{}" parseOpts = getBsdOpts "0oprtxadR:S:J:L:l:n:P:s:e:E:i:I:" + +prop_checkArgComparison1 = verify (checkArgComparison "declare") "declare a = b" +prop_checkArgComparison2 = verify (checkArgComparison "declare") "declare a =b" +prop_checkArgComparison3 = verifyNot (checkArgComparison "declare") "declare a=b" +prop_checkArgComparison4 = verify (checkArgComparison "export") "export a +=b" +prop_checkArgComparison7 = verifyNot (checkArgComparison "declare") "declare -a +i foo" +-- This mirrors checkSecondArgIsComparison but for arguments to local/readonly/declare/export +checkArgComparison str = CommandCheck (Exactly str) wordsWithEqual + where + wordsWithEqual t = mapM_ check $ drop 1 $ arguments t + check arg = sequence_ $ do + str <- getLeadingUnquotedString arg + case str of + '=':_ -> + return $ err (headId arg) 2290 $ + "Remove spaces around = to assign." + '+':'=':_ -> + return $ err (headId arg) 2290 $ + "Remove spaces around += to append." + _ -> Nothing + + headId t = + case t of + T_NormalWord _ (x:_) -> getId x + _ -> getId t + return [] runTests = $( [| $(forAllProperties) (quickCheckWithResult (stdArgs { maxSuccess = 1 }) ) |])