[root@fire cgi-bin]# export TEST="Hello > Wolrd > From > Linux" [root@fire cgi-bin]# echo $TEST Hello Wolrd From Linux [root@fire cgi-bin]# echo "$TEST" Hello Wolrd From Linux [root@fire cgi-bin]# echo '$TEST' $TEST
上面是测试,一直以来对hard quote(单引号)和soft quote(双引号),弄得不是很懂,今早又碰到这个问题。
下面来解释上面的测试代码:
首先从根本出发,shell的任务的就是解释用户的输入,将一大堆的字符串做处理。处理成
command_programoptions arguments
这样的格式,说白了就是把一个整的字符串分割成一个一个的字段("word"),那么shell是通过什么分割的呢?通过把<space>,<enter>,<tabs>这三种作为分隔符,拆分成字段。而shell是通过最后用户输入一个<enter>键来标明用户输入的结束,一旦处理到<enter>键,shell就得到了通知:用户已经输入完成了,我可以执行命令去了。之后shell根据默认的IFS处理,进行变量的替换之类的工作,最后提交给程序执行。
看上面的第一个命令
[root@fire cgi-bin]# export TEST="Hello > Wolrd > From > Linux"
因为soft quote能屏蔽<enter>,<enter>键所产生的CR字符不会被shell当作结束符,所以shell继续等待用户的输入,等到用户输入后面的双引号,再输入<enter>键,这时候shell读到了CR字符,就知道用户输入的结束了,于是就开始执行命令。这个时候TEST里面的内容其实是:
Hello<CR>World<CR>From<CR>Linux
注意“Linux”后面是没有<CR>的,之所以会有换行,是因为echo执行结束后会自动送入一个<CR>!
再看第二条命令:
echo $TEST
这时候没有hard quote或者soft quote,shell得到的命令变成
echoHello<CR>World<CR>From<CR>Linux
现在再去看shell的执行过程,shell就是“把一个整的字符串拆分成字段,字段分割的标识是<space>,<enter>,<tabs>,然后根据默认的IFS处理”,shell读到<CR>,通通都按照默认的IFS(空格)处理。所以处理的结果就可想而知了:所有的<CR>变成了<space>。最后得到的最终命令,按照
command_program options arguments
command_program 就是 echo ,options 是无 ,arguments 就是 Hello World From Linux
再来看第三条命令
echo "$TEST"
这个存在soft quote,shell得到命令就是
echo "Hello<CR>World<CR>From<CR>Linux"
这里shell不能处理什么,soft quote里面就是一个参数,最终的命令是
command_program 就是 echo ,options 是无 ,arguments 就是 Hello<CR>World<CR>From<CR>Linux
最后看第四条命令
echo '$TEST'
这个最简单, TEST变量在hard quote里面,所有的meta都被屏蔽了,所以按照最终的命令就是
command_program 就是 echo ,options 是无 ,arguments 就是$TEST