x-prefix: add support for "!=" and X (capital x)

Changes checkComparisonWithLeadingX to:
1) Work with the "!=" operator in addition to "=" and "==".
2) Support prefixing with "x" and "X". This is helpful since some scripts have comparisons like [ "X$var" = "X" ] and the like
This commit is contained in:
Christopher Slycord 2025-07-17 13:14:04 +09:00
commit 08329b0698

View file

@ -4320,11 +4320,12 @@ prop_checkComparisonWithLeadingX5 = verify checkComparisonWithLeadingX "[ \"x$fo
prop_checkComparisonWithLeadingX6 = verify checkComparisonWithLeadingX "[ x\"$foo\" = x'lol' ]"
checkComparisonWithLeadingX params t =
case t of
TC_Binary id typ op lhs rhs | op == "=" || op == "==" ->
TC_Binary id typ op lhs rhs
| op `elem` ["=", "==", "!="] ->
check lhs rhs
T_SimpleCommand _ _ [cmd, lhs, op, rhs] |
getLiteralString cmd == Just "test" &&
getLiteralString op `elem` [Just "=", Just "=="] ->
T_SimpleCommand _ _ [cmd, lhs, op, rhs]
| getLiteralString cmd == Just "test" &&
getLiteralString op `elem` [Just "=", Just "==", Just "!="] ->
check lhs rhs
_ -> return ()
where
@ -4336,18 +4337,19 @@ checkComparisonWithLeadingX params t =
fixLeadingX token =
case getWordParts token of
T_Literal id ('x':_):_ ->
T_Literal id (c:_):_ | toLower c == 'x' ->
case token of
-- The side is a single, unquoted x, so we have to quote
T_NormalWord _ [T_Literal id "x"] ->
-- The side is a single, unquoted x or X, so we have to quote
T_NormalWord _ [T_Literal id [c]] ->
return $ replaceStart id params 1 "\"\""
-- Otherwise we can just delete it
_ -> return $ replaceStart id params 1 ""
T_SingleQuoted id ('x':_):_ ->
-- Replace the single quote and x
T_SingleQuoted id (c:rest):_ | toLower c == 'x' ->
-- Replace the single quote and the character x or X
return $ replaceStart id params 2 "'"
_ -> Nothing
prop_checkAssignToSelf1 = verify checkAssignToSelf "x=$x"
prop_checkAssignToSelf2 = verify checkAssignToSelf "x=${x}"
prop_checkAssignToSelf3 = verify checkAssignToSelf "x=\"$x\""