linux+shell+func,Linux shell编程笔记总结
Linux Shell學習筆記簡介
Linux系統的shell作為操作系統的外殼,為用戶提供使用操作系統的接口。它是命令語言、命令解釋程序及程序設計語言的統稱。shell是用戶和Linux內核之間的接口程序,如果把Linux內核想象成一個球體的中心,shell就是圍繞內核的外層。當從shell或其他程序向Linux傳遞命令時,內核會做出相應的反應。shell是一個命令語言解釋器,它擁有自己內建的shell命令集,shell也能被系統中其他應用程序所調用。用戶在提示符下輸入的命令都由shell先解釋然后傳給Linux核心。有一些命令,比如改變工作目錄命令cd,是包含在shell內部的。還有一些命令,例如拷貝命令cp和移動命令rm,是存在于文件系統中某個目錄下的單獨的程序。對用戶而言,不必關心一個命令是建立在shell內部還是一個單獨的程序。shell首先檢查命令是否是內部命令,若不是再檢查是否是一個應用程序(這里的應用程序可以是Linux本身的實用程序,如ls和rm,也可以是購買的商業程序,如xv,或者是自由軟件,如emacs)。然后shell在搜索路徑里尋找這些應用程序(搜索路徑就是一個能找到可執行程序的目錄列表)。如果鍵入的命令不是一個內部命令并且在路徑里沒有找到這個可執行文件,將會顯示一條錯誤信息。如果能夠成功找到命令,該內部命令或應用程序將被分解為系統調用并傳給Linux內核。shell的另一個重要特性是它自身就是一個解釋型的程序設計語言,shell程序設計語言支持絕大多數在高級語言中能見到的程序元素,如函數、變量、數組和程序控制結構。shell編程語言簡單易學,任何在提示符中能鍵入的命令都能放到一個可執行的shell程序中。當普通用戶成功登錄,系統將執行一個稱為shell的程序。正是shell進程提供了命令行提示符。作為默認值(TurboLinux系統默認的shell是BASH),對普通用戶用“$”作提示符,對超級用戶(root)用“#”作提示符。一旦出現了shell提示符,就可以鍵入命令名稱及命令所需要的參數。shell將執行這些命令。如果一條命令花費了很長的時間來運行,或者在屏幕上產生了大量的輸出,可以從鍵盤上按ctrl+c發出中斷信號來中斷它(在正常結束之前,中止它的執行)。當用戶準備結束登錄對話進程時,可以鍵入logout命令、exit命令或文件結束符(EOF)(按ctrl+d實現),結束登錄。分類
Linux中的shell有多種類型,其中最常用的幾種是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。三種shell各有優缺點。Bourne shell是UNIX最初使用的shell,并且在每種UNIX上都可以使用。Bourne shell在shell編程方面相當優秀,但在處理與用戶的交互方面做得不如其他幾種shell。Linux操作系統缺省的shell是Bourne Again shell,它是Bourne shell的擴展,簡稱Bash,與Bourne shell完全向后兼容,并且在Bourne shell的基礎上增加、增強了很多特性。Bash放在/bin/bash中,它有許多特色,可以提供如命令補全、命令編輯和命令歷史表等功能,它還包含了很多C shell和Korn shell中的優點,有靈活和強大的編程接口,同時又有很友好的用戶界面。C shell是一種比Bourne shell更適于編程的shell,它的語法與C語言很相似。 Linux為喜歡使用C shell的人提供了Tcsh。Tcsh是C shell的一個擴展版本。Tcsh包括命令行編輯、可編程單詞補全、拼寫校正、歷史命令替換、作業控制和類似C語言的語法,它不僅和Bash shell是提示符兼容,而且還提供比Bash shell更多的提示符參數。Korn shell集合了C shell和Bourne shell的優點并且和Bourne shell完全兼容。Linux系統提供了pdksh(ksh的擴展),它支持任務控制,可以在命令行上掛起、后臺執行、喚醒或終止程序。語法
shell語言是非類型的解釋型語言,不象用C++/JAVA語言編程時需要事先聲明變量.給一個變量賦值,實際上就是定義了變量.?由于shell程序的變量是無類型的,所以用戶可以使用同一個變量時而存放字符時而存放數字。?在linux支持的所有shell中,都可以用賦值符號(=)為變量賦值.?如:?abc=9 (bash/pdksh不能在等號兩側留下空格 )?如:?name=abc (bash/pdksh)?在變量賦值之后,只需在變量前面加一個$去引用.?如:?echo $abc
字符集變量的聲明方法是用雙引號如:abc=”how are you ” (將字符集 how are you 賦值給abc)echo $abc?輸出結果:how are you?引用系統變量賦值如:abc=”$LOGNAME,how are you”; ($LOGNAME 存儲了系統登錄用戶名)echo $abc輸出結果:root,how are you字符串相加abc=” how are you”” root”echo $abc輸出結果:how are you root
十進制:直接寫數字?如:a=12 #a是十進制12八進制:在前面加0如:a=012 #a是八進制12十六禁止:在數字前加0x如:a=0x12 #a是十六進制12
數組下標是以零為開始;數組的使用方法如:arr1=(1 2 3 4 5) # 定義數組arr1,并初始化5個值echo ${arr1[0]} #打印數組中第零個變量值arr1[0]=6 #將數組中第0個值賦值為6echo ${arr1[0]} #打印數組中第零個變量值
系統變量就是環境變量,系統變量定義后可以直接在操作系統中調用,對于不同的用戶,其所有的系統變量也不同;系統變量用export聲明,如:export varname=”system var” #聲明varname 為系統變量;可以在操作系統提示符下直接訪問varname如:#echo $varname執行結果:system var
算術運算符+ 加法- 減法* 乘法/ 除法** 冪運算let "z=5**3"echo "z = $z" # z = 125% 取模+= 加等于(通過常量增加變量)如:let "var += 5" #var將在本身值的基礎上增加5-= 減等于*= 乘等于如:let "var *= 4"/= 除等于%= 取模賦值,算術操作經常使用expr或者let表達式
邏輯運算符|| 邏輯或&& 邏輯與)
Str1 = str2 當str1與str2相同時,返回True?Str1! = str2 當str1與str2不同時,返回True?Str 當str不是空字符時,返回True?-n str 當str的長度大于0時,返回True?-z str 當str的長度是0時,返回True
例如:文件b.sh如下#!/bin/bashA1="abc"B1="abc"C1="abcde"if [ "$A1" = "$B1" ]thenecho "A1=B1"fiif [ "$A1" != "$C1" ]thenecho "A1<>C1"fiif [ -n "$A1" ]thenecho "$A1 length>0"fi輸出結果:A1=B1A1<>C1abc length>0
得到字符串長度,使用方法:expr length para#para代表字符串變量?截取字符串,使用方法:${para:X1:X2}?#para代表字符串變量參數,X1代表截取位置,X2代表截取長度,可省略子串刪除,使用方法:{string#substring}#從string中刪除第一個子串substring;子串替換,${string/substring/replacement}使用$replacement來替換第一個匹配的$substring.${string//substring/replacement}使用$replacement來替換所有匹配的$substring.
如文件b.sh#!/bin/bashstring1=teststring?expr length $string1 #字符串長度?echo ${string1:0} #輸出字符串?echo ${string1:1} #輸出子字符串,從第二個字符開始到字符串結尾?echo ${string1:1:3} #輸出第1至3個字符?echo ${string1#test} #刪除字符串中的test子串?echo ${string1/test/replace} #將字符串中的子串test替換為replace?輸出結果:?10teststringeststringeststring判斷語句
Int1 -eq int2 #當int1等于int2時,返回True?Int1 -ge int2 #當int1大于/等于int2時,返回True?Int1 -le int2 #當int1小于/等于int2時,返回True?Int1 -gt int2 #|當int1大于int2時,返回True?Int1 -ne int2 #當int1不等于int2時,返回True
實例:如下文件 b.sh#!/bin/bashint1=3int2=4if [ $int1 -eq $int2 ]?thenecho "int1=int2"elseecho "int1<>int2"fi
執行結果:Int1<>int2
實例:如文件b.sh#!/bin/bashint1=3int2=4if [ $int1 -ge 1 ] && [ $int2 -le 7 ]thenecho "int1>=1 and int2<=7"?fiif [ $int1 -ge 1 ] || [ $int2 -le 1 ]thenecho "int1>=1 or int2<=1"?fi
執行結果:int1>=1 and int2<=7int1>=1 or int2<=1:if 條件語句
語法:if [ 條件 ]then #符合條件表達式?else #不符合條件表達式fi #結束條件詳細例子在本文檔中各實例中均有介紹選擇比較運算符,從下面的條件中選擇出一個復合條件的表達式
如文件:b.sh?#!/bin/basha1=2;case $a1 in1)echo "a1=1";;2)echo "a1=2";;esac
執行結果:a1=2以下列出三種常用的循環語句的用法,三種程序實現相同功能For 循環While循環Until循環
實例:b.sh#!/bin/bashfor i in 1 2 3 4 5?doecho “$i”done&實例:b.sh#!/bin/bashi=1while [$i –le 5]dolet “ i += 1 ”echo “$i”done實例:b.sh#!/bin/bashi=0until [ $i -eq 5 ]dolet " i += 1 "echo "$i"done
輸出結果
12345輸出結果
12345輸出結果
12345中的函數運用
函數聲明:Function_name() #聲明函數{command #函數的主體,執行的命令;}
例如:b.sh#!/bin/bashtestfunction() #函數聲明和處理過程?{echo "this is a test function"?}testfunction #函數調用
執行結果:this is a test function
函數中的局部變量用local聲明,變量的作用范圍是本函數內部,函數執行完畢后局部變量被刪除;如下實例b.sh#!/bin/bashabc=112233 #聲明全局變量abclocalpara() #定義函數{local abc=123 #定義局部變量abc,注意區分上面的abcecho "local para abc is $abc" #輸出局部變量}localpara #調用函數,輸出局部變量abc?echo "abc is $abc" #輸出全局變量abc,變量值沒有改變?執行結果:?local para abc is 123abc is 112233腳本文件的參數
文件參數在shell腳本中使用參數的方法如下:./b.sh start #start 就是第一個參數
調用方法:./b.sh test1 輸出結果是:this is runpara1./b.sh test2 輸出結果是:this is runpara2
特殊的文件參數$0 腳本程序名稱$n 程序文件的第n個參數$* 程序文件的所有參數$# 程序文件參數的個數?$$ 程序文件執行時的PID
看如下腳本文件b.sh#!/bin/bashrunpara1() #函數聲明?{echo "this is runpara1"?}
runpara2() ##函數聲明?{echo "this is runpara2"?}if [ $# -gt 0 ]thenecho “para count >0”fi
case $1 in # $1 代表第一個參數的值?test1) #如果參數是test1就執行函數runpara1?runpara1;;test2)runpara2;;esac
如下文件 b.sh#!/bin/bashtestfunction () #聲明函數{if [ -z "$1" ] #判斷函數是否存在參數($1)thenecho "no para in function" #無參數處理過程elseecho "function's paraname is "$1"" #有參數處理過程fi}testfunction start #執行函數,函數的參數是start執行結果:function’s paraname is start聲明類型變量
declare –r abc=”test string” #聲明abc是只讀類型declare –i int1 #聲明int1是整數類型declare –a arr1 #聲明arr1為數組變量declare -f 函數名(可選) #當存在函數名時,只會列出文件中的名稱是所寫函數的定義,如果不存在函數名,則列出所有函數的聲明
看下面的例子b.sh:#!/bin/bashdeclare -r abc="test declare" #聲明只讀變量abc?echo "echo $abc"abc="read only" #將會出現錯誤提示,因為abc是只讀變量?echo "echo $abc" #打印abc變量,還是“test declare”沒有變化
declare -i int1 #聲明整型變量int1?int1=12;int1="test string" #給整型賦值為字符串,錯誤?echo "$int1"int1=int1/3 #整型變量可以直接使用操作符/?echo “$int1”
func1() #聲明函數func1?{echo "test function"}func2() #聲明函數func2?{echo "test function"}declare –f #顯示所有函數?declare -f func1 #顯示函數func1
文件的執行結果如下:echo test declare./b.sh: abc: readonly variable #只讀變量錯誤提示?echo test declare./b.sh: test string: syntax error in expression (error token is "string") #變量類型錯誤?124 #顯示的是 12/3的結果?declare -f func1 () #顯示所有函數?{?echo "test function"}declare -f func2 ()?{?echo "test function"}func1 () #顯示函數func1?{?echo "test function"}文件中的交互功能
程序需要對用戶輸入的字符進行判斷后執行相應的操作如下面的文件b.sh#程序完成的功能是,判斷用戶輸入的名稱,如果用戶輸入的名稱不是zhangwei,就繼續提示輸入,如果用戶輸入了zhangwei,就提示歡迎字符,程序退出;#!/bin/bashwhile :doecho -n "please input you name:" #提示用戶輸入?read line #讀取用戶輸入的數據?if [ "$line" = "zhangwei" ] #判斷用戶輸入的數據?thenecho "welcome $line" #顯示歡迎信息?exit?fidone
轉義是一種引用單個字符的方法.一個具有特殊含義的字符前邊放上一個轉義符(\)就告訴shell這個字符失去了特殊的含義.對于特定的轉義符的特殊的含義(在echo和sed中所使用)\n 換行\r 回車\t tab鍵\v vertical tab(垂直tab),查前邊的Ctl-K\b backspace,查前邊的Ctl-H\a "alert"(如beep或flash)\0xx 轉換成8進制ASCII解碼,等價于oxx實例,使用轉義符“\”看下文件b.sh#!/bin/bashecho "\v\v\v\v" # 打印字符串”\v\v\v\v .”echo -e "\v\v\v\v" #打印4個垂直tabecho $’\v\v\v\v’ #打印4個垂直tabecho –e “\101” #打印出A,因為A是101的八進制的ascIIecho \z #輸出 zecho '\z' #輸出 \zecho \\z #輸出 \z
總結
以上是生活随笔為你收集整理的linux+shell+func,Linux shell编程笔记总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多多买菜怎么解绑银行卡 怎么解绑多多买菜
- 下一篇: python程序设计题怎么写_《Pyth