進階shell指令碼編程之函數庫、訊號與陷進、檔案處理、數組、安全性

來源:互聯網
上載者:User

進階shell指令碼編程之函數庫、訊號與陷進、檔案處理、數組、安全性

1、函數庫 把所有需要用到的函數都放到一個檔案中,然後每個指令碼的開頭包含這個檔案。例如:

#!/bin/shscope(){local soc=1gblsoc=2echo "local soc in func = $soc"echo "global gblsoc in func = $gblsoc"}another_scope_function(){echo "This is another_scope_func..."}yet_another_function(){echo "yet_another_function..........."}

可以通過如下方式訪問所有這些函數:

#!/bin/bash. ./lib/scope       //點號(.):包含函數庫檔案scopeanother_scope_functionyet_another_functionexit 0

<1>getopts

getopts是shell內建的工具,用於檢查傳給命令列的選項是否有效。其文法如下:

getopts opstring name

getopts通過兩個變數來跟蹤所有事情:

OPTIND   儲存下一個需要處理的參數索引

OPTARG   如果需要一個參數,getopts就把它放在這個變數中。

#!/bin/shwhile getopts "xy:z:" namedo echo "$name" $OPTIND $OPTARGdone

$ ./p213 -xy "one" -z "two"

getopts(1)、檢查所有的命令列參數,尋找以字元"-"開始的參數。

              (2)、當找到以字元"-"開始的參數,將 "-"之後的字串和option-string比較。

        (3)、如果找到符合的匹配,則指定的變數被設定,否則,此變數被設成?字元。

        (4)、重複1到3,直到所有的選項被處理。

 

2、訊號與陷阱trap
 在Shell程式啟動並執行時候,可能收到各種訊號,有的來自於作業系統,有的來自於鍵盤,而該Shell在收到訊號後就立刻終止運行。但是在有些時候,你可能並不希望在訊號到達時,程式就立刻停止運行並退出。而是他能希望忽略這個訊號而一直在運行,或者在退出前作一些清除操作。trap命令就允許你控制你的程式在收到訊號以後的行為。
    其格式如下:
     trap 'command; command' signal-number
    trap 'command; command' signal-name
    trap signal-number  
    trap signal-name
    後面的兩種形式主要用於訊號複位,即恢複處理該訊號的預設行為。還需要說明的是,如果trap後面的命令是使用單引號括起來的,那麼該命令只有在捕獲到指定訊號時才被執行。如果是雙引號,則是在trap設定時就可以執行變數和命令替換了。
    下面是系統給出的訊號數字和訊號名稱的對照表:
    1)SIGHUP 2)SIGINT 3)SIGQUIT 4)SIGILL 5)SIGTRAP 6)SIGABRT 7)SIGBUS 8)SIGFPE
    9)SIGKILL 10) SIGUSR1 11)SIGEGV 12)SIGUSR2 13)SIGPIPE 14)SIGALRM 15)SIGTERM 17)SIGCHLD
    18)SIGCONT 19)SIGSTOP ... ...

 

3、檔案處理

<1>、檔案檢測

[option file]

運算式

-d file 如果file存在並且是一個目錄

-e file  如果file存在

-r file  如果file存在並且可讀

-s file  如果file存在並且大小大於0

-w file 如果file存在並且可寫

-x file 如果file存在並且可執行

<2>、清除檔案 收回各種資訊

用trap命令清除臨時檔案
#!/bin/shtmpFile=/tmp/sigtrap$$cat > $tmpFilefunction removeTemp(){   if [-f "$tmpFile"]   then      echo "Strong out the temp file"      rm -f "$tmpFile"   fi  }trap removeTemp 1 2exit 0

 

4、數組

<1>聲明數組三種方法

array1[index] = value

array2=(value1 value2 value3 value4)

array3=([0]=value1 [13]=value2 [7]=value3)

<2>解引用數組

獲得數組中某個特定索引位置的資料,如下:

${array[index]}

value=${array3[13]}

echo "$value"

使用特定的符號來判斷一個數組中所有的資料

arrayelements=${array2[@]}

arraylength=${#array2[@]}

也許不想返回所有的元素,而只需要其中某個返回內的資料

${array[@]:3}     
//第一行從第四個元素開始返回所有餘下元素中的資料

${array[@]:3:2}    
//返回第四個元素之後的兩個元素的值

${!array[@]}     //獲得數組中包含的索引值

安全性:受限shell

#!/bin/sh
cd /usr/include
echo "'pwd'"
set -r
cd
echo "'pwd'"
set +r
exit 0

 

補充:

1.特殊參數$*和$@:這兩個允許一次訪問所有的命令列參數。除非使用雙引號“”將它們括起,總結如下:

  $*:指定了所有的命令列參數。

  $@:也指定了所有的命令列參數。

  "$*":將整個參數列表作為一個參數來擷取。

  "$@":擷取整個參數列表,並將它分隔成不同的參數。

2.雙引號", 單引號',反引號`三者的區別

  單引號':由單引號括起來的字元都作為一般字元出現,特殊字元用單引號括起來以後,也會失去原有意義,而只作為

  一般字元解釋。

  雙引號":由雙引號括起來的字元,除$、、’、和”這幾個字元仍是特殊字元並保留其特殊功能外,其餘字元仍作為

  一般字元對待。

  反引號`:作用同$,如$pwd和`pwd`兩者效果是一樣的。

 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.