shell的基礎語法和常用指令碼

2021-10-07 10:13:55 字數 4490 閱讀 1837

shell 是乙個用 c 語言編寫的程式,它是使用者使用 linux 的橋梁。shell 既是一種命令語言,又是一種程式語言。

shell 是指一種應用程式,這個應用程式提供了乙個介面,使用者通過這個介面訪問作業系統核心的服務。

linux 的 shell 種類眾多,常見的有:

bourne shell(/usr/bin/sh或/bin/sh)

bourne again shell(/bin/bash)

c shell(/usr/bin/csh)

k shell(/usr/bin/ksh)

shell for root(/sbin/sh)

本文關注的是 bash,也就是 bourne again shell,由於易用和免費,bash 在日常工作中被廣泛使用。同時,bash 也是大多數linux 系統預設的 shell。

新建乙個檔案,test.sh,擴充套件名為sh,代表shell

檔案第一行格式#!/bin/bash

#!是乙個約定的標記,它告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種 shell。

1,作為可執行程式,

將上面的**儲存為 test.sh,並 cd 到相應目錄:

chmod +x .

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

./test.sh #執行指令碼

2,作為直譯器引數

直接執行直譯器,其引數就是shell指令碼的檔名,如

/bin/bash test.sh
這種方式執行的指令碼,就不需要在第一行指定直譯器資訊,寫了也不作數

定義變數:

var="abc"

#變數名和等號之間不能有空格

除了直接賦值,也可以用語句給變數賦值,如

for file in `ls

/etc` #將/etc下目錄的檔名迴圈出來

使用變數:

在變數名前加美元符即可$,把變數名用大括號括起來(這個適當情況可以省略)

echo $

var#這裡不能省略

可以設定唯讀變數

#!/bin/bash

var="iphone6s"

readonly var

#唯讀

刪除變數

unset var

#刪除

shell字串

單引號, 原樣輸出,變數在裡面是無效的

雙引號,可以有變數,可以出現轉義字元

shell支援陣列,用空格分開

陣列名=(值1 值2 .

.. 值n)

可以不使用連續的下標,而且下標的範圍沒有限制。

讀取陣列:

$

listone=$

使用@符號,可以獲取陣列中的全部元素

echo $
獲取陣列長度和字串長度:(名字前加**#** 號)

length=$
1,$n

n是乙個數字,從1開始,代表第幾個傳進來的引數,如$1代表第乙個傳進來的引數

$0,代表在執行的檔名

2,特殊字元

引數處理 說明

$#, 傳遞到指令碼的引數個數

$*, 以乙個單字串顯示所有向指令碼傳遞的引數。

如"$*「用「」」括起來的情況、以"$1 $2 … $n"的形式輸出所有引數。

$$指令碼執行的當前程序id號

$!後台執行的最後乙個程序的id號

$?顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。

1,基本運算

expr是乙個表示式計算工具,表示式要被反引號``包含,表示式和運算子之間要有空格

#!/bin/bash

var=`expr 2 + 2`

echo

"兩數之和為 : $var"

2,算數運算子

表示式要放在方括號中間,而且要有空格

如:[ $a == $b ]

3,關係運算子

表示式要放在方括號中間,而且要有空格

-eq 等於

-ne 不等於

-gt 大於

-lt 小於

-ge 大於等於

-le 小於等於

#!/bin/bash

a=10

b=20if[

$a-eq$b]

then

echo

" a 等於 b"

else

echo

" a 不等於 b"

fi

1,if_ifelse_else格式

if condition1

then

command1

elif condition2

then

command2

else

commandn

fi

2,for迴圈

for

var in item1 item2 .

.. itemn

do command1

command2

...commandn

done

還有一種

for

((a=1;a<=5;a++))

docommand...

done

3,while語句

#!/bin/bash

int=1

while((

$int

<=5 ))do

echo

$int

let "int++"

done

4,case語句

case 值 in

模式1)

command1

;;模式2)

command1

;;*)echo

"包含所有的意外情況";;

esac

5,break和continue

break命令允許跳出所有迴圈(終止執行後面的所有迴圈)。

continue命令不會跳出所有迴圈,僅僅跳出當前迴圈。

1,tomcat啟動指令碼

[root@promote tmp]

# vi tomcatstart.sh //建立乙個shell指令碼檔案

#!/bin/bash

#開啟tomcat

start()

close(

)case $1 in #根據第乙個輸入的引數,進行流程控制

start

)start;;

close)

close

;;*)echo

"please put start or close";;

esac

儲存退出之後開始測試

[root@promote tmp]

# chmod +x tomcatstart.sh #賦權

[root@promote tmp]

# ./tomcatstart.sh

please put start or close

[root@promote tmp]

# ./tomcatstart.sh start

using catalina_base: /opt/apache-tomcat-8.5.45

using catalina_home: /opt/apache-tomcat-8.5.45

using catalina_tmpdir: /opt/apache-tomcat-8.5.45/temp

using jre_home: /opt/jdk1.8.0_221/jre

using classpath: /opt/apache-tomcat-8.5.45/bin/bootstrap.jar:/opt/apache-tomcat-8.5.45/bin/tomcat-juli.jar

tomcat started.

#啟動成功

shell 指令碼基礎語法

這句一般在 shell 指令碼的第一行。告訴作業系統,此指令碼的直譯器為 bin sh 這個可執行檔案。類似地,如果你的指令碼用 bash,ksh,解釋,第一行就應該是 bin bash bin ksh 注意 shell 指令碼對空格要求十分嚴格,關鍵字和符號之間必須加空格。1 字串判斷 str1 ...

Shell指令碼語法基礎

shell是linux下的乙個命令解析器,把一系列的命令序列寫入文字檔案就構成了shell指令碼 類似於windows中的批處理 bin sh echo something echo hello world echo hello mkdir tnt 符號 用來指定該指令碼檔案的解析程式。在上面例子中...

shell指令碼基礎 語法

一 變數 root t foot home2 zzz01 a hello root t foot home2 zzz01 echo a hello root t foot home2 zzz01 echo world hello world 其實 a和 作用相同,但是為了防止字串在拼接時,計算機無法...