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

新手涉及到的教学或入门贴,推荐新手必看,版主维护
回复
chirive
帖子: 4
注册时间: 2011-06-30 10:32

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

#1

帖子 chirive » 2011-09-06 16:54

针对名字中带有空格的文件夹
想把如下路径/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 没有那个文件或目录.

为什么不行?
头像
lexdene
帖子: 434
注册时间: 2010-02-21 16:19
来自: 大连
联系:

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

#3

帖子 lexdene » 2011-09-06 17:00

解决办法:

代码: 全选

work="/home/me/Ubuntu One"
cd "$work"
需要原理吗?
原理涉及到bash的解释和运行规则,很复杂,想听吗?
chirive
帖子: 4
注册时间: 2011-06-30 10:32

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

#4

帖子 chirive » 2011-09-06 18:18

lexdene 写了:解决办法:

代码: 全选

work="/home/me/Ubuntu One"
cd "$work"
需要原理吗?
原理涉及到bash的解释和运行规则,很复杂,想听吗?
想听,请讲!
头像
lexdene
帖子: 434
注册时间: 2010-02-21 16:19
来自: 大连
联系:

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

#5

帖子 lexdene » 2011-09-07 8:44

我晚上下班以后就不在线了。
刚刚看见。

简单说一下。
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
头像
link_01
帖子: 1024
注册时间: 2008-11-05 13:24

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

#6

帖子 link_01 » 2011-09-07 8:48

很多环境,单引号不替换变量。
笔记
-------------------------------------
http://blog.163.com/wqt_1101
chirive
帖子: 4
注册时间: 2011-06-30 10:32

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

#7

帖子 chirive » 2011-09-08 8:12

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\目录......
学习了,谢谢!
chirive
帖子: 4
注册时间: 2011-06-30 10:32

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

#8

帖子 chirive » 2011-09-08 8:19

link_01 写了:很多环境,单引号不替换变量。
那么,什么环境下单引号会替换变量?
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

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

#9

帖子 eexpress » 2011-09-08 9:06

哪里说得出那么多。很简单的规则而已。
搞传销的吧。
● 鸣学
chrwhy
帖子: 233
注册时间: 2007-11-17 19:51

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

#11

帖子 chrwhy » 2011-09-08 9:56

5楼正解, 还有详细的解释
人之初, 性本善
不作恶, 共分享
头像
link_01
帖子: 1024
注册时间: 2008-11-05 13:24

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

#12

帖子 link_01 » 2011-09-08 9:58

其实我的意思是有的地方也许会把单引号当作字符串的一部分,
关于单引号双引号是否转义,基本上已经是很通用的原则了,不知道这个词用的恰当不。
笔记
-------------------------------------
http://blog.163.com/wqt_1101
回复