shell 变量内容展开的疑问

sh/bash/dash/ksh/zsh等Shell脚本
回复
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

shell 变量内容展开的疑问

#1

帖子 cao627 » 2012-04-11 20:58

为什么变量的内容为"a"时 执行 cp $file 错误
直接文件名加双引号 cp "a" 是能够执行的

实验如下:

代码: 全选

mkdir x
touch a
cp  "a"  ./x/   

file="a"
echo $file
a
cp $file ./x/

file="\"a\""
echo $file
"a"
cp $file ./x/  
最后一条命令执行错误
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: shell 变量内容展开的疑问

#2

帖子 aerofox » 2012-04-11 22:35

不错误才怪,不会扩展完了再解释引号。需要时可以加 eval

代码: 全选

eval cp $file ./x/  
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: shell 变量内容展开的疑问

#3

帖子 cao627 » 2012-04-12 13:42

不会扩展完了再解释引号
什么意思?
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45

Re: shell 变量内容展开的疑问

#4

帖子 fanhe » 2012-04-12 14:54

你只要都使用这种语法就没问题了 "$file",可以解决有空格的文件名
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: shell 变量内容展开的疑问

#5

帖子 aerofox » 2012-04-12 17:13

cao627 写了:
不会扩展完了再解释引号
什么意思?
这么说吧:
(1) 引号和 $ 的特殊含义由 shell 解释,cp 命令对这些符号不做特殊处理。
(2) shell 先处理引号,遇到双引号,内部 * 号和 ? 号失去了特殊含义,空格不作为参数分隔用,等等,但是保留 $ 的特殊含义。
(3) 变量扩展(即处理$)之后,不再处理因扩展产生的引号。
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: shell 变量内容展开的疑问

#6

帖子 cao627 » 2012-04-12 18:14

变量扩展(即处理$)之后,不再处理因扩展产生的引号。


只有这个结论可解释!

是否还可推广到:

shell 对变量扩展(即处理$)之后,不再处理(解释)扩展后的内容。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: shell 变量内容展开的疑问

#7

帖子 aerofox » 2012-04-12 18:36

cao627 写了:
shell 对变量扩展(即处理$)之后,不再处理(解释)扩展后的内容。
是的。
回复