前言 日常用Python多一些,不過很多時候shell腳本更簡單實用一些,所以有必要熟悉一下shell腳本。當然shell有他特定的一些場景,比方說我曾經改過一個vpn斷線自動重連的 "腳本" ,簡單實用。 另: 本文比較簡單,算是入門簡述,類似於30分鐘入門的東西,想詳細看的可以去搜其他文章,很多 ...
前言
日常用Python多一些,不過很多時候shell腳本更簡單實用一些,所以有必要熟悉一下shell腳本。當然shell有他特定的一些場景,比方說我曾經改過一個vpn斷線自動重連的腳本,簡單實用。
另:本文比較簡單,算是入門簡述,類似於30分鐘入門的東西,想詳細看的可以去搜其他文章,很多~
註釋
這個比較簡單,和很多語言都一樣,#
後面的就是註釋,代表本行是註釋,執行的時候會被忽略,沒有多行註釋。
註:
- 如果在開發過程中,遇到大段的代碼需要臨時註釋起來,過一會兒又取消註釋,怎麼辦呢?每一行加個#符號太費力了,可以把這一段要註釋的代碼用一對花括弧括起來,定義成一個函數,沒有地方調用這個函數,這塊代碼就不會執行,達到了和註釋一樣的效果。
- vim里有更簡單的操作 - -
變數
變數的定義
- 首個字元必須為字母(a-z,A-Z)。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。
- 使用等號賦值,變數名和等號之間不能有空格
如:
name="wang"
使用變數
變數名前面加$
即可,同時推薦給變數名加花括弧(可選,部分場景下必選),例如(註意最後兩行,如果不加花括弧會導致系統認為firstNamewang是一個變數):
echo $name
read firstName
echo "firstName=$firstName"
echo "firstNmae=${firstName}"
echo "name=$fistNamewang"
echo "name=${firstName}Wang"
其他操作
- 只讀變數,變數前加
readonly
,如readonly name
,此操作後不得再重新賦值 - 刪除變數,
unset name
,此語句後不得再使用此變數 - 讀取輸入,見上面使用變數處
read firstName
,此處即為獲取標準輸入 - 一些轉義字元,使用
echo -e xxx
可以轉義成功
特殊變數
變數名 | 含義 |
---|---|
$0 | 當前腳本的文件名 |
$n | 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。 |
$# | 傳遞給腳本或函數的參數個數。 |
$* | 傳遞給腳本或函數的所有參數。 |
$@ | 傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同 |
$? | 上個命令的退出狀態,或函數的返回值。 |
$$ | 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。 |
PS: $* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。
但是當它們被雙引號(" ")包含時,"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數。
字元串
單引號,雙引號
單引號里字元串原樣輸出,也就是說轉義和變數名都是無效的,同時單引號里不能有單引號,雙引號則不會。所以推薦雙引號就可以了。
獲取長度
string='abcd'
echo ${#string} #輸出 4
數組
定義
小括弧代表數組,使用空格來間隔,不支持多維數據,下標從0開始,如:
person=(name1 name2 name3)
persons = (
name1
name2
name3
)
people[0]='xxx'
people[1]='xxxx'
獲取長度
獲取長度,與獲取字元串長度一樣:
length=${#array_name[@]}
length=${#array_name[*]}
lengthn=${#array_name[n]}
echo命令
一般的使用沒什麼可說的,說幾個特殊的:
- 顯示結果重定向到文件,
echo "xxx" > file_name
- 執行命令,
date
if else
if [ expression ]
then
Statement(s) to be executed if expression is true
fi
if [ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi
if [ expression 1 ]
then
Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
Statement(s) to be executed if expression 3 is true
else
Statement(s) to be executed if no expression is true
fi
for
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
while
while command
do
Statement(s) to be executed if command is true
done
跳出迴圈
break 和 continue,和c語言中的用法一樣
函數
定義函數
有兩種定義方式,如下:
function_name () {
list of commands
[ return value ]
}
function function_name () {
list of commands
[ return value ]
}
調用函數
只寫函數名字就可以,不用寫括弧。
參數
在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數…
文件包含
. filename (點和名字之間有空格)
或者
source filename
ref
http://c.biancheng.net/cpp/shell/