shell基礎命令


一、    變量賦值

(1)    

 

 

(2)   語句給變量賦值

 

 

(3)   只讀變量:使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變

 

 

(4)   刪除變量:使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變

 

 

二、    Shell字符串

(1)    單引號

單引號字符串的限制:

  • 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
  • 單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符后也不行),但可成對出現,作為字符串拼接使用。

 

 

 

(2)    雙引號

雙引號的優點:

  • 雙引號里可以有變量
  • 雙引號里可以出現轉義字符

 

 

(3)    拼接字符串

雙引號

 

單引號

 

 

(4)    獲取字符串長度

 

 

(5)    提取子字符串

 

 

(6)    查找字符串

查找支付b或c的位置(哪個字母先出現就計算哪個)

string="abc123jbc"

echo `expr index "$string" bc`

(注意是反引號”`”)

 

 

三、    Shell數組

(1)    定義數組

在 Shell 中,用括號來表示數組,數組元素用"空格"符號分割開。

 

或者:

 

 

(2)    讀取數組

讀取數組元素值的一般格式是:${數組名[下標]}

 

使用“@”符號可以獲取數組中的所有元素:

 

 

(3)    獲取數組的長度

 

或者

 

 

四、    注釋

(1)    單行注釋

以 # 開頭的行就是注釋,會被解釋器忽略。

 

 

(2)       多行注釋

 

 

五、    傳遞參數

(1)    傳遞參數

以下實例我們向腳本傳遞三個參數,並分別輸出,其中 $0 為執行的文件名:

 

 

(2)    幾個特殊字符用來處理參數:

參數處理

說明

$#

傳遞到腳本的參數個數

$*

以一個單字符串顯示所有向腳本傳遞的參數。
如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。

$$

腳本運行的當前進程ID號

$!

后台運行的最后一個進程的ID號

$@

與$*相同,但是使用時加引號,並在引號中返回每個參數。
如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。

$-

顯示Shell使用的當前選項,與set命令功能相同。

$?

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

 

$* 與 $@ 區別:

相同點:都是引用所有參數。

不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 1、2、3,,則 " * " 等價於 "1 2 3"(傳遞了一個參數),而 "@" 等價於 "1" "2" "3"(傳遞了三個參數)。

 

 

六、    運算符

(1)    算數運算符

原生bash不支持簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。

expr 是一款表達式計算工具,使用它能完成表達式的求值操作。

例如,兩個數相加(注意使用的是反引號 ` 而不是單引號 '):

 

或者

 

或者

 

 

(2)    關系運算符

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

下表列出了常用的關系運算符,假定變量 a 為 10,變量 b 為 20:

運算符

說明

舉例

-eq

檢測兩個數是否相等,相等返回 true。

[ $a -eq $b ] 返回 false。

-ne

檢測兩個數是否不相等,不相等返回 true。

[ $a -ne $b ] 返回 true。

-gt

檢測左邊的數是否大於右邊的,如果是,則返回 true。

[ $a -gt $b ] 返回 false。

-lt

檢測左邊的數是否小於右邊的,如果是,則返回 true。

[ $a -lt $b ] 返回 true。

-ge

檢測左邊的數是否大於等於右邊的,如果是,則返回 true。

[ $a -ge $b ] 返回 false。

-le

檢測左邊的數是否小於等於右邊的,如果是,則返回 true。

[ $a -le $b ] 返回 true。

 

(3)    布爾運算符

下表列出了常用的布爾運算符,假定變量 a 為 10,變量 b 為 20

運算符

說明

舉例

!

非運算,表達式為 true 則返回 false,否則返回 true。

[ ! false ] 返回 true。

-o

或運算,有一個表達式為 true 則返回 true。

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

-a

與運算,兩個表達式都為 true 才返回 true。

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

 

(4)    邏輯運算符

假定變量 a 為 10,變量 b 為 20:

運算符

說明

舉例

&&

邏輯的 AND

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

||

邏輯的 OR

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

 

(5)    字符串運算符

下表列出了常用的字符串運算符,假定變量 a 為 "abc",變量 b 為 "efg":

算符

說明

舉例

=

檢測兩個字符串是否相等,相等返回 true。

[ $a = $b ] 返回 false。

!=

檢測兩個字符串是否相等,不相等返回 true。

[ $a != $b ] 返回 true。

-z

檢測字符串長度是否為0,為0返回 true。

[ -z $a ] 返回 false。

-n

檢測字符串長度是否為0,不為0返回 true。

[ -n "$a" ] 返回 true。

$

檢測字符串是否為空,不為空返回 true。

[ $a ] 返回 true。

 

(6)    文件測試運算符

文件測試運算符用於檢測 Unix 文件的各種屬性。

屬性檢測描述如下:

操作符

說明

舉例

-b file

檢測文件是否是塊設備文件,如果是,則返回 true。

[ -b $file ] 返回 false。

-c file

檢測文件是否是字符設備文件,如果是,則返回 true。

[ -c $file ] 返回 false。

-d file

檢測文件是否是目錄,如果是,則返回 true。

[ -d $file ] 返回 false。

-f file

檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。

[ -f $file ] 返回 true。

-g file

檢測文件是否設置了 SGID 位,如果是,則返回 true。

[ -g $file ] 返回 false。

-k file

檢測文件是否設置了粘着位(Sticky Bit),如果是,則返回 true。

[ -k $file ] 返回 false。

-p file

檢測文件是否是有名管道,如果是,則返回 true。

[ -p $file ] 返回 false。

-u file

檢測文件是否設置了 SUID 位,如果是,則返回 true。

[ -u $file ] 返回 false。

-r file

檢測文件是否可讀,如果是,則返回 true。

[ -r $file ] 返回 true。

-w file

檢測文件是否可寫,如果是,則返回 true。

[ -w $file ] 返回 true。

-x file

檢測文件是否可執行,如果是,則返回 true。

[ -x $file ] 返回 true。

-s file

檢測文件是否為空(文件大小是否大於0),不為空返回 true。

[ -s $file ] 返回 true。

-e file

檢測文件(包括目錄)是否存在,如果是,則返回 true。

[ -e $file ] 返回 true。

 

七、    echo

 

參數說明:

  •  -p 輸入提示文字
  •  -n 輸入字符長度限制(達到6位,自動結束)
  •  -t 輸入限時
  •  -s 隱藏輸入內容

 

 

八、    test 命令

Shell中的 test 命令用於檢查某個條件是否成立,它可以進行數值、字符和文件三個方面的測試。

 

 

九、    流程控制

(1)    if else

if else 語法格式:

if condition

then

    command1

    command2

    ...

    commandN

else

    command

fi

寫成一行(適用於終端命令提示符):

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

(2)    if else-if else

if else-if else 語法格式:

if condition1

then

    command1

elif condition2

then

    command2

else

    commandN

fi

末尾的fi就是if倒過來拼寫,后面還會遇到類似的。

 

以下判斷兩個變量是否相等:

 

 

(3)    for循環

for循環一般格式為:

for var in item1 item2 ... itemN

do

    command1

    command2

    ...

    commandN

done

寫成一行:

for var in item1 item2 ... itemN; do command1; command2… done;

當變量值在列表里,for循環即執行一次所有命令,使用變量名獲取列表中的當前取值。命令可為任何有效的shell命令和語句。in列表可以包含替換、字符串和文件名。

in列表是可選的,如果不用它,for循環使用命令行的位置參數。

 

順序輸出當前列表中的數字:

 

順序輸出字符串中的字符:

 

 

(4)    while循環

while循環用於不斷執行一系列命令,也用於從輸入文件中讀取數據;命令通常為測試條件。其格式為:

while condition

do

    command

done

 

 

使用中使用了 Bash let 命令,它用於執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量,

 

while循環可用於讀取鍵盤信息。下面的例子中,輸入信息被設置為變量FILM,按<Ctrl-D>結束循環。

 

echo '按下 <CTRL-D> 退出'

echo -n '輸入你最喜歡的網站名: '

while read FILM

do

    echo "是的!$FILM 是一個好網站"

done

 

 

(5)    無限循環

無限循環語法格式:

while :
do
    command
done

或者

while true
do
    command
done

或者

for (( ; ; ))

(6)    until 循環

until 循環執行一系列命令直至條件為 true 時停止。

until 循環與 while 循環在處理方式上剛好相反。

一般 while 循環優於 until 循環,但在某些時候—也只是極少數情況下,until 循環更加有用。

until 語法格式:

 

until condition
do
    command
done

 

 

(7)    case

case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。case語句格式如下:

case 值 in

模式1)

    command1

    command2

    ...

    commandN

    ;;

