当前位置: > shell编程 >

shell 程序结构

时间:2014-04-29 00:09来源:linux.it.net.cn 作者:IT网

简单指令

command  [-option] [parameter]

 

command 可以是 别名,函数名,内置命令,外部可执行程序或脚本

 

shell控制结构复合语句

for name [ in word ] ;dolist ; done

for (( expr1 ; expr2 ; expr3)) ;do list ; done

select name [ in word ] ;dolist ; done

 

if listthen list; [eliflistthen list; ] ... [ else list; ] fi

 

 

while listdo list;done

until listdo listdone

 

function ] name() { list; }

case word in [ [(] pattern [| pattern ] ... ) list ;; ] ... esac

 

 

1.      [ ] 表示可选项

2.      ; 可以使用<newline>行号代替,用来分割token (命令序列)

 

 

Ø  上述符合语句中的:

if ; then ;elif ;else ;fi

for in ;do; done

while ;do ;done

until ;do ;done

case in; esac 

上述词前必须有;或者<newline>开头

 

三.CompoundCommands复合命令

compound command(复合命令)是如下情况之一:

(list)

list 序列将在一个子 shell 中执行。变量赋值和影响 shell 环境变量的内建命令在命令结束后不会再起作用。 返回值是序列的返回值。

list; }

list 序列将在当前 shell 环境中执行。序列必须以一个新行符或分号结束。这种做法也称为 group command(命令组)。返回值是序列的返回值。注意与元字符( 和 ) 不同,{ 和 } 是reserved words(保留字),必须出现在能够识别保留字的场合。 由于它们不会产生断词(cause a word break),它们和序列之间必须用空格分开。

((expression))

表达式 expression 将被求值。求值规则在下面的 算术求值(ARITHMETICEVALUATION)章节中描述。如果表达式的值非零,返回值就是 0;否则返回值是 1。这种做法和let "expression" 等价。

[[ expression ]]

返回 0 或 1,取决于条件表达式 expression 求值的情况。 表达式是由下面 CONDITIONALEXPRESSIONS条件表达式 章节中描述的原语(primaries) 组成。[[ 和 ]] 中的词不会进行词的拆分和路径的扩展处理; 而tilde 扩展,参数和变量扩展,算术扩展,命令替换,函数替换和引用的去除则都将进行。

当使用 == 和 != 操作符时,操作符右边的字符串被认为是一个模式,根据下面PatternMatching(模式匹配) 章节中的规则进行匹配。如果匹配则返回值是 0,否则返回 1。模式的任何部分可以被引用,强制使它作为一个字符串而被匹配。

-------------------------

if 表达式特征:

表达式可以用下列操作符结合起来。根据优先级的降序列出如下:

expression )

返回表达式 expression 的值。括号可以用来提升操作符的优先级。

expression

返回真,如果表达式expression 返回假。

expression1 && expression2

返回真,如果表达式expression1 和 expression2 都返回真。

expression1 || expression2 返回真,如果表达式expression1 或者expression2 二者之一返回真。

&&(与) 和 || 操作符不会对表达式 expression2 求值,如果expression1 可以决定整个条件表达式的返回值的话。

Lists 序列

list(序列)是一个或多个管道,用操作符 ;&,&&, 或|| 分隔的序列, 并且可以选择用 ;&,或 <newline>新行符结束.

这些序列操作符中,&& 和 || 优先级相同,其次是 ; 和 &, 它们的优先级是相同的。

序列中可以有一个或多个新行符来分隔命令,而不是使用分号分隔。

如果一个命令是由控制操作符& 结束的, shell 将在后台的子 shell 中执行这个命令。 shell 不会等待命令执行结束,返回状态总是 0。以分号; 分隔的命令会被顺序执行;shell会等待每个命令依次结束。返回状态是最后执行的命令的返回状态。

控制操作符 && 和 || 分别代表 AND 和 OR 序列。一个 AND 序列的形式是

command1 && command2

command2 只有在 command1 返回 0 时才被执行。

一个 OR 序列的形式是

