一悍汛、什么是shell腳本
Shell腳本與Windows/Dos下的批處理相似丑瞧,也就是用各類命令預先放入到一個文件中蔓纠,方便一次性執(zhí)行的一個程序文件溃槐,主要是方便管理員進行設置或者管理用的。但是它比Windows下的批處理更強大偎肃,比用其他編程程序編輯的程序效率更高煞烫,它使用了Linux/Unix下的命令。
二软棺、命令
- touch hello.sh (在某個目錄下創(chuàng)建hello.sh文件)
- vi hello.sh (進入hello.sh文件并編輯)
- 輸入以下內容:
#!/bin/bash
echo "hello world!"
- 退出編輯并保存
按esc红竭,輸入: 然后輸入wq回車即可保存
- 運行shell腳本,有兩種方式:
方式一:sh hello.sh
方式二:./hello.sh
如果報以下錯誤喘落,修改hello.sh為可讀權限:chmod 777 hello.txt
三茵宪、shell腳本規(guī)則
1.腳本命名格式:
.sh結尾
2.腳本的起始行格式
第一行必須寫 #!/bin/bash
#! 是一個約定的標記,它告訴系統(tǒng)這個腳本需要什么解釋器來執(zhí)行瘦棋,即使用哪一種 Shell稀火。Shell 編程跟 JavaScript、php 編程一樣赌朋,只要有一個能編寫代碼的文本編輯器和一個能解釋執(zhí)行的腳本解釋器就可以了凰狞。
Linux的shell種類眾多篇裁,常見的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
我們關注的是 Bash,也就是 Bourne Again Shell赡若,由于易用和免費达布,Bash 在日常工作中被廣泛使用。同時逾冬,Bash 也是大多數(shù)Linux 系統(tǒng)默認的 Shell黍聂。在一般情況下,人們并不區(qū)分 Bourne Shell 和 Bourne Again Shell身腻,所以产还,像 #!/bin/sh,它同樣也可以改為 #!/bin/bash嘀趟。
#! 告訴系統(tǒng)其后路徑所指定的程序即是解釋此腳本文件的 Shell 程序脐区。
- 變量的規(guī)則
定義變量規(guī)則:
變量名=值
shell定義變量的規(guī)則:
1: 等號兩邊不能有空格
2:定義特殊的變量需要用單引號或者雙引號結合
3:定義linux命令需要用反單引號
區(qū)分單引號和雙引號的不同和相同點
雙引號中有$變量名,輸出的是變量名對應的變量值
單引號中有$變量名她按,輸出的是$變量名
變量名的命名須遵循如下規(guī)則:
- 命名只能使用英文字母牛隅,數(shù)字和下劃線,首個字符不能以數(shù)字開頭酌泰。
- 中間不能有空格倔叼,可以使用下劃線(_)。
- 不能使用標點符號宫莱。
- 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。
- 腳本輸入輸出格式
1:輸入語句用:read -p "描述"
2:Shell輸出值:echo $變量名
#!/bin/bash
#輸出hello world哩罪!---這行是注釋
echo "hello world!"
#由用戶輸入內容并存入變量con中 ---- 這行是注釋
read -p "input content:" con
echo $con //輸出用戶輸入的內容con
注意點:read可以傳遞多個數(shù)據 read –p”name and passwoed”name password
超過的部分都填充在最后一個變量上授霸,輸入的時候兩個數(shù)據使用空格隔開
read -p "input content and name:" con name
echo $con
echo $name
- 腳本的調用
方式1:./腳本名.sh(權限的問題)
方式2: sh 腳本名.sh
- 參數(shù)傳遞
參數(shù)傳遞 :向.sh文件中傳遞數(shù)據
格式: sh 腳本名.sh 參數(shù)
#!/bin/bash
echo "var01:$0";
echo "var02:$1";
echo "count:$#"
- 比較運算符和邏輯運算符******
(1)比較運算符(數(shù)字)
-eq 比較是否相等
-ne 比較不相等
-gt 比較大于
-ge 比較大于等于 >=
-lt 比較小于 <
-le 比較小于等于 <=
#!/bin/bash
if [ 2 -eq 2 ];
then
echo "true"
else
echo "false"
fi
(2)比較運算符(字符串)
== 比較是否相等
!= 比較不相等
加一操作:((i++)) ((i+=1))
加n操作:s=$(($s+$i)) s=$[$s+$i] ((s=$s+$i))
(3)邏輯運算符
-a 邏輯與 -o邏輯或 !邏輯非
-
if語句
格式:
if [ 條件 ]
then
語句
else
語句
fi
注意點:
1: if后面有空格,
2:條件兩邊有空格,
3:if條件里面存在變量,需要$,
4: fi是結束標識
**練習:判斷用戶輸入的用戶名****(name)****和密碼****(password)****是否為********admin 和 123456,如果是則提示登錄
成功(success)际插,否則提示失數舛(fail)**
多條件語句格式;
if [ 條件 ]
then
語句
elif [ 條件 ]
then
語句
......
else
語句
fi
練習:輸入學生的成績,80<score<=100提示very good,60<score<=80提示good,其他則提示不及格
-
case規(guī)則
格式:
case $變量名 in
"值")
語句;;
"值")
語句;;
.....
esac
case ... esac 為多選擇語句框弛,與其他語言中的 switch ... case 語句類似辛辨,是一種多分枝選擇結構,每個 case 分支用右圓括號開始瑟枫,用兩個分號 ;; 表示 break斗搞,即執(zhí)行結束,跳出整個 case ... esac 語句慷妙,esac(就是 case 反過來)作為結束標記僻焚。
可以用 case 語句匹配一個值與一個模式,如果匹配成功膝擂,執(zhí)行相匹配的命令虑啤。
注意:
1:case這第一行以in結尾
2:值可以是字符串也可以是數(shù)字隙弛, 如果數(shù)字范圍[0-9]
3:結束語句;;
4:esac結束標志
練習:輸入一個序號,判斷該用戶選擇哪款產品狞山,A:筆記本 B:手機 C:小臺燈
練習:請輸入對客服的滿意度全闷,【0-3】不滿意,【4-6】滿意萍启,【7-9】非常滿意
-
For循環(huán)
格式:
for 變量 in 列表
do
語句
done
注意1: 結束標志done
擴充:試想列表中的元素過多的時候总珠,需要怎么做?
seq mix step max
注意:mix 開始數(shù)據 step:間隔 max 結束數(shù)據伊约,如果step為1姚淆,可以省略,需要用反單引號
#!/bin/bash
for i in 1 2 3 4 5
do
echo "This value is:$i"
done
- While循環(huán)
while [ 條 件 ]
do
語句
done
注意:
1: while后面有空格,
2:條件兩邊有空格,
3:while條件里面存在變量屡律,需要$,
4:done是結束標識
#!/bin/bash
int=1
while [ $int -le 5 ]
do
echo $int
let "int++"
done
以上實例使用了 Bash let 命令腌逢,它用于執(zhí)行一個或多個表達式,變量計算中不需要加上 $ 來表示變量
練習:求1-100之間的和
4.3 Shell腳本的函數(shù)
4.3.1 定義格式
函數(shù)名(){代碼 }
調用格式
函數(shù)名
注意點:必須先定義一個函數(shù)超埋,然后再調用它
#!/bin/bash
hehe(){
echo "$1"+"$2"
}
hehe 1 4
輸出求和:
echo $(($1+$2))
4.3.2 函數(shù)中的參數(shù)
使用$n來接收數(shù)據
練習:輸入1搏讶,100兩個整數(shù)進行求和運算,并打印結果
練習:輸入任意兩個整數(shù)進行求和運算霍殴,并打印結果
4.3.3 函數(shù)中的返回值
Shell中函數(shù)中默認存在返回值
查看函數(shù)的返回值$媒惕?
注意點:
如果沒有代碼錯誤默認返回值為0
有代碼錯誤返回1
查看返回值內容:$?
#!/bin/bash
function demoFun1(){
echo "這是我的第一個 shell 函數(shù)!"
return `expr 1 + 1`
}
demoFun1
echo $?
function demoFun2(){
echo "這是我的第二個 shell 函數(shù)!"
expr 1 + 1
}
demoFun2
echo $?
demoFun1
echo 在這里插入命令!
echo $?
輸出結果:
這是我的第一個 shell 函數(shù)!
2
這是我的第二個 shell 函數(shù)!
2
0
這是我的第一個 shell 函數(shù)!
在這里插入命令来庭!
0
調用 demoFun2 后妒蔚,函數(shù)最后一條命令 expr 1 + 1 得到的返回值($?值)為 0,意思是這個命令沒有出錯月弛。所有的命令的返回值僅表示其是否出錯肴盏,而不會有其他有含義的結果。
第二次調用 demoFun1 后帽衙,沒有立即查看 ? 的值得到的是 0厉萝,也就是上一條 echo 命令的結果恍飘,而 demoFun1 的返回值被覆蓋了。