From 3a944de6060e05171730fddab8db5b4a5b176d31 Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Sat, 7 Jun 2014 13:47:40 -0700 Subject: [PATCH] Warn when concatening strings and arrays. --- ShellCheck/Analytics.hs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ShellCheck/Analytics.hs b/ShellCheck/Analytics.hs index df9641c..3744ce1 100644 --- a/ShellCheck/Analytics.hs +++ b/ShellCheck/Analytics.hs @@ -205,6 +205,7 @@ nodeChecks = [ ,checkAliasesUsesArgs ,checkShouldUseGrepQ ,checkTestGlobs + ,checkConcatenatedDollarAt ] @@ -853,6 +854,20 @@ checkUnquotedDollarAt p word@(T_NormalWord _ parts) | not isAssigned = isAssigned = any isAssignment . take 2 $ path checkUnquotedDollarAt _ _ = return () +prop_checkConcatenatedDollarAt1 = verify checkConcatenatedDollarAt "echo \"foo$@\"" +prop_checkConcatenatedDollarAt2 = verify checkConcatenatedDollarAt "echo ${arr[@]}lol" +prop_checkConcatenatedDollarAt3 = verify checkConcatenatedDollarAt "echo $a$@" +prop_checkConcatenatedDollarAt4 = verifyNot checkConcatenatedDollarAt "echo $@" +prop_checkConcatenatedDollarAt5 = verifyNot checkConcatenatedDollarAt "echo \"${arr[@]}\"" +checkConcatenatedDollarAt p word@(T_NormalWord {}) + | not $ isQuoteFree (parentMap p) word = + unless (null $ drop 1 parts) $ + mapM_ for array + where + parts = getWordParts word + array = take 1 $ filter isArrayExpansion parts + for t = err (getId t) 2145 "Argument mixes string and array. Use * or separate argument." +checkConcatenatedDollarAt _ _ = return () prop_checkArrayAsString1 = verify checkArrayAsString "a=$@" prop_checkArrayAsString2 = verify checkArrayAsString "a=\"${arr[@]}\""