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 -- pgetopts指定變數必須取值:將冒號放在選項後面,如對上述程式碼 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個類別: 飛機, 汽車, 鳥, 貓, 鹿, 狗, 青蛙, 馬, 船以及卡車。