[LAMP兄弟連李明老師講Linux].課件Shell編程

  • 首先看一個簡單的shell程序     

#!/bin/sh
#This is to show what a example looks like.
echo "Our first example"
echo # This inserts an empty line in output.
echo "We are currently in the following directory."
/bin/pwd
echo
echo "This directory contains the following files"
/bin/ls

 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"
2、shell變量的算術運算:
     expr命令:對整數型變量進行算術運算
            例如:expr 3 + 5
                      expr $var1 - 5
                      expr $var1 / $var2
                      expr $var3 \* 10

複雜的運算:
                  expr `expr 5 + 7`/$var4
將運算結果賦予變量:
                   var4=` expr $var1 / $var2 `
#!/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 測試條件
測試範圍:整數、字符串、文件

字符串測試:
                  test str1=str2       測試字符串是否相等
                  test str1!=str2      測試字符串是否不相等
                  test str1  測試字符串是否不爲空
                  test -n str1           測試字符串是否不爲空
                  test -z str1 測試字符串是否爲空

整數測試:
                  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          測試整數是否不相等

文件測試:
                 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 ]
#!/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

if語句的流程圖


if …then …fi語句,例如:
#!/bin/sh
if [ -x /etc/rc.d/init.d/httpd ]
  then
  /etc/rc.d/init.d/httpd restart
fi

if/else語句的流程圖


 
更復雜的if語句:
              if 條件1 then
                      命令1
              elif 條件2 then
                      命令2
              else
                      命令3
               fi

if/else嵌套的流程圖


 
多個條件的聯合:
             -a:邏輯與,僅當兩個條件都成立時,結果爲真。
             -o:邏輯或,兩個條件只要有一個成立,結果爲真。
echo "please input a file name:"
read file_name
if [ -d $file_name ]
  then
  echo "$file_name is a directory"
elif [ -f $file_name ]
  then
  echo "$file_name is a common file"
elif [ -c $file_name -o -b $file_name ]
  then
  echo "$file_name is a device file“
else
  echo "$file_name is an unknown file"
fi

for…done語句
          格式:for 變量 in 名字表
                     do
                           命令列表
                     done

例子:
#!/bin/sh
for DAY in Sunday Monday Tuesday Wednesday
    Thursday Friday Saturday
do
    echo "The day is : $DAY"
done

select 變量 in 關鍵字
                 do
                       command 1
                            ... ...
    command n
                 done
select把關鍵字中的每一項做成類似表單,以交互的方式執行do和done之間的命令。

case…esac語句,格式:
                   case 變量 in
                              字符串1) 命令列表1
                                                   ;;
                                            ...
                               字符串n) 命令列表n
                                                   ;;
                   esac



while語句,格式:
              while 條件
              do
                      命令
              done
#! /bin/sh
num=1
while [ $num -le 10 ]
do
   SUM=`expr $num \* $num`
   echo $SUM
   num=`expr $num + 1`
done

until語句,格式:
             until 條件
             do
                     命令
             done
until類似while循環,不同的是until是條件返回值爲假時才繼續執行。


跳出循環:break和continue
break:跳出整個循環
continue:跳過本次循環,進行下次循環

shift指令:參數左移,每執行一次,參數序列順次左移一個位置,$#的值減1,用於分別處理每個參數,移出去的參數不再可用
#! /bin/sh
if [ $# -le 0 ]
then
 echo "Not enough parameters"
 exit 0
fi
sum=0
while [ $# -gt 0 ]
do
  sum=`expr $sum + $1`
  shift
done
echo $sum
  • 函數應用
函數的定義:
             函數名 ()
            {
  命令序列

                 }
函數的調用:不帶()
函數名 參數1 參數2 …

函數中的變量:變量均爲全局變量,沒有局部變量                  
函數中的參數:調用函數時,可以傳遞參數,在函數中用$1、$2…來引用
  • shell 腳本調試
sh -x script
這將執行該腳本並顯示所有變量的值。

sh -n script
不執行腳本只是檢查語法的模式,將返回所有語法錯誤。
  • awk命令應用
awk -F 域分隔符 ‘命令’
示例:
         1、檢測系統中UID爲0的用戶
               awk -F: '$3==0 {print $1}' /etc/passwd
         2、檢測系統中密碼爲空的用戶

               awk -F: 'length($2)==0 {print $1}' /etc/shadow


轉自:[LAMP兄弟連李明老師講Linux].課件Shell編程


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