《Linux 九》Shell 講解

課程大綱 『
 Shell編程語法
 Shell腳本調試
 Shell應用實例

一個簡單的shell程序
 shell結構 :
  1. #!指定執行腳本的shell
  2. #註釋行
  3. 命令和控制結構
創建shell程序的步驟:
 第一步 : 創建一個包含命令和控制結構的文件。
 第二步 : 修改這個文件的權限使它可以執行。
          使用chmod u+x
 第三步 : 執行 ./example
         (也可以使用“sh example”執行)
Shell變量
 變量 : 是shell傳遞數據的一種方法,用來代表每個取值的符號名。
 Shell有兩類變量 : 臨時變量 和 永久變量。
 臨時變量是shell程序內部定義的,其使用範圍僅限於定義它的程序,對其它程序不可見。包括:用戶自定義變
  量、位置變量。永久變量是環境變量,其值不隨shell腳本的執行結束而消失。
用戶自定義變量
 用戶定義的變量由字母或下劃線開頭,由字母、數字或下劃線序列組成,並且大小寫字母意義不
 同。變量名長度沒有限制。在使用變量值時,要在變量名前加上前綴“$”。
設置和使用變量
 設置變量 : 習慣上用大寫字母來命名變量。變量名只能以字母表中的字符開頭,不能用數字。
 變量賦值 : 賦值號“=”兩邊應沒有空格。定義時賦值,如 NUM = 1 將一個命令的執行結果賦給變量,如:TIME=`date`
     將一個變量賦給另一個變量,如:A =$B使用echo命令查看變量值。例如:echo $A
 列出所有的變量:
  # set
  包含多個字的變量:
    $NAME=Mike Ron
            運行時出錯,應改爲 : $NAME=“Mike Ron” 或 $NAME=‘Mike Ron’
 單引號和雙引號的區別 :
  # $ABC=‘$NAME Junior’
  # echo $ABC
  $NAME Junior
  單引號之間的內容原封不動地指定給了變量。
  刪除變量 : # unset NAME
位置變量和特殊變量
 Shell解釋執行用戶命令時,將命令行的第一個部分作爲命令名,其它部分作爲參數。由出現
  在命令行上的位置確定的參數稱爲位置參數。
 例如 : ls -l file1 file2 file3
        $0 這個程序的文件名 ls -l
        $n 這個程序的第n個參數值,n=1-9
特殊變量
 $* 這個程序的所有參數
 $# 這個程序的參數個數
 $$ 這個程序的PID
 $! 執行上一個後臺命令的PID
 $? 執行上一個命令的返回值
Shell命令
 *1 read命令 : 從鍵盤讀入數據,賦給變量 如 : read USERNAME
    read 的例子:
     #! /bin/sh
     read first second third
     echo "the first parameter is $first"
     echo "the second parameter is $second”
     echo "the third parameter is $third"
expr 命令
 Shell變量的算術運算:
  expr命令:對整數型變量進行算術運算
  例如 : expr 3 + 5
         expr $var1 - 5
         expr $var1 / $var2
         expr $var3 \* 10
 複雜的expr命令
   複雜的運算:
     expr `expr 5 + 7`/$var4
   將運算結果賦予變量:
     var4=` expr $var1 / $var2 `
   expr 命令
[plain] view plaincopy
#!/bin/sh  
    a=10  
    b=20  
    c=30  
    value1=`expr $a + $b + $c`  
    echo "The value of value1 is $value1"  
    value2=`expr $c / $b`  
    echo "The value of value2 is $value2"  
    value3=`expr $c \* $b`  
    echo "The value of value3 is $value3"  
    value4=`expr $a + $c / $b`  
    echo "The value of value4 is $value4“  
