mirror of
				https://github.com/koalaman/shellcheck.git
				synced 2025-11-04 09:26:10 +08:00 
			
		
		
		
	Merge branch 'bug562'
This commit is contained in:
		@@ -111,6 +111,7 @@ data Token =
 | 
			
		||||
    | T_NormalWord Id [Token]
 | 
			
		||||
    | T_OR_IF Id
 | 
			
		||||
    | T_OrIf Id (Token) (Token)
 | 
			
		||||
    | T_ParamSubSpecialChar Id String -- e.g. '%' in ${foo%bar}  or '/' in ${foo/bar/baz}
 | 
			
		||||
    | T_Pipeline Id [Token] [Token] -- [Pipe separators] [Commands]
 | 
			
		||||
    | T_ProcSub Id String [Token]
 | 
			
		||||
    | T_Rbrace Id
 | 
			
		||||
@@ -319,6 +320,7 @@ getId t = case t of
 | 
			
		||||
        T_DollarBraced id _  -> id
 | 
			
		||||
        T_DollarArithmetic id _  -> id
 | 
			
		||||
        T_BraceExpansion id _  -> id
 | 
			
		||||
        T_ParamSubSpecialChar id _ -> id
 | 
			
		||||
        T_DollarBraceCommandExpansion id _  -> id
 | 
			
		||||
        T_IoFile id _ _  -> id
 | 
			
		||||
        T_IoDuplicate id _ _  -> id
 | 
			
		||||
 
 | 
			
		||||
@@ -86,6 +86,7 @@ oversimplify token =
 | 
			
		||||
        (T_Glob _ s) -> [s]
 | 
			
		||||
        (T_Pipeline _ _ [x]) -> oversimplify x
 | 
			
		||||
        (T_Literal _ x) -> [x]
 | 
			
		||||
        (T_ParamSubSpecialChar _ x) -> [x]
 | 
			
		||||
        (T_SimpleCommand _ vars words) -> concatMap oversimplify words
 | 
			
		||||
        (T_Redirecting _ _ foo) -> oversimplify foo
 | 
			
		||||
        (T_DollarSingleQuoted _ s) -> [s]
 | 
			
		||||
@@ -188,6 +189,7 @@ getLiteralStringExt more = g
 | 
			
		||||
    g (TA_Expansion _ l) = allInList l
 | 
			
		||||
    g (T_SingleQuoted _ s) = return s
 | 
			
		||||
    g (T_Literal _ s) = return s
 | 
			
		||||
    g (T_ParamSubSpecialChar _ s) = return s
 | 
			
		||||
    g x = more x
 | 
			
		||||
 | 
			
		||||
-- Is this token a string literal?
 | 
			
		||||
 
 | 
			
		||||
@@ -1324,6 +1324,7 @@ prop_checkInexplicablyUnquoted3 = verifyNot checkInexplicablyUnquoted "wget --us
 | 
			
		||||
prop_checkInexplicablyUnquoted4 = verify checkInexplicablyUnquoted "echo \"VALUES (\"id\")\""
 | 
			
		||||
prop_checkInexplicablyUnquoted5 = verifyNot checkInexplicablyUnquoted "\"$dir\"/\"$file\""
 | 
			
		||||
prop_checkInexplicablyUnquoted6 = verifyNot checkInexplicablyUnquoted "\"$dir\"some_stuff\"$file\""
 | 
			
		||||
prop_checkInexplicablyUnquoted7 = verifyNot checkInexplicablyUnquoted "${dir/\"foo\"/\"bar\"}"
 | 
			
		||||
checkInexplicablyUnquoted _ (T_NormalWord id tokens) = mapM_ check (tails tokens)
 | 
			
		||||
  where
 | 
			
		||||
    check (T_SingleQuoted _ _:T_Literal id str:_)
 | 
			
		||||
@@ -1352,7 +1353,7 @@ checkInexplicablyUnquoted _ (T_NormalWord id tokens) = mapM_ check (tails tokens
 | 
			
		||||
    warnAboutExpansion id =
 | 
			
		||||
        warn id 2027 "The surrounding quotes actually unquote this. Remove or escape them."
 | 
			
		||||
    warnAboutLiteral id =
 | 
			
		||||
        warn id 2140 "Word is on the form \"A\"B\"C\" (B indicated). Did you mean \"ABC\" or \"A\\\"B\\\"C\"?"
 | 
			
		||||
        warn id 2140 "Word is of the form \"A\"B\"C\" (B indicated). Did you mean \"ABC\" or \"A\\\"B\\\"C\"?"
 | 
			
		||||
checkInexplicablyUnquoted _ _ = return ()
 | 
			
		||||
 | 
			
		||||
prop_checkTildeInQuotes1 = verify checkTildeInQuotes "var=\"~/out.txt\""
 | 
			
		||||
 
 | 
			
		||||
@@ -64,6 +64,7 @@ variableStart = upper <|> lower <|> oneOf "_"
 | 
			
		||||
variableChars = upper <|> lower <|> digit <|> oneOf "_"
 | 
			
		||||
functionChars = variableChars <|> oneOf ":+-.?"
 | 
			
		||||
specialVariable = oneOf "@*#?-$!"
 | 
			
		||||
paramSubSpecialChars = oneOf "/:+-=%"
 | 
			
		||||
quotableChars = "|&;<>()\\ '\t\n\r\xA0" ++ doubleQuotableChars
 | 
			
		||||
quotable = almostSpace <|> unicodeDoubleQuote <|> oneOf quotableChars
 | 
			
		||||
bracedQuotable = oneOf "}\"$`'"
 | 
			
		||||
@@ -1003,13 +1004,19 @@ readDollarBracedWord = do
 | 
			
		||||
    list <- many readDollarBracedPart
 | 
			
		||||
    return $ T_NormalWord id list
 | 
			
		||||
 | 
			
		||||
readDollarBracedPart = readSingleQuoted <|> readDoubleQuoted <|> readExtglob <|> readNormalDollar <|> readUnquotedBackTicked <|> readDollarBracedLiteral
 | 
			
		||||
readDollarBracedPart = readSingleQuoted <|> readDoubleQuoted <|>
 | 
			
		||||
                       readParamSubSpecialChar <|> readExtglob <|> readNormalDollar <|>
 | 
			
		||||
                       readUnquotedBackTicked <|> readDollarBracedLiteral
 | 
			
		||||
 | 
			
		||||
readDollarBracedLiteral = do
 | 
			
		||||
    id <- getNextId
 | 
			
		||||
    vars <- (readBraceEscaped <|> (anyChar >>= \x -> return [x])) `reluctantlyTill1` bracedQuotable
 | 
			
		||||
    return $ T_Literal id $ concat vars
 | 
			
		||||
 | 
			
		||||
readParamSubSpecialChar = do
 | 
			
		||||
    id <- getNextId
 | 
			
		||||
    T_ParamSubSpecialChar id <$> many1 paramSubSpecialChars
 | 
			
		||||
 | 
			
		||||
prop_readProcSub1 = isOk readProcSub "<(echo test | wc -l)"
 | 
			
		||||
prop_readProcSub2 = isOk readProcSub "<(  if true; then true; fi )"
 | 
			
		||||
prop_readProcSub3 = isOk readProcSub "<( # nothing here \n)"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user