shell脚本学习笔记之常见语法结构用法




一,变量

   1.变量赋值和替换

     语法:variable=value

           variable=“value1 value2”


      echo  $variable/$"{variable}"   屏幕上显示赋值

      echo  $"{variable+b}"  将已经赋值的变量重新设值,临时生效

      echo  $"{variable:=value} 屏幕上显示value(前提是value没有被赋值)

      echo  $"{variable:-value} 屏幕上显示value(value未被赋值,value临时赋值)

      echo  $"{variable?}"  用于查看变量是否被赋值,赋值是什么


设置只读变量(查看所有的只读变量用readonly即可)

   variable=value

   readonly=value   任何用户不允许对变量variable重新设置变量或unset变量

   declare/typeset


    2.无类型shell变量

 *****shell不需要声明变量类型,通过上下语句来自动识别,只支持整型和字符型

默认为字符型,如果没有给变量赋值而带入到语句中,会根据上下文自动给变量赋值,默认为空(字符),如果上下文分析出为一个算法,


则将变量赋值为0

   

     3.环境变量

   3.1定义和清除变量

       定义环境变量的基本格式

        ENVIRON-VARIABLE=value

       声明环境变量

        export  ENVIRON-VARIABLE




        例子:

[root@node1 ~]# export APP

[root@node1 ~]# echo "APP"

[root@node1 ~]# echo "$APP"

/usr/local

       

查看所有的环境变量 env

unset清除环境变量




3.2 重要环境变量


PWD/OLDPWD


在PATH中添加新目录

export PATH="/new directory":$PATH


HOME

echo $HOME  显示当前用户的家目录


SHELL 


USER和UID   当前用户


PPID   进程号


PS1和PS2  



IFS 指定域分隔符


3.环境变量配置文件

     .bash_profile   作用于用户登录后启动的shell(可以执行配置文件中登录后的命令)

     .bashrc         作用于子shell(子shell中使用的命令,)

     .bash_logout    作用于注销时执行配置文件中的命令


父进程 子进程

环境变量和本地变量的异同点

环境变量的父shell可以向子shell传递

本地变量的父shell 不能传递

而环境变量和本地变量的子shell都不能向父shell进程传递


_____________________________________________________________________

[root@node1 scripts]# cat father.sh                                  

#!/bin/bash                                                          |  

#输出父进程号    

echo "Father Process ID is $$"                                       

                                                                     |

#定义本地变量并输出                                                  |

localvar="Define a local variable."                                  

echo "localvar=$localvar"                                            |

                                                                     

#定义环境变量并输出                                                  

ENVVAR="Define a environment variable."                              

export ENVVAR                                                        

echo "ENVVAR=$ENVVAR"                                                

                                                                     

#调用child.sh脚本,即创建子进程                                      

$PWD/child.sh                                                        

                                                                     

#child.sh执行完毕,输出相关变量值                                    

echo "Return to father process: $$"                                  

echo "localvar=$localvar"                                            

echo "ENVVAR=$ENVVAR"                                                

                                                                     

                                                                     

[root@node1 scripts]# cat child.sh                                    

#child.sh:该脚本输出自身进程号及父进程号、重新定义本地变量和环境变量 

#!/bin/bash                                                          

                                                                      

#输出自身进程号及父进程号                                            

echo "Chile Process ID is $$"                                        

echo "My Father Process ID is $PPID"                                 

                                                                     

#输出本地变量和环境变量的当前值                                      

echo "localvar=$localvar"                                            

echo "ENVVAR=$ENVVAR"                                                

                                                                     

                                                                     

#重新定义本地变量和环境变量                                             

localvar="Redefine this ocal variable."                              

ENVVAR="Redefine this environment variable."                         

echo "localvar=$localvar"    

echo "ENVVAR=$ENVVAR"                                                

                                                                     

                                                                     

[root@node1 scripts]# ./father.sh                                    

Father Process ID is 5429                                            

localvar=Define a local variable.                                    

ENVVAR=Define a environment variable.                                 

Chile Process ID is 5430                                             

My Father Process ID is 5429                                         

localvar=                                                            

ENVVAR=Define a environment variable.                                

localvar=Redefine this ocal variable.                                

ENVVAR=Redefine this environment variable.                           

Return to father process: 5429                                       

localvar=Define a local variable.                                    

ENVVAR=Define a environment variable.                                

     

_____________________________________________________________________




4.参数

  $N     赋值变量

  $#     变量个数

  $*/$@  列出所有变量

  $$     执行的shell进程号

  $?     显示是否错误0/1

__________________________________________________

[root@node1 scripts]# ./a.sh a b c d e f j       

the scripts is ./a.sh          

the part1 #1 a  

the part2 #2 b                                  

all parts a b c d e f j                          

the pats are 7                                   

the error 0                                      

the shell process 4898  

[root@node1 scripts]# cat a.sh  

#!/bin/bash    

echo "the scripts is $0"                         

echo "the part1 #1 $1"                           

echo "the part2 #2 $2"                           

