Since I cannot mark this as a duplicate of a non AksUbuntu stack exchange site... I have shamelessly copied this answer over.
man bash we can read in Shell Builtin Commands section:
Unless otherwise noted, each builtin command documented in this section as accepting options preceded by
-- to signify the end of the options.
test builtins do not accept options and do not treat
-- specially. The
shift builtins accept and process arguments beginning with
- without requiring
--. Other builtins that accept arguments but are not specified as accepting options interpret arguments beginning with
- as invalid options and require
-- to prevent this interpretation.
echo does not interpret
-- to mean the end of options.
More precisely, a double dash (
--) is used in most bash built-in commands and many other commands to signify the end of command options, after which only positional parameters are accepted.
Example use: lets say you want to grep a file for the string
-v - normally
-v will be considered the option to reverse the matching meaning (only show lines that do not match), but with
-- you can grep for string
-v like this:
grep -- -v file