shell腳本學習筆記之常見語法結構用法

       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









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章