1. 程式人生 > >Linux Unix shell 程式設計指南學習筆記(第四部分)

Linux Unix shell 程式設計指南學習筆記(第四部分)

第十六章  shell指令碼介紹

此章節內容較為簡單,跳過。

第十七章   條件測試

test命令

expr命令

test 

格式  test  condition     或者  [ condition ]  (注意: condition兩側有空格)

檔案狀態測試:

- d	目錄		;	- s	檔案長度大於0、非空	;	- f	正規檔案
- w	可寫		;	- L	符號連線			;	- u	檔案有s u i d位設定
- r	可讀		;	- x	可執行
測試的邏輯操作符:

-a   :邏輯與,操作符兩邊均為真,結果為真,否則為假。
-o   :邏輯或,操作符兩邊一邊為真,結果為真,否則為假。
!  :邏輯否,條件為假,結果為真。

字串測試:

=     兩個字串相等。		;	!=   兩個字串不等。
-z    空串。			;	-n    非空串。

數值測試:
-eq   數值相等。			;	-ne   數值不相等。
-gt   第一個數大於第二個數。	;	-lt   第一個數小於第二個數。
-le   第一個數小於等於第二個數。<span style="white-space:pre">	</span>;	-ge   第一個數大於等於第二個數。

expr(一般用於整數值  也可以  用於字串 , expr 測試成功返回  1  , 其他值為錯誤

格式: expr     argument     operator    argument

對數字: expr   number1    [+ - * / 等]  number2

對字串: expr  string1  [=  模式匹配等 ]

expr的模式匹配: expr  string  : pattern

第十八章 控制流程

退出狀態

while、for 和 until loop 迴圈

if  then else 語句

指令碼中動作

選單

退出狀態

使用 $?  檢視最後退出狀態。主要有4種退出狀態,即 $ ?和控制次序命令($ $、| |)。其餘兩種是處理s h e l l指令碼或s h e l l退出及相應退出狀態或函式返回碼。

退出當前程序 exit  n  , n 為一個數值。鍵入e x i t,s h e l l將試圖(通常是這樣)返回上一個命令返回值

迴圈

for 迴圈每次處理依次列表內資訊,直至迴圈耗盡。
Until 迴圈此迴圈語句不常使用,u n t i l迴圈直至條件為真。條件部分在迴圈末尾部分。
While 迴圈w h i l e迴圈當條件為真時,迴圈執行,條件部分在迴圈頭。

if  then else  語句(也可以檢測命令是否成功返回)

if  條件1
	then  命令1
	elif	條件2
		then 命令2
	else 命令3
fi


樣例程式碼

#!/bin/bash
# it is used to create a file which add header "#!/bin/bash" automatically
filename=$1
# get the first parameter used as filename
#echo $filename
if [!$filename ]; then
        read var
        filename=$var
else
        echo $filename
fi
echo '#!/bin/bash' > $filename # write data to filename
vim $filename # open file with vim editor

一段簡單指令碼程式碼,在當前目錄下建立一個當前目錄不存在的檔案,鍵入 檔名 -h 還可以檢視幫助文件。
#!/bin/bash
fname=$1
function help(){
    echo "this is a simple helper document for use this tool";
    echo "basic form : ./newFile [option] [filename]";
    echo -e  "\t -h\t print this help page"
}
if [ $fname ]; then
    case $fname in
    -h) help;exit;;
    esac
    fileArray=$(ls -a)
    for aFile in $fileArray; do
        if [ $aFile = $fname ]; then
            echo " file $fname already exits ."
            exit
        fi
    done;
else
    echo "please input a file name that will be created ! "
    exit
fi
touch $fname && echo "file  $fname  create success !"

if 檢查命令執行結果
#!/bin/bash
#name:  if_test_comman
if grep -nr "good" ./ > /dev/null 2>&1
    then echo "string good found !"
    else echo "there isn't a string called good under $PWD"
fi

