shell 程序结构
一简单指令
command [-option] [parameter]
command 可以是 别名,函数名,内置命令,外部可执行程序或脚本
二shell控制结构复合语句
for name [ in word ] ;do list ; done
for (( expr1 ; expr2 ; expr3)) ; do list ; done
select name [ in word ] ;do list ; done
if list; then list; [ eliflist; then list; ] ... [ else list; ] fi
while list; do list; done
until list; do list; done
[ 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 特别注意 if expression 中的&& || 和 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分割