Linux shell編程筆記總結

來源:互聯網
上載者:User

目 錄
1、 Shell簡介
1.1. 什麼是shell
1.2. shell分類
2、 Shell文法
2.1. 定義變數
2.2. 變數類型
2.2.1. 字元集變數
2.2.2. 數字常量定義
2.2.3. 數組
2.2.4. 系統變數
2.3. 運算子與運算式
2.3.1. 運算子
2.3.2. 字串運算式(判斷條件命令if)
2.3.3. 字串操作
2.3.4. 數值運算式
2.3.5. 複合條件運算式
2.4. 流程式控制制
2.4.1. 條件轉移 :if 條件陳述式
2.4.2. 選擇語句case
2.4.3. 迴圈語句
2.5. Shell中的函數運用
2.5.1. 函式宣告
2.5.2. 局部變數
2.5.3. Shell指令檔的參數
2.5.4. 函數的參數
2.6. 類型變數
2.6.1. declare 宣告類型變數
2.7. Shell檔案中的互動功能
2.8. 轉義(\)

Linux Shell學習筆記

Shell簡介什麼是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實現),結束登入。

shell分類

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文法定義變數

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個值賦值為6
echo ${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運算式

邏輯運算子
|| 邏輯或
&& 邏輯與

字串運算式(判斷條件命令if)

Str1 = str2 當str1與str2相同時,返回True
Str1! = str2 當str1與str2不同時,返回True
Str 當str不是Null 字元時,返回True
-n str 當str的長度大於0時,返回True
-z str 當str的長度是0時,返回True

例如:檔案b.sh如下
#!/bin/bash
A1="abc"
B1="abc"
C1="abcde"
if [ "$A1" = "$B1" ]
then
echo "A1=B1"
fi
if [ "$A1" != "$C1" ]
then
echo "A1<>C1"
fi
if [ -n "$A1" ]
then
echo "$A1 length>0"
fi
輸出結果:
A1=B1
A1<>C1
abc 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/bash
string1=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
輸出結果:
10
teststring
eststring
est
string

數值運算式
  1. 判斷語句

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/bash
int1=3
int2=4
if [ $int1 -eq $int2 ]
then
echo "int1=int2"
else
echo "int1<>int2"
fi

執行結果:
Int1<>int2

複合條件運算式

執行個體:如檔案b.sh
#!/bin/bash
int1=3
int2=4
if [ $int1 -ge 1 ] && [ $int2 -le 7 ]
then
echo "int1>=1 and int2<=7"
fi
if [ $int1 -ge 1 ] || [ $int2 -le 1 ]
then
echo "int1>=1 or int2<=1"
fi

執行結果:
int1>=1 and int2<=7
int1>=1 or int2<=1

流程式控制制 條件轉移 :if 條件陳述式

文法:
if [ 條件 ]
then #符合條件
運算式
else #不符合條件
運算式
fi #結束條件
詳細例子在本文檔中各執行個體中均有介紹

選擇語句case
  1. 選擇比較子,從下面的條件中選擇出一個複合條件的運算式

如檔案:b.sh
#!/bin/bash
a1=2;
case $a1 in
1)
echo "a1=1";;
2)
echo "a1=2";;
esac

執行結果:a1=2

迴圈語句
  1. 以下列出三種常用的迴圈語句的用法,三種程式實現相同功能
  1. For 迴圈
  1. While迴圈
  1. Until迴圈

執行個體:b.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo “$i”
done&

  1.  

執行個體:b.sh
#!/bin/bash
i=1
while [$i –le 5]
do
let “ i += 1 ”
echo “$i”
done

執行個體:b.sh
#!/bin/bash
i=0
until [ $i -eq 5 ]
do
let " i += 1 "
echo "$i"
done

  1. 輸出結果

1
2
3
4
5

  1. 輸出結果

1
2
3
4
5

  1. 輸出結果

1
2
3
4
5

Shell中的函數運用 函式宣告

