分页: 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
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 对变量扩展(即处理$)之后,不再处理(解释)扩展后的内容。
是的。