案例,如果我想输出一个星号(),使用 echo 如何做?
echo
这是肯定不行的,需要将转移,即:echo *
这样就引出了引用的概念.所为引用,是用来防止 shell 将某些你想要的东西解释成不同的意义.如果你希望某些可能被 shell 视为个别参数的东西保持为单个参数,这时你就必须将其引用.
引用的三种方式:
反斜杠转义
字符前置反斜杠(),用来告知 shell 该字符即为其字面上的意义.
单引号
单引号(‘...’)强制 shell 将一对引号之间的所有字符都看做其字面上的意义.shell 脚本会删除这两个引号,只单独留下被括起来的完整文字内容:
命令:```echo 'here are some character ? $ \'``` 输出:```here are some character * ?
$ ```
不能再一个单引号引用的字符串里再内嵌一个单引号.即使是反斜杠,在单引号里也没有特殊意义(某些系统里,像 echo ‘A\tB’这样的命令看起来像是 shell 特别的处理反斜杠,其实不然,这是 echo 命令本身有特殊的处理方式)
如需混用单引号和双引号,可以小心的使用反斜杠转义以及不同引用字符串的连接来做到:
命令:echo 'he said "how'\''s tricks?"'
输出:he said "how's tricks?"
命令”echo "she replied ,\"movin' along\""
输出:she replied ,"movin' along"
不管怎么处理,这种结合方式永远是很难阅读的.
双引号
双引号(“...”)就像单引号那样,将括起来的文字视为单一字符串.只不过,双引号会确切的处理括起来文字中的转义字符和变量,算术,命令替换:
x=hahaha
echo “$x”
输出:hahaha
在双引号里,字符$,”,`与\,如需用到字面上的意义,都必须前置.任何其他字符前面的反斜杠是不带特殊意义的.序列-newline 会完全的被删除,就好像是用在脚本里的正文中一样.
单引号被括在双引号里时就无特殊意义了,他们不必承兑,也不许转移.
命令:echo "hahah'"
输出:hahah'
一般来说,使用单引号的时机是希望完全不处理的地方.否则,当希望将多个单词视为单一字符串,但又需要 shell 为你做些事情,此时使用双引号,例如将一个变量值与另一个变量值连在一起:
oldvar=”$oldvar $newvar”