echo "all parts $*"                              

echo "the pats are $#"                            

echo "the error $?"                              

echo "the shell process $$"                      

_________________________________________________



==========================================================================


二、引用

   

   "" 引用除$,`,\外所有字符

   '' 引用所有字符

   `` shell解释为系统命令

    \ 转义符,即屏蔽下一个字符的特殊意义


   1. 全引用和部分引用

   ”“  ‘’


    2.命令替换

    `linux命令`

    $(linux命令)


    需要理解 x y  ”x y“

   ``和$()的区别


    3.转义符

    在使用echo时

          $''=-e

   

  

    

a=1

a="1 2”


**************************************************************************




$? 

0表示运行成功

非0表示失败


echo $? 0或其他------  用于测试判断语句



++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


三.退出状态

1.测试结构

test

格式:test expression


2.整数比较运算符    

整数比较------  用于测试判断语句或循环语句

-eq

le

ge

lt

gt

ne

   


3字符串运算符----- 用于测试用户输入是否为空或比较字符串变量


string 测试string是否不为空

-n string 测试是否不为空

-z string 测试是否为空

string1=string2 测试string1和string2是否相等

sring1!=string2 测试string1和string2是否不相等


格式 [ "string1" =/!=  string2 ]


4.文件操作符

file 为目录,文件,或文件路径

-d file  测试file是否为目录

-f       测试file是否存在

-r 测试file是否为普通文件

-s       测试file是否是进程可读文件

-w      测试file是否是进程可写文件

-x       测试file是否是进程可执行文件 

-L        测试file的长度是否不为0 

-e       测试file是否符号链接

格式 [ -d file ]



逻辑运算符

!expression 非    如果为假,则test为真

expression1 -a expression2 与    如果都为真,则test为真

expression1 -o expression2 或    如果有一个为真,则test为真


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


三.判断

1.简单的if结构

if expression

then 

    command

    command

  ...

fi



2.exit命令

exit status



3.if/else结构

if expression1

then

    command

 ...

    command

else

    command

 ...

command

fi



4.if/else嵌套语句

if expression1

then

   if expression2

then

   command

   command

   ...

else

   command

   command

   ...

fi

else

   if expression3

then

    command

    command

    ...

else

    command

    command

    ...

    fi

fi



5.if/elif/else结构


  if expression1

then

   command

   command

   ...

elif  expression2

then

     command

     command

     ...

elif expresionN

then

     command

     ...

     command

else

     command

     ...

     command

fi



6.case结构

caase variable in

value1)

     command

... 

     command;;

value2)

     command

...

     comand;;

...

valueN)

     command

     ...

     command;;

*)

     command

     ...

     command;;

esac


++++++++++++++++++++++++++++++++++++++++++++++++++++


四、运算符

1.算术运算符

运算符            举例            结果

+(加运算)         3+5            8

-(减运算)         5-3            2

*(乘运算)         5*3 15

/(除运算)         8/3            2

%(取余运算)       15%4           3

**(幂运算)       5**3           125


算术复合赋值运算符

运算符     举例           等价表达式

+=         v+=5          v=v+5

-=         v-10          v=v-10

*=         v*=5          v=v*5

/=         v/=3          v=v/3

%=         v%=5          v=v%5



2.位运算符

运算符                 举例                解释或value值

<<(左移)           value=4<<2             4左移2位,value值为16

>>(右移)           value=8>>2             8右移2位,value值为2

&(按位与)          value=8&4              8按位与4,value值为0

|(按位或)          value=8|4              8按位或4,value值为12

~(按位非)          value=~8               按位非8,value值为-9

^(按位异或)        value=10^3             10按位异或3,value值为9



复合运算符

运算符         举例                     等价表达式

<<=           value<<=2                 value=value<<2

>>=           value>>=2                 value=value>>2

&=            value&=4                  value=value&4

|=            value|=4                  vale=value|4

^=            value^=3                  value=value^3



4.自增自减运算符






++++++++++++++++++++++++++++++++++++

循环

1.列表for循环

for variable in {list}

do

   command

   command

  ...

done


2.不带列表for循环

for variable

do 

  command

  command

...

done



3.类c风格的for循环

for(( expr1;expr2;expr3 ))

do 

   command

   command

  ...

done


++++++++++++++++++++++++++++++++++++++++

while循环

while expression

do 

   command

   command

  ...

done



1.计数其控制的while

couter = 1

while expression

do 

  command

  ...

   let command to operate counter

   command

   ...

done



2.结束标记控制的while循环

read variable

while  [[ "$variable" != sentinel ]]

do

   read variable

done



3.标志控制的while循环

signal=0

while (( singal !=1 ))

do

   ...

   if expression

   then expression

     signal=1

   fi

   ...

done



4.命令行控制的while循环


while [[ "$*" != ""]]

do 

   echo "$!"

shift

done


while [[ "$#" -ne 0 ]]



++++++++++++++++++++++++++++++++++++++++++++++++++++++


until循环

until expression

do

    command

    command

    ...

done