本文為轉(zhuǎn)載哟忍,原文:shell入門學習(1)——語法基礎(chǔ)
介紹
Shell Script
,Shell腳本與Windows/Dos下的批處理相似瑟押,也就是用各類命令預先放入到一個文件中搀捷,方便一次性執(zhí)行的一個程序文件,主要是方便管理員進行設(shè)置或者管理用的勉耀。但是它比Windows下的批處理更強大指煎,比用其他編程程序編輯的程序效率更高,它使用了Linux/Unix下的命令便斥。
Hello World
在學習之前至壤,我們先看個最簡單的hello world的例子,新建helloworld.sh
文件枢纠,編寫以下代碼:
#!/bin/sh
# Athor: Chain
echo "hello world"
在該文件目錄下像街,執(zhí)行以下命令:
./helloworld.sh
若是執(zhí)行*.sh
腳本文件的時候報Permission denied
錯誤,可在該目錄下先執(zhí)行以下命令:
chmod a+x *.sh
代碼解讀
- 第一行
#!/bin/sh
:#!
是一種約定標記, 它可以告訴系統(tǒng)這個腳本需要什么樣的解釋器來執(zhí)行 - 第二行
# Athor: Chain
:#
是用于注釋的標記 - 第三行
echo "hello world"
:輸出hello world
字符串。
變量
Shell Script是一種弱類型語言镰绎,使用變量的時候無需首先聲明其類型脓斩。新的變量會在本地數(shù)據(jù)區(qū)分配內(nèi)存進行存儲,這個變量歸當前的Shell所有畴栖,任何子進程都不能訪問本地變量随静。這些變量與環(huán)境變量不同,環(huán)境變量被存儲在另一內(nèi)存區(qū)吗讶,叫做用戶環(huán)境區(qū)燎猛,這塊內(nèi)存中的變量可以被子進程訪問。變量賦值的方式是:
variable_name=variable_value
注意:等號兩邊不要有空格照皆,否則會報錯的重绷。
如果對一個已經(jīng)有值的變量賦值,新值將取代舊值膜毁。取值的時候要在變量名前加昭卓,variable_name可以在引號中使用,這一點和其他高級語言是明顯不同的瘟滨。如果出現(xiàn)混淆的情況候醒,可以使用花括號來區(qū)分。例如:
#!/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. 整數(shù)比較:
-eq
測試兩個整數(shù)是否相等
-ne
測試兩個整數(shù)是否不等
-gt
測試一個數(shù)是否大于另一個數(shù)
-lt
測試一個數(shù)是否小于另一個數(shù)
-ge
大于或等于
-le
小于或等于
2. 字符串比較:
==
等于 兩邊要有空格
!=
不等
>
大于
<
小于
-z string
當串的長度為0時為真
-n string
當串的長度大于0時為真
3. 文件比較:
-e file
測試文件是否存在
-f file
測試文件是否為普通文件
-d file
測試指定路徑是否為目錄
-r file
測試文件對當前用戶是否可讀
-w file
測試文件對當前用戶是否可寫
-x file
測試文件對當前用戶是都可執(zhí)行
4. 組合測試條件:
-a
: and
-o
: or
!
: 非
示例
實現(xiàn)一個輸入考試分數(shù)昌简,打出評分,規(guī)則如下:
A: 90–100
B: 80–89
C: 70–79
D: 60–69
F: < 60
shell腳本實現(xiàn):
#!/bin/sh
# Author: Chain
# 終端輸入處理
read -p "請輸入您的分數(shù)(0-100):" grade
# 合法性校驗
if [ -z "$grade" ]; then
echo "您沒有輸入分數(shù)"
exit
fi
if [ $grade -gt "100" -o $grade -lt "0" ]; then
echo "您輸入的分數(shù)不在0-100范圍內(nèi)"
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
循環(huán)
for
語法:
for item in …; do
…
done
for (( cond1; cond2; cond3 )) do
…
done
示例:
#!/bin/sh
# Author: Chain
echo "for循環(huán)示例1"
for ((i = 0; i < 5; i++)) do
echo $i
done
echo "for循環(huán)示例2"
for i in $(seq 5); do
echo $i
done
while
語法:
while …; do
…
done
示例:
#!/bin/sh
# Author: Chain
echo "while循環(huán)示例"
i=5
while [ $i -gt 0 ]; do
echo $i
((i--))
done
until
語法:
until …; do
…
done
示例:
#!/bin/sh
# Author: Chain
echo "until循環(huán)示例"
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
函數(shù)
和其他語言一樣策彤,在Shell語言中也有著函數(shù)栓袖。盡管在Shell中函數(shù)并非是必須的編程元素匣摘,但是通過使用函數(shù),可以對程序進行更加好的組織裹刮。將一些相對獨立的代碼變成函數(shù)音榜,可以提高程序的可讀性和重用性。避免重復編寫大量相同的代碼捧弃。
定義:
# 定義函數(shù)格式一:
functionname()
{
…
}
# 定義函數(shù)格式二:
# 函數(shù)名前面多了個function關(guān)鍵字
function functionname()
{
…
}
示例:
#!/bin/sh
# Author: Chain
# function用法示例
#####函數(shù)定義#####
# 注意:所有函數(shù)在使用前必須定義赠叼。這意味著必須將函數(shù)放在腳本開始部分,直至shell解釋器首次發(fā)現(xiàn)它時违霞,才可以使用梅割。
# 無參數(shù)的函數(shù)定義
function hello(){
echo "Hello! "
}
# 有參數(shù)的函數(shù)定義
# $1為參數(shù)
function hello_param(){
echo "Hello $1 !"
}
# 有返回的函數(shù)定義
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))
}
#####函數(shù)調(diào)用#####
echo "無參函數(shù)調(diào)用"
hello
echo "有參函數(shù)調(diào)用"
hello_param Chain
echo "有返回的函數(shù)調(diào)用"
add
# 函數(shù)返回值在調(diào)用該函數(shù)后通過 $? 來獲得
echo "The sum of two numbers is $? !"
# 若函數(shù)與調(diào)用的地方不在同一個文件,在調(diào)用之前需要先加載
# .和文件名中間需要有個空格
# . filename.sh
# 另外葛家,用unset functionname 可以取消載入指定的函數(shù)名
注意
- 執(zhí)行腳本時,所傳參數(shù)只要跟在腳本文件名后即可泌类,用空格隔開癞谒,多個參數(shù)也是用空格隔開,讀取參數(shù)按照傳入?yún)?shù)順序用$1, $2, $3... 讀取即可刃榨。例如:./filename.sh param1 param2
- 調(diào)用有參數(shù)的函數(shù)時弹砚,所傳參數(shù)只要跟在函數(shù)名后即可,用空格隔開枢希,多個參數(shù)也是用空格隔開桌吃,讀取參數(shù)按照傳入?yún)?shù)順序用$1, $2, $3... 讀取即可。例如:function_name param1 param2
完
轉(zhuǎn)載請注明出處
shell入門學習(1)——語法基礎(chǔ)