分页: 1 / 1

SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-06 16:54
chirive
针对名字中带有空格的文件夹
想把如下路径/home/me/Ubuntu One,赋给变量work.
于是有:work="/home/me/Ubuntu\ One"
结果当 cd $work时,显示:bash: cd: /home/me/Ubuntu\ 没有那个文件或目录
改了一下:work=/home/me/Ubuntu\ One(即去掉了双引号)
结果当cd $work时,显示bash: cd: /home/me/Ubuntu 没有那个文件或目录.

为什么不行?

Re: SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-06 16:58
ljj_jjl2008
用了双引号,就不用转义了吧?

Re: SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-06 17:00
lexdene
解决办法:

代码: 全选

work="/home/me/Ubuntu One"
cd "$work"
需要原理吗?
原理涉及到bash的解释和运行规则,很复杂,想听吗?

Re: SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-06 18:18
chirive
lexdene 写了:解决办法:

代码: 全选

work="/home/me/Ubuntu One"
cd "$work"
需要原理吗?
原理涉及到bash的解释和运行规则,很复杂,想听吗?
想听,请讲!

Re: SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-07 8:44
lexdene
我晚上下班以后就不在线了。
刚刚看见。

简单说一下。
bash在执行一条命令的时候,会先对命令进程展开,最后再执行。
第一个:

代码: 全选

work="/home/me/Ubuntu\ One"
cd $work
那么首先,由于双引号的影响,反斜线"\"不发生转义,$work变量的内容就是"/home/me/Ubuntu\ One"。
然后第二句的时候$work变量进行展开,变成了:

代码: 全选

cd /home/me/Ubuntu\ One
cd命令只接收第一个参数。就变成了进入/home/me/Ubuntu\这个目录。然后第二个参数One被忽略。
之后提示,找不到/home/me/Ubuntu\目录。

第二个

代码: 全选

work=/home/me/Ubuntu\ One
cd $work
由于反斜线"\"转义,$work变量的内容是"/home/me/Ubuntu One"。
然后第二句的时候$work变量进行展开,变成了:

代码: 全选

cd /home/me/Ubuntu One
cd命令只接收第一个参数。就变成了进入/home/me/Ubuntu这个目录。然后第二个参数One被忽略。
之后提示,找不到/home/me/Ubuntu目录。

插入一句:以下两句等价:

代码: 全选

work=/home/me/Ubuntu\ One
work="/home/me/Ubuntu One"
造成的结果都是$work变量的内容是"/home/me/Ubuntu One"。

第三个

代码: 全选

work="/home/me/Ubuntu One"
cd "$work"
双引号只影响转义,不影响变量的展开,所以第二句会变成:

代码: 全选

cd "/home/me/Ubuntu One"
由于双引号的影响,"/home/me/Ubuntu One"会被当成一个参数传给cd命令。
所以能够执行成功。



再插一句,双引号、单引号的区别,我认为你能看懂:

代码: 全选

$ [email protected]
$ echo $a
[email protected]
$ b="$a"
$ echo $b
[email protected]
$ c='$a'
$ echo $c
$a
我的能力就到此为止了,再多的我也不知道了。
如果你想深入了解bash的展开规则,可以上百度、google搜索一下。
这里给个链接,希望对你有帮助。
http://hi.baidu.com/biglazybug/blog/ite ... 9d769.html

Re: SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-07 8:48
link_01
很多环境,单引号不替换变量。

Re: SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-08 8:12
chirive
lexdene 写了:我晚上下班以后就不在线了。
刚刚看见。

简单说一下。
bash在执行一条命令的时候,会先对命令进程展开,最后再执行。
第一个:

代码: 全选

work="/home/me/Ubuntu\ One"
cd $work
那么首先,由于双引号的影响,反斜线"\"不发生转义,$work变量的内容就是"/home/me/Ubuntu\ One"。
然后第二句的时候$work变量进行展开,变成了:

代码: 全选

cd /home/me/Ubuntu\ One
cd命令只接收第一个参数。就变成了进入/home/me/Ubuntu\这个目录。然后第二个参数One被忽略。
之后提示,找不到/home/me/Ubuntu\目录......
学习了,谢谢!

Re: SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-08 8:19
chirive
link_01 写了:很多环境,单引号不替换变量。
那么,什么环境下单引号会替换变量?

Re: SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-08 9:06
eexpress
哪里说得出那么多。很简单的规则而已。
搞传销的吧。

Re: SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-08 9:32
tenzu
:em05

Re: SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-08 9:56
chrwhy
5楼正解, 还有详细的解释

Re: SHELL赋值给变量时名字中带有空格的文件夹中的空格无法用转义符吗

发表于 : 2011-09-08 9:58
link_01
其实我的意思是有的地方也许会把单引号当作字符串的一部分,
关于单引号双引号是否转义,基本上已经是很通用的原则了,不知道这个词用的恰当不。