測試傳遞引數個數: if [ $# lt n ] ;then 命令  ; 如果傳入引數少於 n  個, 那麼執行命令。

判斷指令碼是否為互動模式(終端模式)還是非互動模式(c r o n或a t): if [  -t ]

檢測前面最近一個的命令狀態: if [ $? = 0  ] ; then 命令

case 語句 (模式中可以是常量和變數)

<span style="font-size:14px;"><strong>case   值   in
模式1)命令...;;
模式2)命令...;;
模式3)命令...;;
......
esac</strong></span>

模式中還可以包含元字元:

*   任意字元。;?任意單字元。;[..]   類或範圍中任意字元。

#!/bin/bash
case $1 in
        "1") echo "one";;
        "2") echo "two";;
        "3") echo "three";;
        "4") echo "four";;
        "5") echo "five";;
        "6"|"six") echo "six";;
        *)echo "unknown data $1"
esac <span style="color:#006600;">  </span>

for 迴圈  

for  值    in   列表(如果不指定列表,預設取位置引數)
do
      命令...
done
使用for迴圈顯示所有的位置引數(可以是任意個數的引數)
#!/bin/bash
#name:  for_use_geovar
echo -e "location variables are : \c"
for VAR   # the same as “in "[email protected]"” or  "in "$*""
do
    echo -e  $VAR "\c"
done
echo ""

巢狀for迴圈
for  變數名1  in列表1
d o
<span style="white-space:pre">	</span>for  變數名2  in  列表2
<span style="white-space:pre">	</span>d o
<span style="white-space:pre">		</span>命令1
<span style="white-space:pre">		</span>. . .
<span style="white-space:pre">	</span>d o n e
d o n e

until 迴圈(一般可用while迴圈替代,通常情況while迴圈優於until迴圈)
until  條件
do
<span style="white-space:pre">	</span>命令1
<span style="white-space:pre">	</span>. . .
d o n e

while 迴圈
while  命令
d o
<span style="white-space:pre">	</span>命令1
<span style="white-space:pre">	</span>. . .
d o n e

while從檔案中讀取資料:
<span style="font-size:14px;"><strong>while read LINE
do
XXX
echo $LINE
done  < filename</strong></span>

break 和 continue 適合於 case 和迴圈。

第十九章    shell 函式

shell 函式定義:一組命令集或語句組成的可用塊。

函式的組成: 函式標題   和   函式體。

使用函式可以節省大量的指令碼編寫時間。建立可用和可重用的指令碼很有意義,可以使主指令碼變短,結構更加清晰。

定義函式

在指令碼中使用函式

在函式檔案中使用函式

函式舉例

定義函式(所有函式在使用前必須定義)

定義函式的格式為:

[function]  函式名(){
    命令1
    ...
}

在指令碼中使用函式:
#!/bin/bash 
function hello(){
    echo "hellow ting , nice to meet you !"
}

echo "today is `date`"
hello
echo "I'm glad to see you again ~_~!"

向函式中傳遞引數

想函式傳遞引數跟向指令碼傳遞引數一樣(使用位置變數引數 $1,$2,...),函式取得所傳引數後,將原始引數傳回shell指令碼。函式離呼叫引數的轉換以下劃線開始,後加變數名,如 : _key。

從呼叫函式中返回

1、函式正常執行到函式末尾,然後返回指令碼中呼叫函式的控制部分。

2、使用return返回

return   	從函式中返回,使用最後狀態命令決定返回值
return 0 	無錯誤返回
return 1	有錯誤返回

函式返回值測試:

hello
if [ $? =0 ] ; then
或者
if  hello ; then

在shell中使用函式

1、建立函式檔案 (任意檔案)

2、將函式檔案載入shell  (.  函式檔案位置)(可以通過set檢視所有載入當前shell的函式,unset刪除shell函式)

3、執行shell函式   (函式名稱   引數 ....)

如:  函式檔案 funs.h

#!/bin/bash 

function find_file(){
    tarName=$1;
    if [ -n tarName ]; then
            find ./ -name ${tarName}
    else
            echo "please input a file name ."
    fi  
}

將該檔案載入shell : . funs.h

執行函式: find_file    filename(任意字串)

在指令碼中呼叫函式

要在指令碼中呼叫函式,必須先定義該函式(在呼叫之前)。

在指令碼中呼叫函式檔案中的函式:

1、首先建立函式檔案

