我试图弄清楚“”和“”之间的区别。
当我将它们一起使用时,echo
它们都会产生相同的结果,
sps@sps-Inspiron-N5110:~$ echo Hello world
Hello world
sps@sps-Inspiron-N5110:~$ echo "Hello world"
Hello world
sps@sps-Inspiron-N5110:~$ echo 'Hello world'
Hello world
sps@sps-Inspiron-N5110:~$
是否有需要使用其中一种的特定情况?
谢谢。
在bash(Ubuntu的默认交互式shell)中,用单引号('
)引起的所有内容均按字面引用,直到下一个'
被用作结束引号。相反,在双引号("
)内执行了几种外壳扩展。
参数扩展(使用$...
或${...}
):
ek@Io:~$ echo '$HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}'
$HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}
ek@Io:~$ echo "$HOME ${USER^^*} ${SHELL%%+([[:alnum:]])}"
/home/ek EK /bin/
这是"
shell脚本中引号的常见用例。特别是,您可能已经看到循环遍历文件名,在双引号内扩展变量的循环,因此该变量确实得到了扩展,但没有将其值拆分为单独的单词。例如,这样的命令可能会帮助我在准备大量要移动的媒体文件时跟踪情况:
ek@Io:~$ for d in to\ *; do ls -ld "$d"; du -sh "$d"; done
drwxr-x--- 856 ek ek 32768 Mar 29 10:47 to Albums (partial)
308G to Albums (partial)
drwxrwxr-x 1191 ek ek 40960 Mar 11 12:56 to Books
21G to Books
命令替换(带有$(...)
或`...`
)和算术扩展(带有$((...))
):
ek@Io:~$ echo '$(date) `uname -r` $((2+2))'
$(date) `uname -r` $((2+2))
ek@Io:~$ echo "$(date) `uname -r` $((2+2))"
Sat Apr 4 20:42:37 EDT 2015 3.19.0-11-generic 4
\
支持使用转义单个字符,并且在"
引号中可以方便使用,但在较简单的'
引号中则不支持(通常是毫无意义的):
ek@Io:~$ echo '$HOME \$HOME \\\\'
$HOME \$HOME \\\\
ek@Io:~$ echo "$HOME \$HOME \\\\"
/home/ek $HOME \\
历史记录扩展使用!
(如果启用,通常是在交互式使用shell时使用):
ek@Io:~$ # this is just a comment (but I could run a command here)
ek@Io:~$ echo '!!'
!!
ek@Io:~$ # this is just another comment (but could be another command)
ek@Io:~$ echo "!!"
echo "# this is just another comment (but could be another command)"
# this is just another comment (but could be another command)
另外,使用双引号的最常见原因之一是轻松直观地引出包含单引号的文本(因为a'
根本没有特殊的含义,内"
引号):
ek@Io:~$ echo "We'll have the dog's fleas gone soon, you'll see."
We'll have the dog's fleas gone soon, you'll see.
最后,尽管您无法转义'
内部带'
引号的文本,但可以通过使用转义的()结束对的引用,并使用继续进行引用来达到相同的结果:'
'
\'
'
ek@Io:~$ echo '"My $PATH ain'\''t what it used to be," said the stevedore'\''s apprentice.'
"My $PATH ain't what it used to be," said the stevedore's apprentice.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句