歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

Linux shell腳本編程

Linux shell腳本編程:
  守護進程,服務進程:啟動?開機時自動啟動:
  交互式進程:shell應用程序

      廣義:GUI,CLI
        GUI:
        CLI:
          詞法分析:命令,選項,參數
              內建命令:
              外部命令:PATH
              fork()創建為一個進程:

          把要運行的一系列命令,寫在文件中:
        腳本或程序源文件:文本文件
              兩種方式:
                  編譯執行:預處理---->編譯---->匯編---->鏈接:事先完成,結果:二進制程序文件
                      C,C++
                  解釋執行:由解釋器全程參與運行過程,每次讀取一行,運行一行;
                    Python:程序庫
                        程序控制結構:調用編程庫完成編程編寫;
                        庫文件:功能模塊,在編程中可調用;通過其API:應用編程接口;
                    Bash:程序
                        程序控制結構,調用機器上命令程序文件進行編程編寫;
                        外部命令:各應用程序提供;
        程序:指令+數據
            算法+數據結構

            過程式編程:以指令為中心,設計算法,數據服務於算法;
            對象式編程:以數據為中心,設計數據結構(類),程序服務於數據結構;

            bash過程式編程:
                順序執行:逐個執行
                選擇執行:只執行其中一個分支
                循壞執行:一段代碼要執行0,1或多遍

                編程元素:變量、流程、函數

            變量:可變化的量,命名內存空間

                bash環境:
                  本地變量:當前shell進程;
                  環境變量:當前shell進程及其子進程;
                  局部變量:某個函數執行過程;
                  位置參數變量:在腳本中引用傳遞給腳本的參數;在函數中引用傳遞給函數的參數;
                  特殊變量:$?,$*,$@,$#,$$

                變量類型:
                    數值,字符:

                        數值:
                            整數
                            浮點數
                        字符:
                            ASCII
                        120:
                            字符:1, 2 , 0
                            數值:120 --->

                變量類型的作用:
                      存儲空間
                      運算格式

                語言對變量類型的支持力度:
                    強類型:
                    弱類型:變量類型不嚴格區分;
                        默認存儲機制:bash為字符

                bash的變量使用特點:弱類型、無需事先說明;

            本地變量:
                name=value
                    name:變量名
                    =:賦值符號
                    value:值

                    變量名:只能包含數字、字母和下劃線:且不能以數字開頭;
                      引用變量:${name},name
                      例:
                          [root@localhost ~]# animal="panao"
                          [root@localhost ~]# echo ${animal}
                          panao
                引用:
                    弱引用:"",其內部的變量引用會替換為變量值;
                    強引用:'',其內部的變量引用會保持原有字符;
                    命令引用:`COMMAND`,$(COMMAND),引用命令的執行結果;

                聲明為整型:
                    declare -i name[=value]
                    let name=value

                生命周期:
                    創建
                    銷毀:
                        自動銷毀:shell進程終止;
                        手動銷毀:unset name
                            例:
                                [root@localhost ~]# unset animal

                環境變量:
                    被"導出"的本地變量
                        export name[=value]
                        declare -x name[=value]

                    查看所有環境變量:env,printenv,export

                    銷毀:
                      unset name

            腳本:文本文件
                  運行腳本:事實上是運行一個bash進程,此進程負責從腳本文件中讀取一個執行邏輯,而後有bash進程負責解析並運行此邏輯;
                  啟動腳本:
                        (1) #bash /PATH/TO/SCRIPT_FILE
                        (2)一個執行權限,
                        # ./PATH/TO/SCRIPT_FILE

                        shebang:
                          #!/bin/bash

                  第一行:頂格給出shebang
                  注釋行:#

                  bash的常用選項:
                    -n:檢查腳本中的語法錯誤;
                    -x:調試執行腳本;

            命令的狀態結果:
                bash進程用於追蹤執行的命令成功與否的狀態;
                    0:成功
                    1-222:失敗

                  特殊變量:
                    $?:上一條命令的執行狀態結果;
                        例:
                          [root@localhost bin]# echo $?
                          0 // 0表示成功


                  布爾型:
                      "真":成功
                      "假":失敗

                  自定義腳本的狀態結果:
                    exit[n]

                    注意:腳本中任何位置執行了exit命令即會終止當前shell進程;

                  條件測試:
                    界定程序執行環境:

                    (1)根據運行的命令的狀態結果;
                    (2)測試表達式
                        test EXPRESSION
                        [ EXPRESSION ]  //括號兩邊必須有空格
                        [[ EXPRESSION ]] //括號兩邊必須有空格

