Shell 腳本編程入門基礎

概念

shell腳本語言就是一門簡單的高級語言,它的文件名是以.sh結尾的

環境

Linux或者Ubuntu都默認安裝了shell解釋器

腳本解釋器

  • sh:即Bourne shell,POSIX(Portable Operating System Interface)標準的shell解釋器,它的二進制文件路徑通常是/bin/sh,由Bell Labs開發。本文講的是sh,如果你使用其它語言用作shell編程,請自行參考相應語言的文檔
  • bash:Bash是Bourne shell的替代品,屬於GNU Project,二進制文件路徑通常是/bin/bash。業界通常混用bash sh 和shell

第一個shell腳本

編寫

打開文本編輯器,新建一個文件,擴展名爲sh,輸入一些代碼,第一行一般是這樣:

#!/bin/bash
#!/usr/bin/php

‘#!’是一個約定的標記,它告訴系統這個腳本需要用什麼解釋器來執行

運行

運行shell腳本有兩種方法:

  1. 作爲可執行程序
chmod +x test.sh
./test.sh

注意,一定要寫成./test.sh,而不是test.sh,運行其他二進制程序也是一樣,直接寫test.sh,linux系統回去PATH裏尋找有木有叫test.sh的,而只有/bin, /sbin 等在path裏,你當前路徑通常不在path裏,所以寫成test.sh是會找不到的,要用./test.sh告訴系統就在當前目錄下找。

2.作爲解釋器參數
這種方式是直接運行解釋器,其參數就是shell腳本的文件名,如:

/bin/sh test.sh
/bin/php test.php

這種方式運行的腳本,不需要在第一行指定解釋器信息,寫了也沒用。

變量

定義變量

定義變量時,變量名不加$符號,變量名和等號之間不能有空格。

My_name='xiaoyi'

使用變量
使用一個定義好的變量,只要在變量名前面加$符號就行了

My_name="xiaoyi"
echo $My_name

變量名外的花括號可加可不加,加花括號是爲了幫助解釋器識別變量的邊界,爲了規範,一般希望大家加

My_name='xiaoyi'
echo ${My_name}

重定義變量
對於已經定義過的變量,可以被重新定義,如:

My_name='xiaoyi'
echo ${My_name}
My_name='meizhen'
echo ${My_name}

註釋
sh中用#進行註釋,sh中沒有多行註釋,只能每行加一個#號

如果在開發過程中,遇到大段的代碼需要臨時註釋起來,過一會兒又取消註釋,怎麼辦呢?每一行加個#符號太費力了,可以把這一段要註釋的代碼用一對花括號括起來,定義成一個函數,沒有地方調用這個函數,這塊代碼就不會執行,達到了和註釋一樣的效果。

字符串

  • 單引號:
str='hello,xiaoyi'

注意:單引號裏的任何字符都會原樣輸出,單引號字符串中的變量是無效,單引號字符串中不能出現單引號。

  • 雙引號:
My_name='xiaoyi'
str="hello ${My_name}"
注意,雙引號中可以有變量,雙引號裏可以有轉義字符

字符串操作

獲取字符串長度

My_name="xiaoyi"
echo ${#My_name}  #輸出6

查找子字符串

string="xiaoyi is cool"
echo `expr index "$string" is` #這個話的意思是找出is在這個string中的位置

條件判斷

if

if condition
then
         conmand1
         conmand2
         conmand3
         ...
         conmandN
fi

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

if `ps -ef | grep ssh`; then echo hello;fi

注意:末尾的fi就是if倒過來寫的,以後還會遇到類似的

is else

if condition
then 
        command1
        command2
        ...
        commandN
else
        command
fi

循環語句

for

for var in item1 item2 ... itemN
do      
        command1
        command2
        command3
        ...
        commandN
done

寫成一行:

for var in  item1 item2 ... itemN;do command;command2... done;

while

while condition
do 
        command
done

until

until condition
do
         command
done

選擇語句

case

case "${opt}" in
        "A")
             command1
        ;;
        "B")
             command2
        ;;
        * ) echo "Bad option, please choose again"
esas

case語法和C語言差別很大,它需要一個esac作爲結束標記,每個case分鐘用右圓括號,用兩個分號表示break.

參考資料
https://github.com/qinjx/30min_guides/blob/master/shell.md
Advanced Bash-Scripting Guide,非常詳細,非常易讀,大量example,既可以當入門教材,也可以當做工具書查閱
Unix Shell Programming
Linux Shell Scripting Tutorial - A Beginner’s handbook

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章