變量測試語句
  變量測試語句:用於測試變量是否相等、 是否爲空、文件類型等。
  格式 : test 測試條件
  測試範圍 : 整數、字符串、文件
 *1 字符串測試:
   test str1=str2 測試字符串是否相等
   test str1!=str2 測試字符串是否不相等
   test str1 測試字符串是否不爲空
   test -n str1 測試字符串是否不爲空
   test -z str1 測試字符串是否爲空
 *2 整數測試:
   test int1 -eq int2 測試整數是否相等
   test int1 -ge int2 測試int1是否>=int2
   test int1 -gt int2 測試int1是否>int2
   test int1 -le int2 測試int1是否<=int2
   test int1 -lt int2 測試int1是否<int2
   test int1 -ne int2 測試整數是否不相等
 *3 文件測試: 
   test -d file 指定文件是否目錄
   test -f file 指定文件是否常規文件
   test -x file 指定文件是否可執行
   test -r file 指定文件是否可讀
   test -w file 指定文件是否可寫
   test -a file 指定文件是否存在
   test -s file 文件的大小是否非0
 變量測試語句一般不單獨使用,一般做爲if語句的測試條件,如:
  if test -d $1 then
    ...
  fi
 變量測試語句可用[]進行簡化,如
  test -d $1 等價於 [ -d $1 ]
[plain] view plaincopy
#!/bin/sh  
 if [ $# -ne 2 ]; then  
 echo "Not enough parameters"  
 exit 0  
 fi  
 if [ $1 -eq $2 ]; then  
 echo "$1 equals $2"  
 elif [ $1 -lt $2 ]; then  
 echo "$1 littler than $2"  
 elif [ $1 -gt $2 ]; then  
 echo "$1 greater than $2"  
 fi  
流控制語句
 流控制語句 : 用於控制shell程序的流程
 exit語句 : 退出程序執行,並返回一個返回碼,返回碼爲0表示正常退出,非0表示非正常退出。
 例如:exit 0


 *1  if 的使用 
  if ...then ...fi語句, 例如 :
[html] view plaincopy
#!/bin/sh  
   if [ -x /etc/rc.d/init.d/httpd ]  
    then  
   /etc/rc.d/init.d/httpd restart  
  fi  
*2 更復雜的if語句 :
  if 條件1 then
   命令1
  elif 條件2 then
   命令2
  else
   命令3
 fi


 *3 多個條件的聯合:
  -a : 邏輯與,僅當兩個條件都成立時,結果爲真。
  -o : 邏輯或,兩個條件只要有一個成立,結果爲真。


 *4 for...done語句
  格式:for 變量 in 名字表
  do
  命令列表
  done
 例子:
[plain] view plaincopy
#!/bin/sh  
for DAY in Sunday Monday Tuesday Wednesday  
 Thursday Friday Saturday  
do  
 echo "The day is : $DAY"  
don  
 *5 select 變量 in 關鍵字
 do
  command 1
  ... ...
  command n
 done
 select把關鍵字中的每一項做成類似表單,以交互的方式執行do和done之間的命令。


 *6 case...esac語句,格式:
  case 變量 in 
        字符串1) 命令列表1
           ;;
        ...
        字符串n) 命令列表n
           ;;
 esac
 *7 while語句,格式: 
[plain] view plaincopy
while 條件  
  do  
   命令  
  done  
#! /bin/sh  
num=1  
while [ $num -le 10 ]  
do  
  SUM=`expr $num \* $num`  
  echo $SUM  
  num=`expr $num + 1`  
done  
*8 until語句,格式:
  until 條件
  do 
   命令
  done
  until類似while循環,不同的是until是條件返回值爲假時才繼續執行


 *9 跳出循環:break和continue
   break : 跳出整個循環
   continue : 跳過本次循環,進行下次循環
 *10 
   shift指令:參數左移,每執行一次,參數序列順次左移一個位置,$#的值減1,
   用於分別處理每個參數,移出去的參數不再可用


 *11 函數的定義:
  函數名 () 
  {
   命令序列
  }
  函數的調用:不帶()
   函數名 參數1 參數2 ...
 *12 函數中的變量:
  變量均爲全局變量, 沒有局部變量
  函數中的參數 : 調用函數時,可以傳遞參數,在函數中用$1、$2...來引用


 *13  sh -x script
  這將執行該腳本並顯示所有變量的值。
   sh -n script
  不執行腳本只是檢查語法的模式,將返回所有語法錯誤。
 *14 awk命令應用
      awk -F 域分隔符 ‘命令’
   示例 :
     1、檢測系統中UID爲0的用戶
            awk -F: '$3==0 {print $1}' /etc/passwd
     2、檢測系統中密碼爲空的用戶
            awk -F: 'length($2)==0 {print $1}' /etc/shadow
 知識點總結
  掌握Shell編程的基本語法
  掌握結合系統命令編寫應用腳本
  掌握Shell編程調試命令
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章