高階bash程式設計指南(十)

2022-06-03 03:51:10 字數 3409 閱讀 4605

1.設定選項

(1)bash -n scriptname 不會實際執行指令碼,而只是檢查標本的語法錯誤,

也可以在指令碼中新增 set -n 或者set -o noexec

(2)bash -v scriptname在實際執行乙個命令或者指令碼前列印出這個命令或者指令碼的內容,

也可以在指令碼中新增set -v 或者set -o verbose

(3)bash -x scriptname 列印每個命令的執行結果,set -x or set -o xtrace

2.$lineno和caller

(1)$lineno 等同與vc中的 __line__

(2)caller

#!/bin/bash

func()

caller 0

func

exit 0

把caller放在函式中,可以輸出這個函式在哪一行被呼叫的,以及是在哪個函式中呼叫的

以及該指令碼被呼叫時的命令。

eg: 10  main  ./test.sh

3.像c語言中寫乙個assert函式

#!/bin/bash

assert()

e_args=98

e_assert_fsiled=99

if [ -z "$2" ];then

return $e_args

filineno=$2

if [ ! $1 ];then

echo "assertion failed:file \"$0\",line $lineno,\"$1\""

exit $e_assert_failed

fia=5

b=4assert  "$a -lt $b" $lineno

#other command

echo "hello shell"

exit 0

4.trap 捕捉訊號

trap 'command' sig

trap 'echo ctrl-c' 2

trap 2  #恢復

trap 'command' debug  #debug 每執行一行指令碼執行一次command

用來改變shell或指令碼行為的機制

bash [-optiion縮寫]  or bash -o [option名稱]

縮寫名稱

作用-c

noclobber

防止重定向時覆蓋檔案 (此作用會被》|覆蓋)

-d(none)

列出雙引號引起的含有$字首的字串,但不執行指令碼中的命令

-aallexport

匯出所有定義的變數到環境變數中

-bnotify

當後台任務終止時給出通知 (在指令碼中用的不多)

-c ...

(none)

...讀命令

-eerrexit

指令碼發生第乙個錯誤時就中止指令碼執行,即當乙個命令返回非零值時退出指令碼 (除了until 或 while loops, if-tests, list constructs)

-fnoglob

檔名替換停用(指像*這樣的符號不能替換為檔名了)

-iinteractive

使指令碼以互動式方式執行

-nnoexec

從指令碼裡讀命令但不執行它們(語法檢查)

-o option-name

(none)

呼叫option-name 選項

-o posix

posix

更改bash或指令碼的行為,使之符合posix標準.

-pprivileged

指令碼作為"suid"程式來執行 (小心!)

-rrestricted

指令碼在受限模式中執行 (參考第21章).

-sstdin

從標準輸入讀命令

-t(none)

第乙個命令後就退出

-unounset

當使用乙個未定義的變數時產生乙個錯誤資訊,並強制退出指令碼。

-vverbose

執行命令之前列印命令到標準輸出

-xxtrace

與-v相似, 但列印完整的命令

-(none)

選項列表結束的標誌. 後面的引數是位置引數(positional parameters).

--(none)

釋放位置引數. 如果引數列表被指定了(-- arg1 arg2), 則位置引數被依次設定為引數列表中的值.sa

1.指令碼可以像內嵌到另乙個shell指令碼的普通命令一樣呼叫,如tcl或wish指令碼,甚至makefile.它們可以作為外部shell命令用c語言的system()函式呼叫。

2.把你經常用的自定義的變數和函式放在檔案中,當需要使用的時候,在指令碼中使用點號.或source命令來包含這些「庫檔案」的乙個或多個。

#mybashlib.sh

root_id=0

e_noroot=101

check_is_root()

if [ "$uid" -ne "$root_id" ];then

echo "must be root to run this script."

exit $e_noroot

fi#test.sh

#!/bin/bash

. /home/zone/mybashlib.sh  #包含」庫檔案「,其實該句相當與執行該指令碼檔案

#所以」庫檔案「中最好不要存在一些執行性的語句,而僅僅是定義一些函式和變數。

check_is_root  #呼叫函式

exit 0

3.注釋**塊

(1)here文件

: echo "hello world"

commentblock

(2)if-test結構

#!/bin/bash

comment_block=

if [ $comment__block ];then

echo "comment"

fi#通過給變數 comment_block來控制注釋開關

4.函式返回值給指令碼,乙個方法就是return num,但是num必須時0~255;另一種方法

就是讓函式寫值到標準輸出,這種方法不僅可以返回整數,字串,而且可以返回

多個值。

eg#!/bin/bash

sum_and_product()

echo $(($1+$2)) $(($1*$2))

sumproduct=$(sum_and_product 10 100)

sum=$(echo "$sumproduct"|awk '')

product=$(echo "$sumproduct"|awk '')

exit 0

5.傳遞陣列引數給函式,從函式返回陣列

arg=$(echo "$"),然後把便另arg傳遞給函式

返回陣列的時候可以用同樣的方法。

高階bash程式設計指南(八)

一 正規表示式 1.在這裡就不詳細列舉正規表示式中各種元字元的功能 僅僅說一下,在看這一章遇到的乙個小問題 匹配前乙個字元的任意多次 包括零次 eg 1133 更明確的應該寫成 113 3 可以理解它匹配113 0個3 1133 1個3 但是為什麼可以 匹配111312?111312 因為它是這樣匹...

Bash高階程式設計的閱讀

bin bash echo here echo there myfile myfile if x myfile then echo file myfile is exit cp myfile myfile.bak else echo file myfile not find touch myfile...

javascript 高階程式設計 十

理解js物件 2 建立物件 js中建立物件的方式有很多,我們把他們統稱為模式。工廠模式 優點 解決了建立多個相似物件的問題。缺點 沒有解決物件識別問題。不知道乙個例項物件的型別 function createperson name,age,work return o var person1 crea...