LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1466|回复: 4

关于shell 十三问中的 一个问题

[复制链接]
发表于 2009-6-25 22:07:46 | 显示全部楼层 |阅读模式
问题1:
$ A=B C # 空格键未被关掉,作为 IFS 处理。
$ C: command not found.
$ echo $A

为什么输出为空 虽然c没有被发现 但是也应该输出B才对的
是不是说 因为在输入C后 敲回车 编译器发现命令的格式不对 所以就没编译


问题2
root@recoverserver # A='B ----单引号
root@recoverserver > C
root@recoverserver > '
root@recoverserver # echo $A ----不加引号
B C
root@recoverserver # echo "$A" -----双引号
B
C

root@recoverserver #
为什么在输出的时候加引号和不加引号 会有这种差别
root@recoverserver # A="B
root@recoverserver > C
root@recoverserver > "
root@recoverserver # echo $A
B C
root@recoverserver # echo "$A"
B
C

一个高人给的解释是这样子的
A=B C ;A将作为C的环境变量,而不是本shell的变量
不知道该怎么理解? 那位大哥 大姐 给否给讲解的稍微通俗些

我们知道 不加引号 linefeed是IFS的默认三个分词符号之一,此时你可以把它看成空格。
可是为什么 提示C命令未发现   echo $A也为空
 楼主| 发表于 2009-6-26 09:57:15 | 显示全部楼层
看的人多 没人回答  让人郁闷
回复 支持 反对

使用道具 举报

发表于 2009-7-8 12:50:11 | 显示全部楼层
我是这么理解的不知道对不对
对于第一个问题:执行命令的优先级比赋值变量高,而当命令被执行,赋值就默认被忽略,不管命令正确与否
对于第二个问题:应该是bash对引号的定义,当echo $A 的时候,A的值实际上是“B C”;当echo “$A” 的时候,这里实际上引号已经把B和C之间的空格,回复它的原意,即为换行
回复 支持 反对

使用道具 举报

发表于 2009-7-8 18:37:13 | 显示全部楼层
灵异!我记得这张帖子很久以前就在sir出现并且也解答过了...难道仅仅是我的Deja Vu?
LS对第二个问题的解释没什么大问题;而对第一个问题的解释是错的。尝试反例:
  1. A=B true; echo $A
复制代码

LZ认为
  1. A=B C
复制代码
等于
  1. A=B; C
复制代码
但实际上它(效果上)等于
  1. export A=B; C; unset A
复制代码
另外shell应该是纯解释的语言,没听说过哪个POSIX shell会把脚本编译成bytecode或native code再执行... =.=
回复 支持 反对

使用道具 举报

发表于 2009-7-8 18:45:10 | 显示全部楼层
另外LZ对bash根据IFS进行分词的理解是错的。
我这边的Debian testing中的bash版本是
  1. $ [b]bash --version[/b]
  2. bash --version
  3. GNU bash, version 3.2.48(1)-release (i486-pc-linux-gnu)
  4. Copyright (C) 2007 Free Software Foundation, Inc.
复制代码

bash(1)中这么对IFS这么解释:
  1.        IFS    The Internal Field Separator that is  used  for  [color="Red"]word  splitting
  2.               after  expansion[/color]  and  [color="Red"]to  split  lines into words with the read
  3.               builtin  command[/color].   The  default  value  is  ``<space><tab><new-
  4.               line>''.
复制代码

注意红色字:IFS对命令行扩展前的分词没有影响。(证明:尽管手册中没这么说,但若是都有影响,手册作者不会写上“after  expansion”,所以在扩展之前IFS并不造成影响。证明完毕。)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表