2、在指令碼檔案中載入函式檔案(跟在shell中載入函式檔案類似)

3、呼叫函式

如: call_fun.sh 和 funs.h 檔案在同一個目錄,其內容如下:

#!/bin/bash 
. funs.h
find_file $1


第二十章  向指令碼傳遞引數

shift

getopts

shift

shift作用: 在向指令碼傳遞引數時,shift 可以將每一個引數向左偏移一位。

#!/bin/bash 
while [ $# -ne 0 ]   #while ther are still arguments
do
    echo $1
    shift
done

最後一個引數獲取的方法:
eval echo \$$#     或   shift 'expr $# -2'
通過驗證在ubuntu12.04上 第二個命令應該為 : shift  `expr $# - 1` ; shift 後接偏移的數量然後用$1 就可以取得該值。  如  lastVar.sh :
#!/bin/bash 
shift `expr $# - 1`
echo $1

./lastVar.sh file name good   , 輸出結果為good

getopts

如果要控制諸如  command  -l    -c      23    -v       file1      file2    時,shift命令就不夠了,此時該用getopts命令。

getopts 格式:  getopts  varString  variable

#!/bin/bash 

ALL=false
HELP=false
FILE=false
VERBOSE=false

while getopts ahfv OPTION
do
    case $OPTION in
    a) ALL=true;        echo "ALL is $ALL";;
    h) HELP=true;       echo "HELP is $HELP";;
    f) FILE=true;       echo "FILE is $FILE";;
    v) VERBOSE=true;    echo "VERBOSE is $VERBOSE";;
    esac
done
如果引數中包含一個未指定的選項引數 ,如 ./getopts_test.sh -p 則提示: ./getopts_test.sh: illegal option -- p

getopts指定變數必須取值:將冒號放在選項後面,如對上述程式碼   ahfv 修改為 ahfvt: ,那麼t必須指定取值。

使用方法為  ./getopts -[a h f v] -[t value] XXX

第二十一章   建立螢幕輸出

tput命令

使用轉義序列和產生控制碼

使用顏色

tput

使用tput前,需要先初始化:  tput  init

常用字串:

  名字              含義
  b e l              警鈴
  b l i n k          閃爍模式
  b o ld             粗體
  c i v i s          隱藏游標
  c l e a r          清屏
  c n o r m          不隱藏游標
  c u p              移動游標到螢幕位置(x,y)
  e l                清除到行尾
  e l l              清除到行首
  s m s o            啟動突出模式 
  r m s o            停止突出模式
  s m u l            開始下劃線模式
  r m u l            結束下劃線模式
  s c                儲存當前游標位置
  rc                 恢復游標到最後儲存位置
  s g r 0            正常螢幕
  r e v              逆轉檢視
常用數字:
	名字			含義
	c o l s			列數目
	i t			t a b設定寬度
	l i n e s		螢幕行數
bool操作符
	名字			含義
	c h t s			游標不可見
	h s			具有狀態行

通過傳送命令開啟和關閉游標(Linux/BSD):

echo -e "\033[?25h"     和    echo -e "\033[?25l"
System V : 
echo "\033[?25h"       和  echo "\033[?25l" 

傳送命令清屏,並且將游標移動到左上角(Linux/BSD)
echo -e "\033[2J"

使用顏色:

