• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Bourne Shell及shell編程(1)

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    主要內容: .shell基礎 .shell變量 .script編程 .shell定制 版權聲明: 本文內容為大連理工大學 LINUX 選修課講義,歡迎大家轉載,但禁止使用本材料進行 任何商業性或贏利性活動。轉載時請保留本版權聲明。 作者:何斌武,hbwork@dlut.edu.cn,大連理工大學 網
    主要內容:
        .shell基礎
        .shell變量
        .script編程
        .shell定制



    版權聲明:

    本文內容為大連理工大學LINUX選修課講義,歡迎大家轉載,但禁止使用本材料進行
    任何商業性或贏利性活動。轉載時請保留本版權聲明。
    作者:何斌武,hbwork@dlut.edu.cn,大連理工大學網絡中心,April 1999.
    URL: ftp://ftp.dlut.edu.cn/pub/PEOPLE/albin/

    Bourne Shell

    介紹:Bourne Shell 基礎及其他很多有用的特性,shell編程及組織。

    主要內容:
    .shell基礎 基本介紹,環境,選項,特殊字符
    .shell變量 用戶定義變量,環境變量,位置變量(shell 參數)
    .shell script編程
    條件測試,循環及重復控制
    .shell定制

    1.shell基礎知識
    作者:Stephen Bourne 在Bell實驗室開發
    建議:man sh 查看相關UNIX上的改進或特性

    (1)shell提示符及其環境
    /etc/passwd文件
    提示符:$
    /etc/profile $HOME/.profile
    (2)shell執行選項
    -n 測試shell script語法結構,只讀取shell script但不執行
    -x 進入跟蹤方式,顯示所執行的每一條命令,用于調度
    -a Tag all variables for export
    -c "string" 從strings中讀取命令
    -e 非交互方式
    -f 關閉shell文件名產生功能
    -h locate and remember functions as defind
    -i 交互方式
    -k 從環境變量中讀取命令的參數
    -r 限制方式
    -s 從標準輸入讀取命令
    -t 執行命令后退出(shell exits)
    -u 在替換中如使用未定義變量為錯誤
    -v verbose,顯示shell輸入行

    這些選項可以聯合使用,但有些顯然相互沖突,如-e和-i.

    (3)受限制shell(Restircted Shell)
    sh -r 或 /bin/rsh

    不能執行如下操作:cd, 更改PATH,指定全路徑名,輸出重定向,因此可以提供一個較
    好的控制和安全機制。通常rsh用于應用型用戶及撥號用戶,這些用戶通常是看不到提
    示符的。通常受限制用戶的主目錄是不可寫的。

    不足:如果用戶可以調用sh,則rsh的限制將不在起作用,事實上如果用戶在vi及more
    程序中調用shell,而這時rsh的限制將不再起作用。

    (4)用set改變 shell選項
    用戶可以在$提示符下用set命令來設置或取消shell的選項。使用-設置選項,+取消相應
    選項,大多數UNIX系統允許a,e,f,h,k,n,u,v和x的開關設置/取消。

    set -xv
    啟動跟蹤方式;顯示所有的命令及替換,同樣顯示輸入。
    set -tu
    關閉在替換時對未定義變量的檢查。

    使用echo $-顯示所有已設置的shell選項。


    (5)用戶啟動文件 .profile
    PATH=$PATH:/usr/loacl/bin; export PATH

    (6)shell環境變量
    CDPATH 用于cd命令的查找路徑
    HOME /etc/passwd文件中列出的用戶主目錄
    IFS Internal Field Separator,默認為空格,tab及換行符
    MAIL /var/mail/$USERNAME mail等程序使用
    PATH
    PS1,PS2 默認提示符($)及換行提示符(>)
    TERM 終端類型,常用的有vt100,ansi,vt200,xterm等

    示例:$PS1="test:";export PS1
    test: PS1="$";export PS1
    $echo $MAIL
    /var/mail/username
    (7)保留字符及其含義
    $ shell變量名的開始,如$var
    | 管道,將標準輸出轉到下一個命令的標準輸入
    # 注釋開始
    & 在后臺執行一個進程
    ? 匹配一個字符
    * 匹配0到多個字符(與DOS不同,可在文件名中間使用,并且含.)
    $- 使用set及執行時傳遞給shell的標志位
    $! 最后一個子進程的進程號
    $# 傳遞給shell script的參數個數
    $* 傳遞給shell script的參數
    $@ 所有參數,個別的用雙引號括起來
    $? 上一個命令的返回代碼
    當前shell的名字
    $n (n:1-) 位置參數
    $$ 進程標識號(Process Identifier Number, PID)
    >file 輸出重定向

    `command` 命令替換,如 filename=`basename /usr/local/bin/tcsh`
    >>fiile 輸出重定向,append

    轉義符及單引號:
    $echo "$HOME $PATH"
    /home/hbwork /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:
    $echo '$HOME $PATH'
    $HOME $PATH
    $echo $HOME $PATH
    $HOME /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/hbw
    ork/bin

    其他:
    $dir=ls
    $$dir
    $alias dir ls
    $dir

    ls > filelist
    ls >> filelist
    wc -l < filelist
    wc -l filelist
    sleep 5; echo 5 seconds reaches; ls -l
    ps ax |egrep .netd
    find / -name core -exec rm {} \; &
    filename=`date "+%Y%m%d"`.log

    2. shell變量
    變量:代表某些值的符號,如$HOME,cd命令查找$HOME,在計算機語言中可以使用變量可以
    進行多種運算和控制。

    Bourne Shell有如下四種變量:
    .用戶自定義變量
    .位置變量即 shell script之參數
    .預定義變量(特殊變量)
    .環境變量(參考shell定制部分)
    (1)用戶自定義變量(數據的存儲)
    $ COUNT=1
    $ NAME="He Binwu"

    技巧:因為大部分UNIX命令使用小寫字符,因此在shell編程中通常使用全大寫變量,
    當然這并不是強制性的,但使用大寫字符可以在編程中方便地識別變量。

    變量的調用:在變量前加$
    $ echo $HOME
    /home/hbwork
    $ WEEK=Satur
    $ echo Today is $WEEKday
    Today is
    $echo Today is $day
    Today is Saturday

    Shell變量賦值從右從左進行(Linux Shell/bash從左向右賦值!)
    $ X=$Y Y=y
    $ echo $X
    y
    $ Z=z Y=$Z
    $ echo $Y

    $

    使用unset命令刪除變量的賦值
    $ Z=hello
    $ echo $Z
    hello
    $ unset Z
    $ echo $Z

    $

    有條件的命令替換
    在Bourne Shell中可以使變量替換在特定條件下執行,即有條件的環境變量替換。
    這種變量替換總是用大括號括起來的。

    .設置變量的默認值
    在變量未賦值之前其值為空。Bourne Shell允許對變量設置默認值,其格式如
    下:
    $
    例:
    $ echo Hello $UNAME
    Hello
    $ echo Hello $
    Hello there
    $ echo $UNAME #變量值并未發生變化

    $ UNAME=hbwork
    $ echo Hello $
    Hello hbwork
    $
    .另一種情況:改變變量的值,格式如下:
    $

    例:
    $ echo Hello $UNAME
    Hello
    $ echo Hello $
    Hello there
    $ echo $UNAME #變量值并未發生變化
    there
    $
    .變量替換中使用命令替換
    $USERDIR=$

    .在變量已賦值時進行替換 $
    .帶有錯誤檢查的有條件變量替換
    $
    例:
    $ UNAME=
    $ echo ${UNAME:?"UNAME has not been set"}
    UNAME: UNAME has not been set
    $ echo $
    UNAME: parameter null or not set

    (2)位置變量(Shell參數)
    在shell script中位置參數可用..表示,表示內容通常為當前執行程序的文件名。
    .防止變量值被替換 readonly variable
    .使用export命令輸出變量,使得變量對子shell可用,當shell執行一下程序時,shell
    將為其設置一個新的環境讓其執行,這稱之了subshell. 在Bourne Shell中變量通常
    被認為是本地變量,也就是說在對其賦值之外的shell環境之外是不認識此變量的。使
    用export對subshell可用。

    例:對變量PS1的export操作,shell的提示符將發生變化。
    $ PS1=`hostname`$
    peony$sh
    $ echo $PS1
    $ <-輸出結果
    $ exit
    peony$export PS1
    peony$sh
    peony$ echo $PS1
    peony$ <-輸出結果
    peony$


    3.Shell Script編程
    目的:使用UNIX所提供的最常用工具來完成所需復雜任務的強大功能。

    (1)最簡單的Shell 編程
    $ls -R / |grep myname |more

    每天數據的備份:
    $ cd /usr/yourname; ls * |cpio -o > /dev/rmt/0h

    書寫程序的目的是一次編程,多次使用(執行)!

    $ cat > backup.sh
    cd /home/hbwork
    ls * | cpio -o > /dev/rmt/0h
    ^D

    執行:
    $ sh backup.sh

    或:
    $ chmod +x backup.sh
    $ ./backup.sh

    技巧:在shell script中加入必要的注釋,以便以后閱讀及維護。

    (2)shell是一個(編程)語言
    同傳統的編程語言一樣,shell提供了很多特性,這些特性可以使你的shell script
    編程更為有用,如:數據變量、參數傳遞、判斷、流程控制、數據輸入和輸出,子
    程序及以中斷處理等。

    . 在shell編程中使用數據變量可以將程序變量更為通用,如在上面backup.sh中:
    cd $WORKDIR
    ls * | cpio -o > /dev/rmt/0h

    . Shell編程中的注釋以#開頭
    . 對shell變量進行數字運算,使用expr命令
    expr integer operator integer
    其中operator為+ - * / %, 但對*的使用要用轉義符\,如:
    $expr 4 \* 5
    20
    $int=`expr 5 + 7`
    $echo $int
    12

    (3)Shell編程的參數傳遞, 可通過命令行參數以及交互式輸入變量(read)

    restoreall.sh 對backup.sh程序的備份磁帶進行恢復
    $cat > restoreall.sh
    cd $WORKDIR
    cpio -i < /dev/rmt/0h
    ^D
    restore1.sh:只能恢復一個文件
    #restore1 --program to restore a single file
    cd $WORKDIR
    cpio -i $i < /dev/rmt/0h

    $restore1 file1

    恢復多個文件restoreany :
    #restoreany --program to restore a single file
    cd $WORKDIR
    cpio -i $* < /dev/rmt/0h

    $ restoreany file1 file2 file3


    (4)條件判斷
    . if-then語句,格式如下:
    if command_1
    then
    command_2
    command_3
    fi
    command_4

    在if-then語句中使用了命令返回碼$?,即當command_1執行成功時才執行command_2和
    command_3,而command_4總是執行.

    示例程序unload: 在備份成功時刪除原始文件,帶有錯誤檢查

    cd
    #備份時未考慮不成功的情況!
    ls -a | cpio -o > /dev/rmt/0h
    rm -rf *

    改進如下:

    #當使用了管道命令時,管理命令的返回代碼為最后一個命令的返回代碼
    if ls -a | cpio -o > /dev/rmt/0h
    then
    rm -rf *
    fi

    . if-then-else語句
    if command_1
    then
    command_2
    else
    command_3
    fi

    技巧: 由于shell對命令中的多余的空格不作任何處理,一個好的程序員會用這一特

    對自己的程序采用統一的縮進格式,以增強自己程序的可讀性.

    . 使用test命令進行進行條件測試
    格式: test conditions

    test在以下四種情況下使用: a. 字符比較 b.兩個整數值的比較
    c. 文件操作,如文件是否存在及文件的狀態等
    d. 邏輯操作,可以進行and/or,與其他條件聯合使用

    a. 測試字符數據: shell變量通常民政部下均作為字符變量
    str1 = str2 二者相長,相同
    str1 != str2 不同
    -n string string不為空(長度不為零)
    -z string string為空
    string string不為空

    例:
    $ str1=abcd #在含有空格時必須用引號括起來
    $ test $str1=abcd
    $ echo $?
    0
    $ str1="abcd "
    $ test $str1=abcd
    $ echo $?
    1
    Note: 在test處理含有空格的變量時最好用引號將變量括起來,否則會出現錯誤的
    結果,
    因為shell在處理命令行時將會去掉多余的空格,而用引號括起來則可以防止
    shell去掉這些空格.
    例:
    $ str1=" "
    $ test $str1
    $ echo $?
    1
    $ test "$str1"
    $ echo $?
    0
    $ test -n $str1
    test: argument expected
    $ test -n "$str1"
    $ echo $?
    0
    $

    b. 整數測試: test與expr相同,可以將字符型變量轉換為整數進行操作,expr進行
    整數的算術運算,而test則進行邏輯運算.

    表達式 說明
    ---------------------------------------
    int1 -eq int2 相等?
    int1 -ne int2 不等?
    int1 -gt int2 int1 > int2 ?
    int1 -ge int2 int1 >= int2 ?
    int1 -lt int2 int1 < int2 ?
    int1 -le int2 int1 <= int2 ?

    例:
    $ int1=1234
    $ int2=01234
    $ test $int1 -eq $int2
    $ echo $?
    0

    c. 文件測試:檢查文件狀態如存在及讀寫權限等

    -r filename 用戶對文件filename有讀權限?
    -w filename 用戶對文件filename有寫權限?
    -x filename 用戶對文件filename有可執行權限?
    -f filename 文件filename為普通文件?
    -d filename 文件filename為目錄?
    -c filename 文件filename為字符設備文件?
    -b filename 文件filename為塊設備文件?
    -s filename 文件filename大小不為零?
    -t fnumb 與文件描述符fnumb(默認值為1)相關的設備是一個終端設備?

    d. 測試條件之否定,使用!
    例:
    $ cat /dev/null > empty
    $ test -r empty
    $ echo $?
    0
    $ test -s empty
    1
    $ test ! -s empty
    $ echo $?
    0
    e. 測試條件之邏輯運算
    -a And
    -o Or

    例: $ test -r empty -a -s empty
    $ echo $?
    1
    f. 進行test測試的標準方法
    因為test命令在 shell編程中占有很重要的地位,為了使shell能同其他編程語言
    一樣
    便于閱讀和組織, Bourne Shell在使用test測試時使用了另一種方法:用方括號將
    整個
    test測試括起來:

    $ int1=4
    $ [ $int1 -gt 2 ]
    $ echo $?
    0

    例: 重寫unload程序,使用test測試
    #!/bin/sh
    #unload - program to backup and remove files
    #syntax: unload directory

    #check arguments
    if [ $# -ne 1 ]
    then
    echo "usage: directory"
    exit 1
    fi

    #check for valid directory name
    if [ ! -d "" ]
    then
    echo " is not a directory"
    exit 2
    fi

    cd

    ls -a | cpio -o > /dev/rmt/0h

    if [ $? -eq 0 ]
    then
    rm -rf *
    else
    echo "A problem has oclearcase/" target="_blank" >ccured in creating backup"
    echo "The directory will not be ereased"
    echo "Please check the backup device"
    exit 3
    fi
    # end of unload

    在如上示例中出現了exit, exit有兩個作用:一是停止程序中其他命令的執行,二

    設置程序的退出狀態

    g. if嵌套及elif結構
    if command
    then
    command
    else
    if command
    then
    command
    else
    if command
    then
    command
    fi

    fi
    fi

    改進:使用elif結構
    if command
    then
    command
    elif command
    then
    command
    elif command
    then
    command
    fi

    elif結構同if結構類似,但結構更清淅,其執行結果完全相同.

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>