2

What is difference between $* and $@ positional variable in linux. I read somewhere using $* is is security risk. Is it true.

1 Answer 1

6

Basically they're the same except when the variable is enclosed in double quotes. Then $* expands to a single word and $@ expands to separate words. I don't see any merit to claims that $* is a security risk.

From the bash man page:

   *      Expands  to  the positional parameters, starting from one.  When
          the expansion occurs within double quotes, it expands to a  sin-
          gle word with the value of each parameter separated by the first
          character of the IFS special variable.  That is, "$*" is equiva-
          lent to "$1c$2c...", where c is the first character of the value
          of the IFS variable.  If IFS is unset, the parameters are  sepa-
          rated  by  spaces.   If  IFS  is null, the parameters are joined
          without intervening separators.
   @      Expands to the positional parameters, starting from  one.   When
          the  expansion  occurs  within  double  quotes,  each  parameter
          expands to a separate word.  That is, "$@" is equivalent to "$1"
          "$2"  ...   If the double-quoted expansion occurs within a word,
          the expansion of the first parameter is joined with  the  begin-
          ning  part  of  the original word, and the expansion of the last
          parameter is joined with the last part  of  the  original  word.
          When  there  are no positional parameters, "$@" and $@ expand to
          nothing (i.e., they are removed).
3
  • I don't get your sentence "It should always be quoted, of course" unless you are referring to "$@".
    – jlliagre
    Apr 7, 2011 at 10:00
  • Fair enough. That was needlessly and perhaps confusingly broad. Redacted.
    – Insyte
    Apr 7, 2011 at 15:56
  • The security risk I can think is expanding to the wrong thing. Suppose you have a file list with two files "rm" and "-f /". $* will expand to "rm -rf /" while $@ will expand correctly to "rm" and "-f /". That's a crude example, but you can see how $* can go wrong on a for loop or related.
    – coredump
    Apr 7, 2011 at 16:12

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .