From a20a3499ed08fccb9dd603152f78347eaec8b846 Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Fri, 5 Jul 2013 09:15:08 -0700 Subject: [PATCH] Improved bad indirection detection --- ShellCheck/Analytics.hs | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/ShellCheck/Analytics.hs b/ShellCheck/Analytics.hs index 90fd8d4..0d446c6 100644 --- a/ShellCheck/Analytics.hs +++ b/ShellCheck/Analytics.hs @@ -1096,16 +1096,26 @@ checkBackticks _ = return () prop_checkIndirectExpansion1 = verify checkIndirectExpansion "${foo$n}" prop_checkIndirectExpansion2 = verifyNot checkIndirectExpansion "${foo//$n/lol}" -checkIndirectExpansion (T_DollarBraced id (T_NormalWord _ ((T_Literal _ s):attempt:_))) = - case attempt of T_DollarExpansion _ _ -> doit - T_Backticked _ _ -> doit - T_DollarBraced _ _ -> doit - T_DollarArithmetic _ _ -> doit - _ -> return () +prop_checkIndirectExpansion3 = verify checkIndirectExpansion "${$#}" +prop_checkIndirectExpansion4 = verify checkIndirectExpansion "${var${n}_$((i%2))}" +prop_checkIndirectExpansion5 = verifyNot checkIndirectExpansion "${bar}" +checkIndirectExpansion (T_DollarBraced i (T_NormalWord _ contents)) = + when (isIndirection contents) $ + err i "To expand via indirection, use name=\"foo$n\"; echo \"${!name}\"." where - doit = if all isVariableChar s - then err id "To expand via indirection, use name=\"foo$n\"; echo \"${!name}\"" - else return () + isIndirection vars = + let list = catMaybes (map isIndirectionPart vars) in + not (null list) && all id list + isIndirectionPart t = + case t of T_DollarExpansion _ _ -> Just True + T_Backticked _ _ -> Just True + T_DollarBraced _ _ -> Just True + T_DollarArithmetic _ _ -> Just True + T_Literal _ s -> if all isVariableChar s + then Nothing + else Just False + _ -> Just False + checkIndirectExpansion _ = return () prop_checkInexplicablyUnquoted1 = verify checkInexplicablyUnquoted "echo 'var='value';'"