模式2)

    command1

    command2

    ...

    commandN

    ;;

esac

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

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

 

 

(8)    break命令

break命令允許跳出所有循環(終止執行后面的所有循環)。

 

 

(9)    continue命令

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

運行代碼發現,當輸入大於5的數字時,該例中的循環不會結束,語句 echo "游戲結束" 永遠不會被執行。

 

 

(10)   esac

case的語法和C family語言差別很大,它需要一個esac(就是case反過來)作為結束標記,每個case分支用右圓括號,用兩個分號表示break。

十、    函數

linux shell 可以用戶定義函數,然后在shell腳本中可以隨便調用。

shell中函數的定義格式如下:

[ function ] funname [()]

 

{

 

    action;

 

    [return int;]

 

}

 

(1)    帶return函數

 

 

(2)    函數參數

在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...

 

注意,$10 不能獲取第十個參數,獲取第十個參數需要${10}。當n>=10時,需要使用${n}來獲取參數。

 

另外,還有幾個特殊字符用來處理參數:

參數處理

說明

$#

傳遞到腳本的參數個數

$*

以一個單字符串顯示所有向腳本傳遞的參數

$$

腳本運行的當前進程ID號

$!

后台運行的最后一個進程的ID號

$@

與$*相同,但是使用時加引號,並在引號中返回每個參數。

