1.基礎(chǔ)示例
說明:第一行是腳本使用的Shell,即/bin/bash路徑的Bash程序。
#!/bin/bash
echo "Hello World"
2.將指定信息存儲(chǔ)到log文件中
#!/bin/bash
echo "Hello World" > log
uname -a >> log
3.參數(shù)
test.sh
#!/bin/bash
echo "第1個(gè)參數(shù) $0"
echo "第2個(gè)參數(shù) $1"
echo "第3個(gè)參數(shù) $2"
echo "第4個(gè)參數(shù) $3"
運(yùn)行:
sh test.sh Hello World
輸出:
第1個(gè)參數(shù) test.sh
第2個(gè)參數(shù) Hello
第3個(gè)參數(shù) World
第4個(gè)參數(shù)
4.腳本返回碼
如果腳本中出現(xiàn)exit
命令,腳本會(huì)在這一行停止并返回返回碼。
test.sh
#!/bin/bash
echo "第1個(gè)參數(shù) $0"
echo "第2個(gè)參數(shù) $1"
exit 1
echo "第3個(gè)參數(shù) $2"
echo "第4個(gè)參數(shù) $3"
運(yùn)行:
sh test.sh Hello World
輸出:
第1個(gè)參數(shù) test.sh
第2個(gè)參數(shù) Hello
運(yùn)行:返回腳本的返回碼
echo $?
輸出:
1
5.函數(shù)
函數(shù)可以實(shí)現(xiàn)程序復(fù)用。一個(gè)函數(shù)可以包含多行腳本命令浸踩,調(diào)用時(shí)執(zhí)行。
#!/bin/bash
function foo() {
echo hello 111
echo hello > log
uname -a >> log
}
foo
函數(shù)傳參數(shù)统求。
#!/bin/bash
function foo() {
echo $1
echo $1 > log
uname -a >> log
}
foo hello
6.跨腳本調(diào)用
使用source命令實(shí)現(xiàn)跨腳本調(diào)用检碗。source命令的作用是在同一個(gè)進(jìn)程中執(zhí)行另一個(gè)文件中的腳本。
下面的示例運(yùn)行main.sh時(shí)码邻,source命令執(zhí)行test.sh文件折剃,所以在后續(xù)使用時(shí)就可以調(diào)用test.sh中的foo函數(shù)。
test.sh
#!/bin/bash
function foo() {
echo $1
echo $1 > log
uname -a >> log
}
main.sh
#!/bin/bash
source test.sh
foo hello
7.邏輯判斷
test命令后跟判斷表達(dá)式像屋,其中-gt
表示大于怕犁,所以3大于2成立,命令的返回代碼是0己莺;
#!/bin/bash
test 3 -gt 2;
echo $?
輸出:
0
-lt
表示小于奏甫,所以3小于2不成立,命令的返回代碼是1凌受;
也可以進(jìn)行文本值判斷扶檐,其中a=b不成立,返回1胁艰;其中a!=b成立,返回0智蝠;
#!/bin/bash
test 3 -lt 2;
echo $?
test a = b;
echo $?
test a != b;
echo $?
輸出:
1
-eq
表示等于
-ne
表示不等于
-ge
表示大于等于
-le
表示小于等于
判斷文件狀態(tài):
文件是否存在:test -e file.out
文件是否存在,而且是普通文件:test -f file.txt
文件是否存在,而且是目錄文件:test -d file
文件是否可讀:test -r file.txt
文件是否可寫:test -w file.txt
文件是否可執(zhí)行:test -x file.txt
連接多個(gè)邏輯判斷
非
:!exp
與
:exp -a exp
或
:exp -o exp
if [[ 3 > 2 && 4 > 2 ]]; then
echo 'success'
fi
//等價(jià)于
if [ 3 -gt 2 -a 4 -gt 2 ]; then
echo 'success'
fi
8.選擇判斷
[]
里邊是判斷表達(dá)式腾么; fi
表示判斷的結(jié)束。
#!/bin/bash
a = "abc"
if [ $a == "root" ]; then
echo 'root'
elif [ $a == "abc" ]; then
echo 'abc'
else
echo ''
fi
//判斷文件是否存在
file = $1
if [ -e $file ]; then
echo '文件存在'
else
echo '文件不存在'
fi
case
判斷杈湾。
語法規(guī)則:
case ${VAR} in
pattern1)
commands1
;;
pattern2)
commands2
;;
esac
示例:
*
代表任何多個(gè)或者0個(gè)普通字符解虱;?
代表任意一個(gè)普通字符;[]
范圍內(nèi)一個(gè)字符漆撞。
#!/bin/bash
VAR="AABB"
case "${VAR}" in
*AB*)
echo "MATCH"
;;
*)
echo "UNMATCH"
;;
esac
輸出:
MATCH
多選一
其中*AB
不匹配殴泰;*BB
匹配。
#!/bin/bash
VAR="AABB"
case "${VAR}" in
AB* | *BB)
echo "MATCH"
;;
*)
echo "UNMATCH"
;;
esac
輸出:
MATCH
9.循環(huán)結(jié)構(gòu)
while
循環(huán)浮驳。
#!/bin/bash
count=0
while [ $count -lt 10]
do
echo "$count"
let count+=1
done
for
循環(huán)悍汛。
命令ls log*將返回所有以log開頭的文件名。循環(huán)時(shí)每個(gè)文件賦值給變量var至会。
#!/bin/bash
for var in `ls log*`
do
rm $var
done
//seq命令生成一個(gè)等差數(shù)列离咐,后邊可以跟三個(gè)參數(shù),第一個(gè)參數(shù)表示整數(shù)數(shù)列的開始數(shù)字,第二個(gè)參數(shù)表示每次增加多少宵蛀,第三個(gè)參數(shù)表示結(jié)束數(shù)字昆著。
total=0
for number in `seq 1 1 100`
do
total=$(( $total + $number ))
done
echo $total
for
循環(huán)數(shù)組:@
表示所有參數(shù)
list=("a" "b" "c")
for i in ${list[@]}
do
echo $i
done
其中可以使用break
和continue
語句。
10.使用sh實(shí)現(xiàn)git自動(dòng)化提交
#!/bin/bash
echo "build environment:$1";
echo "commit :$2";
branch=`git branch | grep "*"` # 獲取分支名
br=${branch:2} # 去除多余的*
echo "branch $br"
msg="$2:default commit"
echo "git autopush start..."
git add .
git commit -m $msg
git push origin $br
echo "git autopush end..."