111

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
0

3 Answers 3

144

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.

5
  • 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. Jan 20, 2021 at 21:39
  • I think the behavior of "\n" vs $'\n' is different but I'm still confused. Jan 20, 2021 at 21:41
  • 1
    "" does not interpret that much. Try $'\x31' vs. "\x31".
    – domen
    May 17, 2021 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. Mar 28 at 16:46
  • Ah yes I remember that Chinese characters' escape codes can be tab completed if you use dollar syntax. Thanks Mar 28 at 17:56
33

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.

1
  • 13
    There is no mention of $"...", as per the question.
    – Peter.O
    Sep 14, 2012 at 7:05
-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

4
  • 6
    This doesn't answer the question: $"…" is something different. Sep 13, 2012 at 23:55
  • 4
    Sorry, but your answer is wrong: there is no need to use ${} expansion to make use of ANSI quoting. Check for yourself: echo $'ab\ncd' Sep 14, 2012 at 7:04
  • 1
    I think this answer was trying to explain extquote incorrectly instead of what the question was asking.
    – jw013
    Sep 14, 2012 at 14:48
  • 1
    "${...}" is different than $"..." Jul 27, 2017 at 22:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.