$-

顯示Shell使用的當前選項,與set命令功能相同。

$?

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

 

十一、     輸入/輸出重定向

大多數 UNIX 系統命令從你的終端接受輸入並將所產生的輸出發送回​​到您的終端。一個命令通常從一個叫標准輸入的地方讀取輸入,默認情況下,這恰好是你的終端。同樣,一個命令通常將其輸出寫入到標准輸出,默認情況下,這也是你的終端。

重定向命令列表如下:

命令

說明

command > file

將輸出重定向到 file。

command < file

將輸入重定向到 file。

command >> file

將輸出以追加的方式重定向到 file。

n > file

將文件描述符為 n 的文件重定向到 file。

n >> file

將文件描述符為 n 的文件以追加的方式重定向到 file。

n >& m

將輸出文件 m 和 n 合並。

n <& m

將輸入文件 m 和 n 合並。

<< tag

將開始標記 tag 和結束標記 tag 之間的內容作為輸入。

需要注意的是文件描述符 0 通常是標准輸入(STDIN),1 是標准輸出(STDOUT),2 是標准錯誤輸出(STDERR)。

 

(1)    輸出重定向

重定向一般通過在命令間插入特定的符號來實現。特別的,這些符號的語法如下所示:

command1 > file1

上面這個命令執行command1然后將輸出的內容存入file1。

注意任何file1內的已經存在的內容將被新內容替代。如果要將新內容添加在文件末尾,請使用>>操作符。

 

 

(2)    輸入重定向

和輸出重定向一樣,Unix 命令也可以從文件獲取輸入,語法為:

command1 < file1

這樣,本來需要從鍵盤獲取輸入的命令會轉移到文件讀取內容。

注意:輸出重定向是大於號(>),輸入重定向是小於號(<)。

 

 

注意:上面兩個例子的結果不同:第一個例子,會輸出文件名;第二個不會,因為它僅僅知道從標准輸入讀取內容。

 

 

同時替換輸入和輸出,執行wc,從文件infile讀取內容,然后將輸出寫入到outfile中。

 

十二、     文件包含

和其他語言一樣,Shell 也可以包含外部腳本。這樣可以很方便的封裝一些公用的代碼作為一個獨立的文件。

Shell 文件包含的語法格式如下:

. filename   # 注意點號(.)和文件名中間有一空格

source filename

 

為 test2.sh 添加可執行權限並執行

注:被包含的文件 test1.sh 不需要可執行權限。

 

 參考資料:

https://www.runoob.com/linux/linux-shell.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM