概念
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腳本有兩種方法:
- 作爲可執行程序
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