產生顏色格式 : escape [ background_color;foreground_color m

linux/bsd : echo -e "\033[40;33m"  (黑色背景,黃色字型)

第二十二章   建立螢幕輸入

幾乎都是例項操作程式碼,略過。

第二十三章  除錯指令碼

一般錯誤

set命令介紹

一般錯誤

1、迴圈錯誤

2、漏洩引號

3、測試錯誤 [ condition ] , condition 兩邊都有空格。

4、字元大小寫

5、for迴圈  注意$符號

6、echo  , 不要在echo命令後直接加最後狀態命令,此時值永遠為真

set命令 (-開啟選項, +關閉選項)

set [-n (讀命令但不執行)     |     -v(顯示讀取的所有行)     |    -x(顯示所有的命令及其引數)]

第二十四章   shell 嵌入命令

shell 嵌入命令在 bourne shell 裡面建立而不是存在於 /bin 或  /usr/bin目錄裡。相同的命令 ,嵌入命令要比系統命令要快。

標準的bourne shell  嵌入命令列表

:		空,永遠返回為t r u e
.		從當前shell中執行操作
break		退出for、while、until或case語句
cd		改變到當前目錄
continue	執行迴圈的下一步
echo		反饋資訊到標準輸出
eval		讀取引數,執行結果命令
exec		執行命令,但不在當前shell
exit		退出當前shell
export		匯出變數,使當前  shell  可利用它
pwd		顯示當前目錄
read		從標準輸入讀取一行文字
readonly	使變數只讀
return		退出函式並帶有返回值
set		控制各種引數到標準輸出的顯示
shift		命令列引數向左偏移一個
test		評估條件表示式
times		顯示  shell 執行過程的使用者和系統時間
trap		當捕獲訊號時執行指定命令
ulimit		顯示或設定  shell  資源
umask		顯示或設定預設檔案建立模式
unset		從  shell  記憶體中刪除變數或函式
wait		等待直到子程序執行完畢,報告終止

set在指令碼內部給出執行引數(主要作用是用於測試指令碼的時候避免每次都要輸入引數):
#!/bin/bash 
set ting er xy
while [ $# != 0 ] 
do
    echo $1
    shift
done
如果執行指令碼時帶了引數,那麼後面的引數會被指令碼內部的引數給覆蓋掉。

times : times第一行給出shell消耗時間,第二行給出執行命令消耗時間

type: 查詢命令是否仍駐留系統及命令型別。

#!/bin/bash 
set cd good
while [ $# != 0 ] 
do
    if type $1 > /dev/null 2>&1;then
        echo "command $1 is still in shell ."
    else
        echo "the command $1 not found ."
    fi  
    shift
done
用type 查詢命令是否駐留在系統中,遮蔽type的輸出,使用我們自定義的輸出。

ulimit:設定執行在shell上的顯示限制

-a 顯示當前的所有限制

-c 限制核心垃圾大小

-f  限制執行程序輸出檔案的大小

wait :等待子程序完成,不帶程序id會等待所有的子程序完成。

相關推薦

Linux Unix shell 程式設計指南學習筆記部分

第十六章  shell指令碼介紹 此章節內容較為簡單,跳過。 第十七章   條件測試 test命令 expr命令 test  格式  test  condition     或者  [ condition ]  (注意: condition兩側有空格) 檔案狀態測試:

Linux Unix shell 編程指南學習筆記部分

fcm 驗證 () only arguments line div 反饋 sed 第十六章 shell腳本介紹 此章節內容較為簡單,跳過。 第十七章 條件測試 test命令 expr命令 test 格式 test condition 或者 [

javascript高階程式設計學習筆記

-基本型別和引用型別的值 ECMAScript變數可能包含兩種資料型別的值:基本型別值指簡單的資料段,引用型別值指可能由多個值構成的物件。對於5種基本型別值,可以直接操作儲存在變數中的值;而javascript不允許直接訪問物件的記憶體空間,只能通過操作物件的

python 3.5學習筆記

ping 函數返回值 使用 family __next__ 什麽 san 直接 all 本章內容:   一、、裝飾器   二、生成器   三、叠代器   四、python中的內置方法   五、json & pickle 的數據序列化及反序列化   六、程序目錄結構規

java-web學習筆記

解決方案 重寫 區別 學習 java 占用 表單 服務 安全 第四章:會話跟蹤 1,什麽是會話跟蹤技術 會話跟蹤技術是一種在客戶端和服務器端保持HTTP狀態的解決方案,是使上一次請求所傳遞的數據能夠維持狀態到下一次請求,並且辨認出是否是相同的客戶端所發送出來的。主要

Tensorflow學習筆記—遞迴神經網路

一、首先下載來源於 Tomas Mikolov 網站上的 PTB 資料集 http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz 二、需要的程式碼: 這裡只簡單的放了一些程式碼

Hive程式設計指南-學習筆記 資料型別和分隔符

一、Hive概述 Hive定義了類似SQL的查詢語言——HiveQL,使用者編寫HiveQL語句執行MapReduce任務,查詢儲存在Hadoop叢集中的資料。 HiveQL與MySQL最接近,但還是有顯著性差異的。Hive不支援行級插入、更新操作和刪除操作。Hive不支

Hive程式設計指南-學習筆記 資料定義

一、資料庫 1、建立資料庫:CREATE DATABASE hive; 如果已經存在,會丟擲異常,下面的語句不丟擲異常:CREATE DATABASE IF NOT EXISTS hive; 資料庫的預設位置是hdfs上:/user/hive/warehouse,修改預

Hive程式設計指南-學習筆記 資料操作

一、向管理表中裝載資料 Hive沒有行級別的資料插入、更新和刪除操作,往表中裝載資料的唯一途徑就是使用一種“大量”的資料裝載操作。 LOAD:向表中裝載資料 (1)把目錄‘/usr/local/data’下的資料檔案中的資料裝載進usr表,並覆蓋原有資料:LOAD DA

黑馬《linux基礎程式設計學習筆記81到84

八十一. lstat和stat函式的區別  八十二. 檔案屬性相關的函式  首先是access.c #include <stdio.h> #include <stdlib.h> #include <unistd.h>

黑馬《linux基礎程式設計學習筆記76到80

七十六. 非阻塞讀終端 #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include

java-web學習筆記五章

war 客戶 腳本元素 utf 輸出 PE 行動 包含 筆記 第五章:JSP語法 一:Servlet和JSP的區別和各自優勢?  Servlet和JSP均基於java語言,Servlet以java類的形式體現,JSP以腳本語言形式體現,兩者均需要在web

Java-Web學習筆記六章

contex res page 發送 con 結果 管理 第六章 都是 一:什麽是內置對象?  1)定義:JSP內置對象(JSP隱含對象)是指不用聲明就可以在JSP頁面的腳本和表達式中直接使用的對象。  2)特點: &ems

java-web學習筆記三章

t對象 元素 config ttr method 通過 OS 接口 實現 第三章:Servlet核心接口 1, ServletConfig對象的作用,在Servlet中如何使用? 每個Servlet擁有唯一的servletConfig對象,通過ServletConf

Java-Web學習筆記八章

lan request 雙引號 text ava user OS 程序 Language 第八章:表達式語言 一:EL簡介 EL是一種簡單的語言,可以方便的訪問和處理應用程序數據,而無需使用JSP腳本元素或JSP表達式二:EL語法 (1)語法:${表達式

Java-Web學習筆記九章

port pac clas tle code lang tran RR req 一:自定義標簽庫(步驟)1>開發自定義標簽類(編寫一個實現SimpleTagSupport接口的java類) package book07; import java.io.IOExcep

python3.5學習筆記六章

原本 空白 制表符 false sdh office 元組 所有 n) 本章內容:   正則表達式詳解(re模塊) 1、不使用正則表達式來查找文本的內容   要求從一個字符串中查找電話號碼,並判斷是否匹配制定的模式,如:555-555-5555。傳統的查找方法如下:

鳥哥私房菜學習筆記零章

tel 能夠 復雜 整合 amd 芯片 解析 ted bsp CPU發布控制命令控制數據是流入內存還是流出內存,CPU處理的數據全部是來自內存的。 CPU的種類: 根據內部的微指令集來區分(CPU依靠(運行)指令碼) 精簡指令集(RISC):例如升陽(sun)的S

Linux內核設計與實現 總結筆記進程調度

什麽 原則 好的 nic 調度系統 相交 中間 使用 就是 進程調度 調度程序負責決定將哪個進程投入運行,何時運行以及運行多長時間。 調度程序沒有太復雜的原理,最大限度地利用處理器時間的原則是,只要有可以執行的進程,那麽就總會有進程正在執行。 多任務 多任務系統可以劃分

Tensorflow學習筆記三天—卷積神經網路

     對CIFAR-10 資料集的分類是機器學習中一個公開的基準測試問題,其任務是對一組大小為32x32的RGB影象進行分類,這些影象涵蓋了10個類別: 飛機, 汽車, 鳥, 貓, 鹿, 狗, 青蛙, 馬, 船以及卡車。