现在的位置: 首页 > 综合 > 正文

shell(1) 结构化命令——流程控制

2012年05月02日 ⁄ 综合 ⁄ 共 2350字 ⁄ 字号 评论关闭



结构化命令——流程控制,

注意:“命令”,非“关键字”

条件判断—
if

1

)简单
if

if
command                 



command

返回成功——即退出状态为
0

时为真

then

      
commands

fi

等价于:

if
command; then         
#;


只是用于将
then

放到同一行

      
commands

fi

2

)完整格式的
if

if
command; then

      
...

elif
command; then

      
...

else

      
...

fi

条件判断—
case

case
$variable in

      
patten1|patten2) 
command1s;;  
#


使用
|

表多个可能,使用
)

      
patten3) command2s;;                
#commands


最后的语句需使用
;;

      
*) default commands;;                
#*)


表示
default

esac

循环—
for

1)



简单
for

for
var in list; do  
#


此处定义了变量
var

,所以不要使用
$

      
...

done

 

eg:

for
test in 12s 2 3 4aa          
#test


不使用
$


12s

等不使用引号!引号用于将引起来的内容作为一个整体

do

  
echo $test

done

2)



带有引号时

for
test in "12's" 2 3 4aa      


#用双引号将单引号括起来,反过来也可以吧(
TBD

do

  
echo $test

done

3)



带有空格时

for
test in "12 s" 2 3 4aa     


#同样使用引号

do

  
echo $test

done

4)



使用变量列表

list="12
2 3 4aa"         
TBD


:怎样引用某个列表元素?

for
test in $list

do

  
echo $test

done

 


TBD

:列表中有空格怎么表示?没找到办法,改下
IFS

吧。

 

列表中增加元素

list=$list"
abc"            


#使用引号并且要有空格

5)



BASH

用作分隔符的字符列表

$IFS


internal field seperator
,默认为空格、
tab
、换行,将影响
for
的处理——
TBD
影响
gawk
的是否也是它?

IFS


$'/n'     


#更改
IFS

 

list="12:2:3:4aa
bb"

IFS=$':
'       


#以
:

及空格作为
IFS

for
test in $list

do

  
echo $test

done

6)



遍历文件

for
file in /home/test/*.log /home/aaa/ 


#可指定多个文件夹

eg:

for
test in /home/xgdxiao/* /home/noth/*

#必须使用通配符,不能简单地写个目录名,可同时指定多个目录

do

  
if [ -f $test ]; then         


#必须对文件进行测试,否则可能输出“
/home/noth/*

      
echo $test

  
elif [ -e $test ]; then

      
echo -n

 
 
else

      
echo $test is nth

  
fi

done

7)



c

式的
for

for((a
= 1; a <10; a++)); do      
      
#


格式比较自由,变量引用无须
$

,可使用空格,无须转义

   
echo $a

done

 

for((a=1,
b=2; a<=1 && b> 0; a++,b--)); do  


#多个变量

   
echo $a $b

done

循环—
while

1

)简单形式:

while
test command; do        
#test command


含义同
if

语句

      
...

done

 

eg:

i=2

while
[ $i -gt 0 ]; do

   
echo $i

   
i=$[$i -1 ]

done

 

2

)多个条件,只有最后一个用于判断:

i=2

while
echo $i; [ $i -gt 0 ]; do

   
i=$[$i -1 ]

done

循环—
until

1

)一般形式

until
test commands; do

      
...

done

 

2

)多个条件式,处理方式同
while

i=2

until
echo $i; [ $i -gt 0 ]; do
#


多条命令的处理与
while

类似

   
echo $i;

   
i=$[$i -1 ]

done

循环—例子

#!/bin/bash

#IFS.OLD=$IFS

IFS=$'/n'       
#


控制下面
for

for
sth in `cat /etc/passwd|grep root`; do

   
echo $sth

   
IFS=:           


#控制下面的
for

   
for ath in $sth; do

      
echo $ath

   
done

   
IFS=/n          


#需要还原
IFS

done

循环—
break/continue

break n 


#跳出
n
层循环,
n
默认为
1

continue n 


#要继续的循环级别

 

while
[ 1 ] ; do            
#TBD:


是否可写成
while 0 ; do

   
for((i=0; i<2; ++i)); do

      
echo $i

      
if [ $i -eq 1 ]; then

      
   

break 2

      
fi

   
done

done

循环—输出重定向或管道

循环里的输出重定向或管道

for((i=0;
i<2; ++i)); do

   
echo $i

   
if [ $i -eq 1 ]; then   

      
break 2   


#超出总层次也没关系

   
fi

done
> a.txt   


#直接在循环后加重定向,
TBD

,错误输出是否写为
2>a.txt

 

for((i=0;
i<200; ++i)); do

   
echo $i

done
|more            


#管道

【上篇】
【下篇】

抱歉!评论已关闭.