函式宣告:
Function_name() #聲明函數
{
command #函數的主體,執行的命令;
}

例如:b.sh
#!/bin/bash
testfunction() #函式宣告和處理過程
{
echo "this is a test function"
}
testfunction #函數調用

執行結果:this is a test function

局部變數

函數中的局部變數用local聲明,變數的作用範圍是本函數內部,函數執行完畢後局部變數被刪除;
如下執行個體b.sh
#!/bin/bash
abc=112233 #聲明全域變數abc
localpara() #定義函數
{
local abc=123 #定義局部變數abc,注意區分上面的abc
echo "local para abc is $abc" #輸出局部變數
}
localpara #調用函數,輸出局部變數abc
echo "abc is $abc" #輸出全域變數abc,變數值沒有改變
執行結果:
local para abc is 123
abc is 112233

Shell指令檔的參數

檔案參數
在shell指令碼中使用參數的方法如下:
./b.sh start #start 就是第一個參數

調用方法:
./b.sh test1 輸出結果是:this is runpara1
./b.sh test2 輸出結果是:this is runpara2

特殊的檔案參數
$0 指令碼程式名稱
$n 程式檔案的第n個參數
$* 程式檔案的所有參數
$# 程式檔案參數的個數
$$ 程式檔案執行時的PID

看如下指令檔b.sh
#!/bin/bash
runpara1() #函式宣告
{
echo "this is runpara1"
}

runpara2() ##函式宣告
{
echo "this is runpara2"
}
if [ $# -gt 0 ]
then
echo “para count >0”
fi

case $1 in # $1 代表第一個參數的值
test1) #如果參數是test1就執行函數runpara1
runpara1
;;
test2)
runpara2
;;
esac

函數的參數

如下檔案 b.sh
#!/bin/bash
testfunction () #聲明函數
{
if [ -z "$1" ] #判斷函數是否存在參數($1)
then
echo "no para in function" #無參數處理過程
else
echo "function's paraname is "$1"" #有參數處理過程
fi
}
testfunction start #執行函數,函數的參數是start
執行結果:function’s paraname is start

類型變數 declare 宣告類型變數

declare –r abc=”test string” #聲明abc是唯讀類型
declare –i int1 #聲明int1是整數類型
declare –a arr1 #聲明arr1為陣列變數
declare -f 函數名(可選) #當存在函數名時,只會列出檔案中的名稱是所寫函數的定義,如果不存在函數名,則列出所有函數的聲明

看下面的例子b.sh:
#!/bin/bash
declare -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") #變數類型錯誤
12
4 #顯示的是 12/3的結果
declare -f func1 () #顯示所有函數
{
echo "test function"
}
declare -f func2 ()
{
echo "test function"
}
func1 () #顯示函數func1
{
echo "test function"
}

Shell檔案中的互動功能

程式需要對使用者輸入的字元進行判斷後執行相應的操作
如下面的檔案b.sh
#程式完成的功能是,判斷使用者輸入的名稱,如果使用者輸入的名稱不是zhangwei,就繼續提示輸入,如果使用者輸入了zhangwei,就提示歡迎字元,程式退出;
#!/bin/bash
while :
do
echo -n "please input you name:" #提示使用者輸入
read line #讀取使用者輸入的資料
if [ "$line" = "zhangwei" ] #判斷使用者輸入的資料
then
echo "welcome $line" #顯示歡迎資訊
exit
fi
done

 

轉義(\)

轉義是一種引用單個字元的方法.一個具有特殊含義的字元前邊放上一個轉義符(\)就告訴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/bash
echo "\v\v\v\v" # 列印字串”\v\v\v\v .”
echo -e "\v\v\v\v" #列印4個垂直tab
echo $’\v\v\v\v’ #列印4個垂直tab
echo –e “\101” #列印出A,因為A是101的八進位的ascII
echo \z #輸出 z
echo '\z' #輸出 \z
echo \\z #輸出 \z

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.