如果我想要像:
foo="bar baz"
foo='bar baz'
Run Code Online (Sandbox Code Playgroud)
使用双引号或单引号是最佳做法吗?
这通常依赖于:
echo "${USER} uses ${LANG#*.} encoding")之类的有用的东西,但是你不能在它们中包含转义序列.这意味着您通常无法看到示例"[space][tab]"和"[tab]"字符串之间的区别.Dollar-single引用的字符串很像双引号字符串,但可以包含控制字符.我个人最喜欢的单元测试:
$ echo -n $'--$`!*@\a\b\E\f\r\t\v\\\'"\360\240\202\211 \n' | uniname -bcepu
glyph name
- HYPHEN-MINUS
- HYPHEN-MINUS
$ DOLLAR SIGN
` GRAVE ACCENT
! EXCLAMATION MARK
* ASTERISK
@ COMMERCIAL AT
BELL
BACKSPACE
ESCAPE
FORM FEED (FF)
CARRIAGE RETURN (CR)
CHARACTER TABULATION
LINE TABULATION
\ REVERSE SOLIDUS
' APOSTROPHE
" QUOTATION MARK
Unknown character in range CJK Unified Ideographs Extension B
SPACE
LINE FEED (LF)
Run Code Online (Sandbox Code Playgroud)如果您想知道是否应该$'对变量使用引用,请尝试将其发送到printf %q:
$ var=foo
$ printf %q "$var"
foo
$ var="foo
> bar"
$ printf %q "$var"
$'foo\nbar'
Run Code Online (Sandbox Code Playgroud)
我倾向于使用双引号,除非我真的需要使用单引号来停止变量插值或其他原因.
也许这是我在使用双引号而不是单引号等Pascal,Fortran和Basic等语言成长的过程中的一部分.但是,由于您在BASH中使用的大多数字符串都会进行变量插值,因此您可能习惯使用双引号而不是在语句中是否需要双引号或单引号.你变量可能是:
foo='Thank you!'
Run Code Online (Sandbox Code Playgroud)
现在,但是当你修改它时:
foo='Thank you, $name!'
Run Code Online (Sandbox Code Playgroud)
您不必记得编辑引号,而您也可以.
在您实际需要单引号的少数情况下,您可以轻松地在心理上转移相反的方式.