1. 程式人生 > >一天學會shell語言,shell教程,shell簡單入門,shell中文文件

一天學會shell語言,shell教程,shell簡單入門,shell中文文件

    shell語言是一門linux系統下的工具語言,主要用於寫一些linux系統下的操作命令,實際上Shell是一個命令直譯器,它解釋由使用者輸入的命令並且把它們送到核心。或者直接理解為shell命令是可以執行多個linux命令的指令碼。    shell並不複雜,有程式設計基礎的話,簡單入門兩三個小時就可以入門,可以嘗試把目前一些重複操作的linux命令寫成shell指令碼來執行一下。

    本片文章將通過8個方面來講解shell,在編寫指令碼的時候也可以把他當成是中文文件來查詢。這八個方面分別是:1,直譯器和執行shell 2,變數 3,引數傳遞 4,運算子 5,常見命令(echo printf test expr等) 6,流程控制與語法 7,函式 8,檔案包含。每一個部分我都會用表格的形式來總結出必要的知識點以便查閱。

一 直譯器與執行shell

用法和說明

直譯器

#!bin/sh   Bourne shell版本

#!bin/bash Bourne Again Shell 版本

執行shell

chomd +x ./test.sh #使指令碼具有執行許可權

./test.sh #執行指令碼 “./”表示當前目錄下

二 變數

1、基本操作

操作

用法

舉例

說明

1 定義

變數名 = 變數值

variable_name=”abc”

無需說明資料型別,如果是數字直接寫數字1,1.1等等,如果是字串用雙引號或單引號括起來,如果是陣列就用()擴起來。不能用陣列開頭,不能有空格和標點符號,不能使用關鍵字。

2 使用

$ variable_name 或${ variable_name }

$ variable_name

${ variable_name }

大括號可以幫助直譯器識別邊界

3 只讀

readonly variable_name

readonly variable_name

readonly 關鍵字,使用後無法修改

4 刪除

unset variable_name

unset variable_name

Unset關鍵字,使用後變數不能再被引用

2、字串

1 拼接字串

直接按照變數引用方式引用,不需要加“+”號

a = “name”

b = “hello ${a}!”

必須使用{}用來識別邊界

2 獲取字串長度

“#”可以直接獲取長度

a = “abcd”

