diff --git a/src/ShellCheck/Analytics.hs b/src/ShellCheck/Analytics.hs index f5c1a18..40f6375 100644 --- a/src/ShellCheck/Analytics.hs +++ b/src/ShellCheck/Analytics.hs @@ -2232,6 +2232,16 @@ prop_checkUnassignedReferences41= verifyNotTree checkUnassignedReferences "mapfi prop_checkUnassignedReferences42= verifyNotTree checkUnassignedReferences "mapfile files -t; echo \"${files[@]}\"" prop_checkUnassignedReferences43= verifyNotTree checkUnassignedReferences "mapfile --future files; echo \"${files[@]}\"" +prop_checkUnassignedReferences_minusNPlain = verifyNotTree checkUnassignedReferences "if [ -n \"$x\" ]; then echo $x; fi" +prop_checkUnassignedReferences_minusZPlain = verifyNotTree checkUnassignedReferences "if [ -z \"$x\" ]; then echo \"\"; fi" +prop_checkUnassignedReferences_minusNBraced = verifyNotTree checkUnassignedReferences "if [ -n \"${x}\" ]; then echo $x; fi" +prop_checkUnassignedReferences_minusZBraced = verifyNotTree checkUnassignedReferences "if [ -z \"${x}\" ]; then echo \"\"; fi" +prop_checkUnassignedReferences_minusNDefault = verifyNotTree checkUnassignedReferences "if [ -n \"${x:-}\" ]; then echo $x; fi" +prop_checkUnassignedReferences_minusZDefault = verifyNotTree checkUnassignedReferences "if [ -z \"${x:-}\" ]; then echo \"\"; fi" + +prop_checkUnassignedReferences_minusZInsteadOfN = verifyTree checkUnassignedReferences "if [ -z \"$x\" ]; then echo $x; fi" +prop_checkUnassignedReferences_minusZInsteadOfNBraced = verifyTree checkUnassignedReferences "if [ -z \"${x}\" ]; then echo $x; fi" + checkUnassignedReferences = checkUnassignedReferences' False checkUnassignedReferences' includeGlobals params t = warnings where diff --git a/src/ShellCheck/AnalyzerLib.hs b/src/ShellCheck/AnalyzerLib.hs index 596340b..d87362c 100644 --- a/src/ShellCheck/AnalyzerLib.hs +++ b/src/ShellCheck/AnalyzerLib.hs @@ -499,7 +499,10 @@ getModifiedVariables t = guard . not . null $ str return (t, token, str, DataString SourceChecked) - T_DollarBraced _ _ l -> do + TC_Unary _ _ "-n" (T_NormalWord _ [T_DoubleQuoted _ [db@(T_DollarBraced _ _ l)]]) -> + [(t, t, getBracedReference (concat $ oversimplify l), DataString SourceChecked)] + + T_DollarBraced _ _ l -> maybeToList $ do let string = concat $ oversimplify l let modifier = getBracedModifier string guard $ any (`isPrefixOf` modifier) ["=", ":="] @@ -723,7 +726,9 @@ getOffsetReferences mods = fromMaybe [] $ do getReferencedVariables parents t = case t of T_DollarBraced id _ l -> let str = concat $ oversimplify l in - (t, t, getBracedReference str) : + if isMinusZTest t + then [] + else (t, t, getBracedReference str) : map (\x -> (l, l, x)) ( getIndexReferences str ++ getOffsetReferences (getBracedModifier str)) @@ -777,6 +782,10 @@ getReferencedVariables parents t = this: TA_Assignment _ "=" lhs _ :_ -> lhs == t _ -> False + isMinusZTest t = case getPath parents t of + _ : T_DoubleQuoted _ [_] : T_NormalWord _ [_] : TC_Unary _ SingleBracket "-z" _ : _ -> True + _ -> False + dataTypeFrom defaultType v = (case v of T_Array {} -> DataArray; _ -> defaultType) $ SourceFrom [v]