Linux Shell腳本 多線程  http://www.linuxidc.com/Linux/2015-10/123993.htm

cat命令利用Linux重定向合並文件 http://www.linuxidc.com/Linux/2015-01/112122.htm

Shell編程淺析 http://www.linuxidc.com/Linux/2014-08/105379.htm 

Linux Shell參數替換 http://www.linuxidc.com/Linux/2013-06/85356.htm

Shell for參數 http://www.linuxidc.com/Linux/2013-07/87335.htm

Linux/Unix Shell 參數傳遞到SQL腳本 http://www.linuxidc.com/Linux/2013-03/80568.htm

Shell腳本中參數傳遞方法介紹 http://www.linuxidc.com/Linux/2012-08/69155.htm

Shell腳本傳遞命令行參數 http://www.linuxidc.com/Linux/2012-01/52192.htm

Linux Shell 通配符、轉義字符、元字符、特殊字符 http://www.linuxidc.com/Linux/2014-10/108111.htm

                  整數測試:隱含著做數值大小比較,所以不要給變量引用加引用;
                      $A -gt $B:是否大於:是則為"真",否則為"假";
                      $A -ge $B:是否大於等於;
                      $A -lt $B:是否小於;
                      $A -le $B:是否小於等於;
                      $A -eq $B:是否等於;
                      $A -ne $B:是否不等於;
                  字符串測試:ASCII數值越大,字符比較時其值越大
                      "$A" > "$B":是否大於;
                      "$A" < "$B":是否小於;
                      "$A" == "$B":是否等於;
                      "$A" != "$B":是否不等於;
                      -z "$A":是否為空;空則為"真",否則為"假"
                      -n "$A":是否不空;不空則為"真",空則為"假"

                      注意:應該使用[[ EXPRESSION ]]

                  文件測試:測試文件的存在性以及屬性;
                      -e $file:是否存在,存在則為"真",否則為"假"
                      -a $file:同上
                      -f $file:文件是否存在且為普通文件;
                      -d $file:文件是否存在且為目錄;
                      -h $file:是否存在且為符號鏈接文件;
                      -L $file:同上;
                      -b $file:是否存在且為塊設備文件;
                      -c $file:是否存在且為字符設備文件;
                      -S $file:是否存在且為套接字文件;
                      -p $file:是否存在且為管道文件;

                      -r $file:當前用戶對文件是否擁有讀權限;
                      -w $file:當前用戶對文件是否擁有寫權限;
                      -x $file:當前用戶對文件是否擁有執行權限;

                      -u $file:文件是否擁有SUID權限;
                      -g $file:文件是否擁有SGID權限;
                      -k $file:文件是否擁有sticky權限;

                      -O $file:當前用戶是否為指定文件的屬主;
                      -G $file:當前用戶是否為指定文件的屬組;

                  雙目操作符:
                  $file1 -nt $file2:file1是否新於file2,file1的最近一次的修改時間是否晚於file2的;
                  $file1 -ot $file2:file1是否舊於file2,file1的最近一次的修改時間是否早於file2的;
                  $file1 -ef $file2:file1與file2是否指向了同一個inode:測試二者是否為同一個文件的硬鏈接;

 

              特殊設備:
                  /dev/null:空,bit buckets,吞下所有數據,並直接丟棄;
                  /dev/zero:突出一堆0:

              bash之條件判斷(選擇執行):
                  if/then,case

                  if CONDITTION;then
                      if-true-分支
                  fi
                 
                  if CONDITTION;then
                      if-true-分支
                  else
                      if-false-分支

                  !CONDITTION:取反

    練習:寫一個腳本
        如果其路徑不存在,則將其創建為目錄,否則顯示其存在,並顯示內容類型;
                   
              #!/bin/bash
              #
              filename="/tmp/x/y/z/testdir"
              if [ -e $filename ];then
                  echo "$filename exists."
                  file $filename
              else
                  mkdir -p $filename
              fi
              ~                                                                                                             
              ~       
      腳本參數(位置參數變量):
          ./script.sh /etc/fstab /etc/grub2.cfg
              $0            $1          $2

          位置參數變量:$1,$2,....
              ${10}

          特殊變量:
              $?:命令的狀態結果;
              $#:傳遞給腳本或函數的參數個數;
              $*和$@:引用傳遞給腳本或函數的參數列表;

          shift:[n]:輪替

      與用戶交互:
        read命令:
              read [option] VAR...
                  -p "PROMPT"
                  -t  timeout
            示例:

                #!/bin/bash
                #

                read -p "Plz enter a username: " -t 5 username

                if [ -z "$username" ]; then
                    username="myuser"
                fi

                if id $username &> /dev/null; then
                    echo "$username exists."
                else
                    useradd $username
                fi
       


      命令引用:
          `COMMAND`,$(COMMAND)

          引用命令的執行結果:
          (1)ls `which cat`
          (2)lines=$(wc -l /etc/fstab | cut -d '' -f1)
         
          #!/bin/bash
          #
          if [ -f $1 ]; then
              lines=$(wc -l $1 | cut -d' ' -f1)
              echo "$1 has $lines lines."
          else
              echo "$1 not exists or not a file."
          fi
     
      練習:寫一個腳本,完成如下功能:
          判斷給定的兩個數值,孰大孰小;
            給定數值的方法:腳本參數,命令交互;
