关于for 的问题。

关于for 的问题。

#cat capfile
  for file
  do
    cap=`echo $file | tr a-z A-Z`
    echo $cap
   done
#./capfile  *     
//作用把当前目录下的所有文件大写显示

我看不理解,这个时候,$file不是等于*么?

for  ((i=0;i<10;i=i+1))表达式中,为什么i=i+1和i < 10表达式可以
为什么不用i=`expr $i + 1`和$i -lt 10      
1. shell 会把 * 展开成当前目录中所有文件的列表
2. for (( ... )) 循环的语法就是这样的, 用 expr 之类岂不麻烦?
3. 看似楼主对 shell 基本语法还不是很熟悉, 建议先找些入门的文档看看       
在字符串中,i="hello",i=hello,都可以,什么时候需要加“”呢?      
FYI:
引用:
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[21643 0] ; v=hello
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[21643 0] ; v=hello world
bash: world: command not found
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[21643 127] ; v="hello world"
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[21643 0] ; bye
看似您对 shell 基本语法还不是很熟悉, 建议先找些入门的文档看看       
想起有人曾说要尽量用单引号而不是双引号
理由是用双引号时shell会尝试变量替换(expan)
从而速度要稍微慢上一点点。。。      
单纯的小脚本里面不需要关注这点
在php里面,一条使用了双引号的语句循环10000次才慢0.0001~0.0005秒左右(不知道bash里面是怎么样的

      
引用:
原帖由 li-jiahuan 于 2007-8-22 01:19 发表
想起有人曾说要尽量用单引号而不是双引号
理由是用双引号时shell会尝试变量替换(expan)
从而速度要稍微慢上一点点。。。
有道理, 简单测试了一下, 效果不是很明显, 一般不用太在意的
引用:
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[21637 0] ; cat foo.sh
#!/bin/bash

N=20000
time { for ((i = 0; i < N; ++i)); do echo '0123456789' > /dev/null; done; }
time { for ((i = 0; i < N; ++i)); do echo "0123456789" > /dev/null; done; }
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[21637 0] ; ./foo.sh

real    0m2.223s
user    0m1.484s
sys     0m0.740s

real    0m2.339s
user    0m1.760s
sys     0m0.580s
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[21637 0] ; ./foo.sh

real    0m2.226s
user    0m1.592s
sys     0m0.620s

real    0m2.300s
user    0m1.732s
sys     0m0.568s
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[21637 0] ; ./foo.sh

real    0m2.138s
user    0m1.628s
sys     0m0.508s

real    0m2.718s
user    0m1.744s
sys     0m0.524s
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
[21637 0] ; bye
      
只是顺便提醒一下两者奥妙的差别