在编写shell脚本的过程中,经常遇见空格以及双引号相关的问题,下边详细介绍一下相关的知识。
从shell命令的执行过程说起,执行shell命令的本质其实就是执行一系列系统调用,简单来说就是在执行execve(2)系统调用时将跟命令语句相关的三部分信息传递给它:
1、The file to execute: This can be a binary program or a script.
2、An array of arguments: A list of strings that tell the program what to do.
3、An array of environment variables
下边举个例子:rm myfile myotherfile 执行这条语句的过程中shell解释器首先做的工作是分解命令语句:
rm myfile myotherfile
^ ^
[rm]
[myfile]
[myotherfile]
如何分解得到以上三部分,这就是Word Splitting,说到Word Splitting就必须首先讲解一下IFS(Internal Field Separator)IFS定义:which is used to determine what characters to use as word splitting delimiters,在默认情况下,IFS包括:space, tab, newline 即:($' \t\n'),上边例子中用到的就是空格space,当然,IFS也可以自己重新设置,不过不建议这么做,很容易带来更多麻烦。
根据上边的讲述,貌似很简单,但是,简单也蕴藏着一些很容易出错的点,下面再来一个例子:
rm Children of Men - Chapter 1.pdf
^ ^ ^ ^ ^
[rm]
[Children]
[of]
[Men]
[-]
[Chapter]
[1.pdf]
我们原本想要干的事是要删除Children of Men - Chapter 1.pdf这个文件,但是shell解析后变成了删很多个被错误分解的文件名,这时双引号就派上用场了,也即:Quoting rm "Children of Men - Chapter 1.pdf" 加上双引号能够屏蔽空格作为IFS功能,英文原版这样说:Changing something from syntax into literal data,那Double quoting又是什么呢?再上一个例子:
var="Children of Men - Chapter 1.pdf"
rm $var
[rm]
[Children]
[of]
[Men]
[-]
[Chapter]
[1.pdf]
如上又会出现之前的错误,这时我们将rm $var改成rm "$var",重新试一下结果将会是正确的,这就是Double quoting
参考文献:
1、http://bash.cumulonim.biz/Arguments.html
2、http://bash.cumulonim.biz/WordSplitting.html
3、http://bash.cumulonim.biz/Quotes.html
从shell命令的执行过程说起,执行shell命令的本质其实就是执行一系列系统调用,简单来说就是在执行execve(2)系统调用时将跟命令语句相关的三部分信息传递给它:
1、The file to execute: This can be a binary program or a script.
2、An array of arguments: A list of strings that tell the program what to do.
3、An array of environment variables
下边举个例子:rm myfile myotherfile 执行这条语句的过程中shell解释器首先做的工作是分解命令语句:
rm myfile myotherfile
^ ^
[rm]
[myfile]
[myotherfile]
如何分解得到以上三部分,这就是Word Splitting,说到Word Splitting就必须首先讲解一下IFS(Internal Field Separator)IFS定义:which is used to determine what characters to use as word splitting delimiters,在默认情况下,IFS包括:space, tab, newline 即:($' \t\n'),上边例子中用到的就是空格space,当然,IFS也可以自己重新设置,不过不建议这么做,很容易带来更多麻烦。
根据上边的讲述,貌似很简单,但是,简单也蕴藏着一些很容易出错的点,下面再来一个例子:
rm Children of Men - Chapter 1.pdf
^ ^ ^ ^ ^
[rm]
[Children]
[of]
[Men]
[-]
[Chapter]
[1.pdf]
我们原本想要干的事是要删除Children of Men - Chapter 1.pdf这个文件,但是shell解析后变成了删很多个被错误分解的文件名,这时双引号就派上用场了,也即:Quoting rm "Children of Men - Chapter 1.pdf" 加上双引号能够屏蔽空格作为IFS功能,英文原版这样说:Changing something from syntax into literal data,那Double quoting又是什么呢?再上一个例子:
var="Children of Men - Chapter 1.pdf"
rm $var
[rm]
[Children]
[of]
[Men]
[-]
[Chapter]
[1.pdf]
如上又会出现之前的错误,这时我们将rm $var改成rm "$var",重新试一下结果将会是正确的,这就是Double quoting
参考文献:
1、http://bash.cumulonim.biz/Arguments.html
2、http://bash.cumulonim.biz/WordSplitting.html
3、http://bash.cumulonim.biz/Quotes.html