shell 程序结构

分类:shell编程 阅读:29566 次

一简单指令

command [-option] [parameter]

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

二shell控制结构复合语句

forname[inword];dolist;done

for((expr1;expr2;expr3));dolist;done

selectname[inword];dolist;done

iflist;thenlist;[eliflist;thenlist; ] ... [elselist; ]fi

whilelist;dolist;done

untillist;dolist;done

[function]name() {list; }

casewordin[ [(]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

返回真,如果表达式expression1expression2都返回真。

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.txtls.pdf my.pcap set.shtcp.dump tcpdump.pdf tcpdump.txttmp 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分割