分页: 1 / 1

shell 变量内容展开的疑问

发表于 : 2012-04-11 20:58
cao627
为什么变量的内容为"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/  
最后一条命令执行错误

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

发表于 : 2012-04-11 22:35
aerofox
不错误才怪,不会扩展完了再解释引号。需要时可以加 eval

代码: 全选

eval cp $file ./x/  

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

发表于 : 2012-04-12 13:42
cao627
不会扩展完了再解释引号
什么意思?

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

发表于 : 2012-04-12 14:54
fanhe
你只要都使用这种语法就没问题了 "$file",可以解决有空格的文件名

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

发表于 : 2012-04-12 17:13
aerofox
cao627 写了:
不会扩展完了再解释引号
什么意思?
这么说吧:
(1) 引号和 $ 的特殊含义由 shell 解释,cp 命令对这些符号不做特殊处理。
(2) shell 先处理引号,遇到双引号,内部 * 号和 ? 号失去了特殊含义,空格不作为参数分隔用,等等,但是保留 $ 的特殊含义。
(3) 变量扩展(即处理$)之后,不再处理因扩展产生的引号。

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

发表于 : 2012-04-12 18:14
cao627
变量扩展(即处理$)之后,不再处理因扩展产生的引号。


只有这个结论可解释!

是否还可推广到:

shell 对变量扩展(即处理$)之后,不再处理(解释)扩展后的内容。

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

发表于 : 2012-04-12 18:36
aerofox
cao627 写了:
shell 对变量扩展(即处理$)之后,不再处理(解释)扩展后的内容。
是的。