shell 程序结构,shell结构变量赋值和影响 sh
shell 程序结构,shell结构变量赋值和影响 sh
一简单指令
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
返回真,如果表达式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.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分割
评论暂时关闭