一简单指令 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 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 特别注意 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) |