代碼如下:

  1 #!/bin/bash
  2 #
  3 read -p "Plz enter two integer: " -t 10 num1 num2
  4
  5 if [ -z "$num1" ];then
  6    echo "Plz give two integers."
  7    exit 1
  8 fi
  9
 10 if [ -z "$num2" ];then
 11    echo "Plz give two integers."
 12    exit 1
 13 fi
 14
 15 if [$num1 -ge $num2 ];then
 16    echo "Max: $num1,Min;$num2."
 17 else
 18    echo "Max:$num2,Min:$num1."
 19 fi
      循環語句:
          for,while,until

            循環:將循壞體代碼執行0、1或多次;
              進入條件:進入循環的條件;
              退出條件:循環終止的條件;

            for VARIABLE in LIST;do
                循環體
            done

            LIST:是由一個或多個空格分隔開的字符串組成;
                把列表的每個字符串逐個賦值給VARIABLE表示的變量;

                for username in user1 user2 user3;do
                    循環體
                done

                進入條件:列表非空
                退出條件:列表遍歷結束;

添加5個用戶:
#!/bin/bash
#
for username in user1 user2 user3 user4 user5; do
    if id $username &> /dev/null; then
      echo "$username exists."
    else
      useradd $username
      echo "Add user $username finished."
    fi
done
    LIST的生成方法:
      (1)整數列表
        (a){start..end}
        (b)$(seq start [[step]end])
      (2)直接給出
      (3)glob
      (4)根據命令生成


示例:數值列表
#!/bin/bash
#
for i in {1..10}; do
    if id user$i &> /dev/null; then
      echo "user$i exists."
    else
      useradd user$i
      echo "Add user user$i finished."
    fi
done

示例:glob
#!/bin/bash
#
for filename in /var/log/*; do
    file $filename
done

示例:命令生成列表
#!/bin/bash
#
for username in $(cut -d: -f1 /etc/passwd); do
  echo "$username primary group: $(id -n -g $username)."
done

算術運算:
  +,-,*,%,**

  sum=$a+$b
  (1)$[$A+$B]
  (2)$(($A+$B))
  (3)let VARIABLE=$A+$B
  (4)VARIABLE$(expr $A + $B)

  示例:

[root@localhost bin]# a=6
[root@localhost bin]# b=7
[root@localhost bin]# sum=$a+$b
[root@localhost bin]# echo $a+$b
6+7
[root@localhost bin]# echo $[$a+$b]
13
[root@localhost bin]# let $a+$b
[root@localhost bin]# let sum=$a+$b
[root@localhost bin]# echo $sum
13
[root@localhost bin]# expr $a + $b
13

示例:求100以內正整數之和;
#!/bin/bash
#
declare -i sum=0

for i in {1..100}; do
  sum=$[$sum+$i]
done

echo $sum

練習:求100以內所有偶數之和;
使用至少三種方法實現;

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-03/128789p2.htm

Copyright © Linux教程網 All Rights Reserved