本文為轉載,原文:shell入門學習(1)——語法基礎
介紹
Shell Script
,Shell腳本與Windows/Dos下的批處理相似,也就是用各類命令預先放入到一個文件中,方便一次性執行的一個程序文件,主要是方便管理員進行設置或者管理用的。但是它比Windows下的批處理更強大,比用其他編程程序編輯的程序效率更高,它使用了Linux/Unix下的命令。
Hello World
在學習之前,我們先看個最簡單的hello world的例子,新建helloworld.sh
文件,編寫以下代碼:
#!/bin/sh
# Athor: Chain
echo "hello world"
在該文件目錄下,執行以下命令:
./helloworld.sh
若是執行*.sh
腳本文件的時候報Permission denied
錯誤,可在該目錄下先執行以下命令:
chmod a+x *.sh
代碼解讀
- 第一行
#!/bin/sh
:#!
是一種約定標記, 它可以告訴系統這個腳本需要什么樣的解釋器來執行 - 第二行
# Athor: Chain
:#
是用于注釋的標記 - 第三行
echo "hello world"
:輸出hello world
字符串。
變量
Shell Script是一種弱類型語言,使用變量的時候無需首先聲明其類型。新的變量會在本地數據區分配內存進行存儲,這個變量歸當前的Shell所有,任何子進程都不能訪問本地變量。這些變量與環境變量不同,環境變量被存儲在另一內存區,叫做用戶環境區,這塊內存中的變量可以被子進程訪問。變量賦值的方式是:
variable_name=variable_value
注意:等號兩邊不要有空格,否則會報錯的。
如果對一個已經有值的變量賦值,新值將取代舊值。取值的時候要在變量名前加,variable_name可以在引號中使用,這一點和其他高級語言是明顯不同的。如果出現混淆的情況,可以使用花括號來區分。例如:
#!/bin/sh
# Athor: Chain
str="hello world"
echo $str
echo "shell say $str"
echo "shell say $strs"
echo "shell say ${str}s"
控制流程
條件
if語句
if語句格式
if ...; then
...
elif ...; then
...
else
...
fi
Shell Script中if語句的條件部分要以分號來分隔,若是條件測試的話,需要將條件用[]
包起來,且括號兩邊必須要有空格。
常見的條件測試如下:
1. 整數比較:
-eq
測試兩個整數是否相等
-ne
測試兩個整數是否不等
-gt
測試一個數是否大于另一個數
-lt
測試一個數是否小于另一個數
-ge
大于或等于
-le
小于或等于
2. 字符串比較:
==
等于 兩邊要有空格
!=
不等
>
大于
<
小于
-z string
當串的長度為0時為真
-n string
當串的長度大于0時為真
3. 文件比較:
-e file
測試文件是否存在
-f file
測試文件是否為普通文件
-d file
測試指定路徑是否為目錄
-r file
測試文件對當前用戶是否可讀
-w file
測試文件對當前用戶是否可寫
-x file
測試文件對當前用戶是都可執行
4. 組合測試條件:
-a
: and
-o
: or
!
: 非
示例
實現一個輸入考試分數,打出評分,規則如下:
A: 90–100
B: 80–89
C: 70–79
D: 60–69
F: < 60
shell腳本實現:
#!/bin/sh
# Author: Chain
# 終端輸入處理
read -p "請輸入您的分數(0-100):" grade
# 合法性校驗
if [ -z "$grade" ]; then
echo "您沒有輸入分數"
exit
fi
if [ $grade -gt "100" -o $grade -lt "0" ]; then
echo "您輸入的分數不在0-100范圍內"
exit
fi
# 計算等級
if [ $grade -ge "90" -a $grade -le "100" ]; then
echo "好極了,您的評分為: A"
elif [ $grade -ge "80" -a $grade -le "89" ]; then
echo "很好。您的評分為 B"
elif [ $grade -ge "70" -a $grade -le "79" ]; then
echo "好。您的評分為 C"
elif [ $grade -ge "60" -a $grade -le "69" ]; then
echo "不錯。您的評分為 D"
elif [ $grade -lt "60" ]; then
echo "好吧。您的評分為 E"
fi
循環
for
語法:
for item in …; do
…
done
for (( cond1; cond2; cond3 )) do
…
done
示例:
#!/bin/sh
# Author: Chain
echo "for循環示例1"
for ((i = 0; i < 5; i++)) do
echo $i
done
echo "for循環示例2"
for i in $(seq 5); do
echo $i
done
while
語法:
while …; do
…
done
示例:
#!/bin/sh
# Author: Chain
echo "while循環示例"
i=5
while [ $i -gt 0 ]; do
echo $i
((i--))
done
until
語法:
until …; do
…
done
示例:
#!/bin/sh
# Author: Chain
echo "until循環示例"
i=5
until [ $i -lt 0 ]; do
echo $i
((i--))
done
選擇
case
語法:
case var in
pattern 1 )
… ;;
pattern 2 )
… ;;
*)
… ;;
esac
示例:
#!/bin/sh
# Author: Chain
echo "case示例"
case $1 in
start | begin)
echo "start something";;
stop | end)
echo "stop somethinf";;
restart)
echo "restart something"
;;
*)
echo "Ignorant"
;;
esac
select
Bash提供了一種用于交互式應用的擴展select,用戶可以從一組不同的值中進行選擇。
語法:
select var in …; do
break;
done
示例:
#!/bin/sh
# Author: Chain
select ch in "begin" "end" "exit"; do
case $ch in
"begin")
echo "start something"
;;
"end")
echo "stop something"
;;
"exit")
echo "exit"
break;
;;
*)
echo "Ignorant"
;;
esac
done;
注意:這里交互輸入要輸入1,2,3,而不是beign,end,exit
函數
和其他語言一樣,在Shell語言中也有著函數。盡管在Shell中函數并非是必須的編程元素,但是通過使用函數,可以對程序進行更加好的組織。將一些相對獨立的代碼變成函數,可以提高程序的可讀性和重用性。避免重復編寫大量相同的代碼。
定義:
# 定義函數格式一:
functionname()
{
…
}
# 定義函數格式二:
# 函數名前面多了個function關鍵字
function functionname()
{
…
}
示例:
#!/bin/sh
# Author: Chain
# function用法示例
#####函數定義#####
# 注意:所有函數在使用前必須定義。這意味著必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,才可以使用。
# 無參數的函數定義
function hello(){
echo "Hello! "
}
# 有參數的函數定義
# $1為參數
function hello_param(){
echo "Hello $1 !"
}
# 有返回的函數定義
add(){
echo "The function is to get the sum of two numbers..."
echo -n "Input first number: "
read aNum
echo -n "Input another number: "
read anotherNum
echo "The two numbers are $aNum and $anotherNum !"
return $(($aNum+$anotherNum))
}
#####函數調用#####
echo "無參函數調用"
hello
echo "有參函數調用"
hello_param Chain
echo "有返回的函數調用"
add
# 函數返回值在調用該函數后通過 $? 來獲得
echo "The sum of two numbers is $? !"
# 若函數與調用的地方不在同一個文件,在調用之前需要先加載
# .和文件名中間需要有個空格
# . filename.sh
# 另外,用unset functionname 可以取消載入指定的函數名
注意
- 執行腳本時,所傳參數只要跟在腳本文件名后即可,用空格隔開,多個參數也是用空格隔開,讀取參數按照傳入參數順序用$1, $2, $3... 讀取即可。例如:./filename.sh param1 param2
- 調用有參數的函數時,所傳參數只要跟在函數名后即可,用空格隔開,多個參數也是用空格隔開,讀取參數按照傳入參數順序用$1, $2, $3... 讀取即可。例如:function_name param1 param2
完
轉載請注明出處
shell入門學習(1)——語法基礎