Shell指令碼學習

2022-09-22 21:51:24 字數 4028 閱讀 8719

shell指令碼學習

shell就是命令解析器,將使用者輸入的指令轉換為相應的機器能夠執行的程式。

shell是乙個作為使用者與linux系統間介面的程式,它允許使用者向作業系統輸入需要執行的命令,在linux中可有多種shell。

一:shell的種類:

ash:是貝爾實驗室開發的shell,bsh是對ash的符號鏈結。

bash:是gnu的bourne again shell,是gnu作業系統上預設的shell。sh以及bash2都是對它的符號鏈結。

tcsh:是berkeley unix c shell。csh是對它的符號鏈結

二:shell命令

shell命令的基本格式是:

命令名 [選項] 引數1> 引數2> ……

shell提示符 :# $

gnu工具中的bash,作為/bin/sh被預設安裝

大多數linux發行版中,shell程式/bin/sh實際上是對程式/bin/bash的乙個鏈結

命令/bin/sh -version可用於檢視bash的版本。

三:shell指令碼

shell指令碼是乙個包含一系列命令序列的文字檔案。當執行這個指令碼檔案時,檔案中包含的命令序列將得到執行。

shell指令碼的第一行必須是如下格式:

#!/bin/sh

符號#!用來指定該指令碼檔案的解析程式。在上面 例子中使用/bin/sh來解析該指令碼。當編輯好指令碼後,如果要執行該指令碼,還必須使其具有可執行屬性:chmod +x filename。

在進行shell程式設計時,以#開頭的句子表示注釋,直到這一行的結束。如果使用了注釋,即使相當長的時間內沒有使用該指令碼,也能在很短的時間內明白該指令碼的作用及工作原理。

shell指令碼的執行:sh hello.sh(假設有乙個hello.sh的指令碼)。

變數:在shell程式設計中,所有的變數都由字串組成,並且不需要預先對變數進行宣告,

#!/bin/sh

#set variable a

a=8#print a

echo "a is:"

echo $a

注意思考:

例子1:

a=8echo $abc 輸出啥?為什麼?

a=8echo $bc 輸出啥?為什麼?

例子2:

a=8echo 「$a」 輸出啥?為什麼?

a=8echo 『$a』 輸出啥?為什麼?

「$a」會被解析為變數,輸出8,『$a』輸出$a;

預設變數:

$# :傳入指令碼的命令列引數個數

$* :所有命令列引數值,在各個引數值之間留有空格

$0 :命令本身(shell檔名)

$1 :第乙個命令列引數

$2 :第二個命令列引數

區域性變數:

在變數首次被賦值時加上 local 關鍵字

1.變數賦值時,「=」左右兩邊都不能有空格

2.bash 中的語句結尾不需要分號

if語句

if [expression ]

then

#code block

fiif [expression ]

then

#code block

else

#code block

fiif [ expression ]

then

#code block

elif [ expression ]

then

#code block

else

#code block

fiif [ expression ]; then

#code block

elif [ expression]; then

#code block

else

#code block

fi比較:

比較操作整數操作 字串操作

相同-eq=

不同-ne !=

大於-gt>

小於-lt<

大於或等於 -ge

小於或等於 -le

為空-z

不為空-n

比較整數a和b是否相等:if [ $a = $b ] (也可用eq)

判斷整數a是否大於整數b:if [ $a -gt $b ]

比較字串a和b是否相等:if [ $a = $b ]

判斷字串a是否為空: if [ -z $a ]

判斷整數變數a是否大於b:if [ $a -gt $b ]

1. 在「[」和「]」符號的左右都留有空格

2. 「=」左右都有空格

-e檔案已經存在

-f檔案是普通檔案

-s檔案大小不為零

-d檔案是乙個目錄

-r檔案對當前使用者可以讀取

-w檔案對當前使用者可以寫入

-x檔案對當前使用者可以執行

例s5:

#!/bin/sh

folder=/home

[ -r "$folder" ] && echo 「can read $folder"

[ -f "$folder" ] || echo "this is not file"

for迴圈

for 迴圈結構與 c 語言中有所不同,在 bash 中for迴圈的基本結構是:

for var in [list]

do#code block

done

其 中 $var 是迴圈控制變數,[list] 是 var 需要遍歷的一 個集合,do/done 對包含了迴圈體,相當於c語言中的一對大括號。另外如果do 和 for 被寫在同一行,必須在 do 前面加上 「;」。如:

for $var in [list]; do...done

#!/bin/bash

for day in sun mon tue wed thu fri sat

doecho $day

done

如果列表被包含在一對雙引號中,則被認為是乙個元素,如:

#!/bin/bash

for day in "sun mon tue wed thu fri sat "

do echo $day done

上面的例子中,在 for所在那行,變數 day 是沒有加 "$"符號的,而在迴圈體內,echo 所在行變數$day是必須加上"$"符號的。

while迴圈

while 迴圈的基本結構是:

while [ condition ]

do#code block

done

untill迴圈

until 迴圈的基本結構是:

until [ condition ]

do#code block

done

while 和 until的區別在於while是為真時執行,until是為假時執行

case語句

bash 中的 case 結構與 c 語言中的 switch 語句的功能比較類似,可以用於進行多項分支控制。

case "$var" in

condition1 )

condition2 )

default statments;;

esac

例子:#!/bin/bash

echo "hit a key, then hit return.「

read keypress

case "$keypress" in

[[:upper:]] )echo" uppercase letter";;

[[:lower:]] )echo" lowercase letter";;

[0-9] )echo"digit";;

* ) echo "punctuation, whitespace, or other";;

esac

bash shell的功能

1.命令記憶能力

2.使用tab鍵進行命令與檔案的補全功能

3.設定命令的別名(eg:alias lm=』ls -l』)

4.作業控制、前台、後台控制

5.程式指令碼(shell script)

6.支援萬用字元

shell 指令碼學習

case var in pattern statement esac case 的指令碼語法是雙分號結尾的。sed e s i.86 i386 查詢替換。sed 流編輯器 將輸入流中的i.86替換成i386。是個萬用字元。輸入流的形式可能是 管道,檔案。shell d mkdir p 指令碼的條件執...

shell指令碼學習

shell 學習 1.shell 解釋型語言,有很多種直譯器。預設是 bin bash。shell指令碼第一行要寫 bin bash 2.shell指令碼執行的方法 1 sh sh 2 chmod a x sh sh 注意,一定要寫成.sh,而不是 sh。執行其它二進位制的程式也一樣,直接寫 sh,...

shell指令碼學習

反引號 反引號是命令替換,命令替換是指shell可以先執行中的命令,將輸出結果暫時儲存,在適當的地方輸出。語法 command 反引號是tab鍵的上乙個按鍵 重定向 如果檔案不存在,將建立新的檔案,並將資料送至此檔案 如果檔案存在,則將資料新增在檔案後面 如果檔案不存在,同上,如果檔案存在,先將檔案...