echo ${#a}

#符號是shell中用來判斷長度的符號,後面你會發先所有和長度有關的都用“#”來判斷

3 查詢子字串

Index用來查詢子字串,返回子字串開始的位置。

string = “hello world !”

Echo ` expr index “$string”  world `

“`”是反引號,不是單引號,在tab鍵上邊,expr 關鍵字是說明將後邊的內容當作表示式執行。

3、陣列

1 定義

用“()”括起來,元素之間用空格隔開

array = (val0 val1 val2 … )

陣列中的元素可以是多種型別,數字,字串,變數。都可以

2 引用

還是用$來引用

引用某一個元素

${array[n]}

n是元素的位置,從0開始

3 獲取所有元素

遍歷所有元素用@符號

${[email protected]]}

@符號用來遍歷所有元素,shell中許多遍歷所有內容,都會用@符號

4 獲取陣列長度

長度獲取用#

length = ${#array[@]}

length = ${#array[*]}

*符號和@用法相似也可以用來表示所有。

5 獲取單個元素長度

長度獲取用#

length = ${#array[n]}

n表示元素位置,從0開始

三 引數傳遞

操作

用法

舉例

說明

1、基本用法

引數傳遞

Shell可以不需要形參直接傳遞引數,引數之間用空格隔開

$ chmod +x text.sh

$ ./text.sh para1 para2 para3

引數之間用空格隔開,沒有限制想傳多少引數傳多少

1 引數獲取

$ + 數字

Para1 = $ 0 獲取第一個引數

$+數字直接獲取對應位置的引數

2 引數個數獲取

$ #

$ #

獲取傳遞到指令碼的引數個數

3 遍歷引數

$ * $ @

$ *或$ @

將所有引數以一個字串顯示出來

4 獲取當前執行指令碼ID

$ $

$ $

獲取當前執行指令碼ID

5 獲取後臺最後執行指令碼的ID

$ !

獲取後臺最後執行指令碼的ID

6 顯示選項

$ -

$ -

顯示shell使用的當前選項,與set命令相同

7 顯示推出狀態

$ ?

$ ?

顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤

四 運算子

操作

用法

舉例

說明

1、expr

表示式計算工具

必須用“·”反引號括起來

val=`expr 2+2`

expr 說明後面的表示式可以用運算子計算結果。

2、基本運算子

+ - * / % = == !=

與expr一起使用

val=`expr 2+2`

= 賦值

== 等於

3、關係運算符

1 是否相等

-eq

[ $a -eq $b ] 返回 false

關係運算符只支援數字,不支援字串,除非字串的值是數字。

2 是否不等

-ne

[ $a -ne $b ] 返回 true

3 是否大於

-gt

[ $a -gt $b ] 返回 false

4 是否小於

-lt

[ $a -lt $b ] 返回 true

5 是否大於等於

-ge

[ $a -ge $b ] 返回 false

6 是否小於等於

-le

[ $a -le $b ] 返回 true

4、布林運算子

1 非

!

[ ! false ] 返回 true

表示式通常寫在 [ ] 中括號內。

2 或

-o

[ $a -lt 20 -o $b -gt 100 ] 返回 true

3 與

-a

[ $a -lt 20 -a $b -gt 100 ] 返回 false

5、邏輯運算子

1 與

&&

[[ $a -lt 100 && $b -gt 100 ]] 返回 false

邏輯運算子表示式通常在 [[ ]]  雙中括號內。

2 或

||

[[ $a -lt 100 || $b -gt 100 ]] 返回 true

6、字串運算子

1 相等

=

[ $a = $b ] 返回 false

假定變數 a 為 "abc",變數 b 為 "efg"

2 不等

!=

[ $a != $b ] 返回 true

3 長度是否為0

-z

[ -z $a ] 返回 false

4 長度是否不為 0

-n

[ -n "$a" ] 返回 true

5 是否為空

string直接引用

[ $a ] 返回 true

7、檔案測試運算子

1是否是塊裝置檔案

-b file

[ -b $file ] 返回 false

file="/var/www/runoob/test.sh",它的大小為100位元組,具有 rwx 許可權

2是否是字元裝置檔案

-c file

[ -c $file ] 返回 false

3是否是目錄

-d file

[ -d $file ] 返回 false

4是否是普通檔案(既不是目錄,也不是裝置檔案)

-f file

[ -f $file ] 返回 true

5是否設定了 SGID 位

-g file

[ -g $file ] 返回 false

6是否設定了粘著位(Sticky Bit)

-k file

[ -k $file ] 返回 false

7是否是有名管道

-p file

[ -p $file ] 返回 false

8是否設定了SUID

-u file

[ -u $file ] 返回 false

9 是否可讀

-r file

[ -r $file ] 返回 true

10是否可寫

-w file

[ -w $file ] 返回 true

11是否可執行

-x file

[ -x $file ] 返回 true

12是否為空(檔案大小是否大於0)

-s file

[ -s $file ] 返回 true

13檔案(包括目錄)是否存在

-e file

[ -e $file ] 返回 true

五 常見命令(echo printf test expr)

操作

用法

舉例

說明

1、echo

用來顯示字串

echo

-e 開啟轉義

echo -e “ok! \n”

\n 表示換行

Echo -e “ok! \c”

\c 表示不換行

用於一般的字串輸出

2 printf

用來列印輸出

printf

printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234

“-”表示左對齊,沒有表示右對齊,10表示字元寬度,s表示顯示字串,4.2f表示4位float數字保留兩位小數。

3 test

檢查某個條件是否成立

test

If test -e ./bush

then

  echo “檔案存在”

else

  echo “檔案不存在”

fi

Test和“[ ]”用法相似

4 expr

表示式計算工具

expr `表示式`

a = expr `2+2`

expr 說明後面的表示式可以用運算子計算結果。

六 流程控制和語法

操作

用法

舉例

說明

1 If

If語句

If condition

 Then

command1

fi

a=10

b=20

if [ $a == $b ]

then

   echo "a 等於 b"

elif [ $a -gt $b ]

then

   echo "a 大於 b"

elif [ $a -lt $b ]

then

   echo "a 小於 b"

else

   echo "沒有符合的條件"

fi

Shell的流程控制通常會有結束語句,一般為倒寫關鍵字

If else語句

If condition

 Then

command1

else

  command2

fi

If  elif else

if condition1 then  

  command1

elif

condition2  then    

command2

else 

commandN

fi

2 for

for in

do

done

for var in item1 item2 ... itemN

do

    command1

    command2

    ...

    commandN

done

for loop in 1 2 3 4 5

do

    echo "The value is: $loop"

done

關鍵字in代表迴圈條件,同樣也有結束語句關鍵字done

3 while

while

do

down

while condition

do

    command

done

int=1

while(( $int<=5 ))

do    

echo $int

let "int++"

done

While 後面條件為空

while :

或者條件為true時

while true

4 until

until

do

done

until condition

do

    command

done

a=0

until [ ! $a -lt 10 ]

do

   echo $a

   a=`expr $a + 1`

done

until 也是迴圈控制語句,不過條件返回為true時才停止迴圈

5 case

case in

模式1)

模式2)

esac

case 值 in

模式1)

command1

command2

    ...

commandN

    ;;

模式2)

command1 command2

    ...

commandN;

esac

echo '輸入 1 到 4 之間的數字:'

echo '你輸入的數字為:' read aNum

case $aNum in    

1) echo '你選擇了 1'

2) echo '你選擇了 2'

3) echo '你選擇了 3'

4) echo '你選擇了 4'

*) echo '你沒有輸入 1 到 4 之間的數字';

esac

取值後面必須為單詞in,每一模式必須以右括號結束。取值可以為變數或常數。匹配發現取值符合某一模式後,其間所有命令開始執行直至 ;;。

取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令後不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行後面的命令。

6 break

跳出所有迴圈,終止後面所有的操作。

break

while : do    

echo -n "輸入 1 到 5 之間的數字:"    

read aNum    

case $aNum in         1|2|3|4|5) echo "你輸入的數字為 $aNum!";         *) echo "你輸入的數字不是 1 到 5 之間的! 遊戲結束"              break         ;;     esac done

break,從這裡開始中止後邊所有的迴圈操作。

7 continue

跳出本次迴圈,進入下一個迴圈條件

continue

while :

do  

echo -n "輸入 1 到 5 之間的數字: "

read aNum   

case $aNum in         1|2|3|4|5) echo "你輸入的數字為 $aNum!"         ;;         *) echo "你輸入的數字不是 1 到 5 之間的!"             continue             echo "遊戲結束"         ;;     esac done

continue命令與break命令類似,只有一點差別,它不會跳出所有迴圈,僅僅跳出當前迴圈

七 函式

1 函式

[function] funname [()]

{

    action;

[return int;]

}

“[ ]”方括號中的是可選選項,可以寫也可以不寫。如果不加return 函式還是會返回最後一條的命令結果的。

[function] funname [()]

{

    action;

    [return int;]

demoFun(){

    echo "這是我的第一個 shell 函式!"

}

echo "-----函式開始執行-----"

demoFun

echo "-----函式執行完畢-----"

1、可以帶function fun() 定義,也可以直接fun() 定義,不帶任何引數。

2、引數返回,可以顯示加:return 返回,如果不加,將以最後一條命令執行結果,作為返回值。 return後跟數值n(0-255

八 檔案包含

1 檔案包含

. filename  

# 注意點號(.)和檔名中間有一空格  或

source filename

. filename  

source filename

#使用 . 號來引用test1.sh 檔案

. ./test1.sh

# 或者使用以下包含檔案程式碼

# source ./test1.sh

和java引入類,python匯入模組差不多。Shell也可以引入檔案直接使用被引入檔案中的變數和函式。

shell其實也就這八大知識點吧,我覺得。文章中也可能有錯誤或者不妥的地方歡迎留言指出,另外不同的人可能有不同的見解,也有可能是六個知識點,十個知識點,但這篇文章只是自己總結的看法。吐舌頭