command1 || command2

command2 只有在 command1 返回非 0 状态时才被执行。AND 和 OR 序列的返回状态是序列中最后执行的命令的返回状态。

n  特别注意 ifexpression 中的&& || 和 Bash Lists 序列中的 && || 含义是不一样的

 

---------------------------------

n  几个模糊概念的确定

Ø  !  &&  ||可以使用到表达式连接中用于 if 等条件判断

Ø  -o –a用在 [ ] 表达式中, && || 既可以用于 [[ ]]内部,也可以用于连接两个[ ]

if [ ] && [ ]  或 if [ ] || [ ]

---------------------------------------

if ["$an" = Y -o "$an" = y ]

=if ["$an" = Y ] || [ "$an" = y ]

=if [["$an" = Y || "$an" = y ]]

如上三个等价,如下三个等价

-------------------------------------

if ["$an" = Y -a "$an" = y ]

 =if [ "$an" = Y ] && ["$an" = y ]

=if [[ "$an" = Y &&"$an" = y ]]

实例如下:

if [ !"${PEERNIS}" = "no" ]; then

if [ "test" =="test" ] ;then echo "ok"; fi

if  [ "test" == "test" ] ;then echo"ok"; fi

if [ -x /etc/rc.d/init.d/ypbind ]&& [ -r /var/run/ypbind.pid ]; then

         service ypbind restart >/dev/null2>&1

fi

[root@localhost ~]# if [ !"test" == "tet" -a "hi" == "hi" ] ;thenecho "ok" ; fi

ok

[root@localhost ~]# if [ ! "test"== "test" -o "hi" == "hi" ] ;then echo"ok" ; fi

ok

[root@localhost ~]# if [ !"test" == "test" -a "hi" == "hi" ];then echo "ok" ; fi

[root@localhost ~]# if [ !"test" == "tes" -a "hi" == "hi" ] ;thenecho "ok" ; fi

ok

[root@localhost ~]# if [ ! "test"== "tes" ] && [ "hi" == "hi" ] ;then echo"ok" ; fi

ok

[root@localhost ~]# if [ !"test" == "test" ] && [ "hi" =="hi" ] ;then echo "ok" ; fi

[root@localhost ~]# if [ !"test" == "test" ] || [ "hi" == "hi" ];then echo "ok" ; fi

ok

[root@localhost ~]# if ! ["test" == "test" ] && [ "hi" =="hi" ] ;then echo "ok";fi

[root@localhost ~]# if ! ["tst" == "test" ] && [ "hi" =="hi" ] ;then echo "ok";fi

ok

[root@localhost ~]# if [["tst" == "test" && "hi" == "hi" ]] ;then echo"ok";fi

[root@localhost ~]# if [["test" == "test" && "hi" == "hi" ]] ;then echo"ok";fi

ok

[root@localhost ~]# if [["est" == "test"  ||"hi" == "hi" ]] ;then echo "ok";fi

ok

Ø if 语句的换种写法:

if [ condition ] ;then comand  ;fi   =  [ condition ] && comd

if [ ! condition ] ;then comand  ;fi = ! [ condition ] && comd

 

Ø if 条件中的重定向,避免标准输出产生

if /sbin/lvm vgscan >/dev/null 2>&1 ; then

action $"Setting up Logical Volume Management:" /sbin/lvmvgchange -a y

fi

[root@localhost ~]# if ls ;then echo"ok"; fi

his.txt ls.pdf  my.pcap  set.sh tcp.dump  tcpdump.pdf  tcpdump.txt tmp  t.pcap  t.sh

ok

[root@localhost ~]# if ls >/dev/null2>&1 ;then echo "ok"; fi

ok

 

Ø  可用于分割命令序列token分隔符如下:

control operator

              A token that performs a controlfunction.  It is one of the followingsymbols:

            ||   &  &&  ;  ;;  ( )  |  |&  <newline>

同理一个完整的指令,不论是符合语句语句,还是可执行程序或脚本,内置命令必须以行首开头或者由上面的control operator分割

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容