128

I just saw this in an init script:

echo $"Stopping Apache"

What is that dollar-sign for?

My research so far:

I found this in the bash manual:

extquote

If set, $'string' and $"string" quoting is performed within ${parameter} expansions enclosed in double quotes. This option is enabled by default.

...but I'm not finding any difference between strings with and without the $ prefix:

$ echo "I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo "I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo 'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in $PWD'
I am in $PWD
Ed Brannin
  • 1,383

3 Answers3

164

There are two different things going on here, both documented in the bash manual

$'

Dollar-sign single quote is a special form of quoting:

ANSI C Quoting

Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard.

$"

Dollar-sign double-quote is for localization:

Locale translation

A double-quoted string preceded by a dollar sign (‘$’) will cause the string to be translated according to the current locale. If the current locale is C or POSIX, the dollar sign is ignored. If the string is translated and replaced, the replacement is double-quoted.

jw013
  • 51,212
  • Thanks for the example. What I don't understand is - why did ANSI support $'' when you can just use ""? I'm sure there's a reason and for my understanding it would be good to know. – Sridhar Sarnobat Jan 20 '21 at 21:39
  • I think the behavior of "\n" vs $'\n' is different but I'm still confused. – Sridhar Sarnobat Jan 20 '21 at 21:41
  • 1
    "" does not interpret that much. Try $'\x31' vs. "\x31". – domen May 17 '21 at 14:45
  • 1
    @SridharSarnobat, Another difference is: "$variable\n" will result in the contents of the variable followed by a newline, whereas $'$variable\n' will result in $variable followed by a newline. So, if you want to avoid escaping dollar signs and double quotes in a string and still be able to escape single quotes (for example if you are passing a complex command to a specific shell from within a bash script), then $'' is the way to go. – UrsineRaven Mar 28 '22 at 16:46
  • 1
    Ah yes I remember that Chinese characters' escape codes can be tab completed if you use dollar syntax. Thanks – Sridhar Sarnobat Mar 28 '22 at 17:56
  • Do you have any example of when $"..." is useful? I found the docs, too, but I do not really understand what they say. What does it mean to translate a string according to the current locale? I know what locale is, BTW. – Palec May 25 '23 at 20:03
  • 1
    @Palec This is for human language translation but in order for it to work you have to go through a lot of steps to set up translation files. More info under Creating Internationalized Scripts which for some reason is missing from the link above. – jw013 May 26 '23 at 02:29
36

When a string is expanded inside of $'', the escape sequences are interpreted. From the manpage:

Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by  the
ANSI  C  standard.

An easy example is the \n escape sequence for a newline:

$ echo 'foo\n'
foo\n
$ echo $'foo\n'
foo

$ 

Note: You may get different results in other shells as echo may interpret escape sequences without providing options.

jordanm
  • 42,678
-5

You're misinterpreting the manual. You'll only see an effect when a $-quoted string is inside a ${parameter} expansion.

$ echo "${v:-'ab\ncd'}"
'ab\ncd'
$ echo "${v:-$'ab\ncd'}"
ab
cd

Source and further reading: https://lists.gnu.org/archive/html/bug-bash/2005-10/msg00017.html

jw013
  • 51,212