SHELL編程基礎(chǔ)
三小時(shí)光速入門
因?yàn)榧杭軜?gòu)會(huì)用到shell編程基礎(chǔ),提前講一丟丟。
shell編程
1. 為什么學(xué)shell編程?
Linux系統(tǒng)中大量的使用shell,工作中需要自動(dòng)化實(shí)現(xiàn)業(yè)務(wù)。例:每天晚上自動(dòng)備份、監(jiān)控CPU、批量安裝、自動(dòng)安裝服務(wù)。你就需要shell
shell編程是linux運(yùn)維人員必須要會(huì)的編程語(yǔ)言,最簡(jiǎn)單的編程語(yǔ)言。(沒(méi)有之一)
編程也是運(yùn)維人員必須具備本領(lǐng)
shell 、python 編程也是運(yùn)維人員必須具備本領(lǐng),特別是高級(jí)運(yùn)維人員
2. 什么是shell?
shell是一個(gè)解釋器,命令行的命令以及腳本都會(huì)通過(guò)shell進(jìn)行解釋,傳給操作系統(tǒng),處理后輸出給用戶
bin/bash 創(chuàng)建用戶時(shí)系統(tǒng)指定的翻譯官
3. shell分類
1、bourne shell
2、C shell
[root@oldboyedu ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
4. c7 :默認(rèn)shell
[root@oldboyedu ~]# echo $SHELL
/bin/bash
5. 什么是shell 腳本
一般我們會(huì)把程序、命令放入文件里執(zhí)行,這個(gè)文件我們就稱為shell腳本
工作中最多的編程寫(xiě)腳本,存放在文件里
6. shell 變量
a. 全局變量(環(huán)境變量)
在整個(gè)系統(tǒng)中生效、一般是大寫(xiě)、系統(tǒng)中會(huì)默認(rèn)存在一些這樣的變量,用于滿足系統(tǒng)和程序運(yùn)行的需求
[root@oldboyedu ~]# echo $PS1
[\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\] \[\e[31;1m\]\w\[\e[0m\]]\$
[root@oldboyedu ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
自定義環(huán)境變量:
方法1
export OLDBOY="I am oldboy"
方法2
OLDBOY="I am oldboy"
export OLDBOY
永久生效:
/etc/peofile會(huì)被/.bash_profilef會(huì)被/.banshrc會(huì)被/etc/bashrc覆蓋
把變量放到上述文件里
安裝JAVA服務(wù)時(shí)候會(huì)配置環(huán)境變量
b.局部變量(普通變量)
是編寫(xiě)shell腳本最常用的變量。
變量名=值
a=1
變量名:數(shù)字、字母、下劃線,不能是數(shù)字開(kāi)頭。常見(jiàn)的是字母開(kāi)頭
= 等號(hào) :賦值符,把什么東西給誰(shuí),賦值符號(hào)兩邊不能有空格
值:就是具體分東西,變量?jī)?nèi)容
引用內(nèi)容的符號(hào):?jiǎn)我?hào),雙引號(hào),反引號(hào),不加引號(hào)
let 讓引號(hào)中的東西進(jìn)行計(jì)算
7. 表達(dá)式
[ 表達(dá)式 ] 表達(dá)式
中括號(hào)兩端(兩邊)必須有空格
[root@oldboyedu ~]# [ "a" = "a" ] && echo 1||echo 0
1
[root@oldboyedu ~]# [ "a" = "b" ] && echo 1||echo 0
0
[root@oldboyedu ~]# [ "a" = "b" ] && echo 1||echo 0
0
[root@oldboyedu ~]# [ "a" = "a" ] && echo 1||echo 0
1
[root@oldboyedu ~]# [ "a" = "b" ] && echo 1||echo 0
0
[root@oldboyedu ~]# [ "a" = "1" ] && echo 1||echo 0
0
前面正確輸出1錯(cuò)誤輸出0
| 整數(shù)表達(dá)式 | 字符 |
|---|---|
| > | -gt |
| >= | -ge |
| < | -lt |
| <= | -le |
| = | -eq |
| 不等于 | -ne |
[root@oldboyedu ~]# a=1
[root@oldboyedu ~]# [ "a" eq 1 ] && echo 1
-bash: [: eq: binary operator expected
[root@oldboyedu ~]# [ "a" -eq 1 ] && echo 1
-bash: [: a: integer expression expected
[root@oldboyedu ~]# [ "a" -eq 1 ] && echo 1
-bash: [: a: integer expression expected
[root@oldboyedu ~]# [ $a -eq 1 ] && echo 1
1
[root@oldboyedu ~]# [ $a -ne 1 ] && echo 1
[root@oldboyedu ~]# [ $a -ne 2 ] && echo 1
1
[root@oldboyedu ~]# [ $a -ne 3 ] && echo 1
1
[root@oldboyedu ~]# [ $a -eq 3 ] && echo 1
[root@oldboyedu ~]# [ $a -eq 3 ] && echo 1
1)整數(shù)表達(dá)式,兩端必須要有空格
2)中括號(hào)里面兩端必須要有空格
3)變量和比較的內(nèi)容不需要加引號(hào)
字符表達(dá)式
-z 變量?jī)?nèi)容長(zhǎng)度內(nèi)容為0時(shí),為真。 zero
-n 變量長(zhǎng)度不為0時(shí),為真。 not zero
a == a 雙等號(hào) 字符串是否相等
說(shuō)明:
1)字符串雙引號(hào)
2)
oldboy="I am oldboy"
[root@oldboyedu ~]# [ -z "$oldboy" ] &&echo 真 || echo 假
假
[root@oldboyedu ~]# [ -z "$oldboy" ] &&echo 真 || echo 假
假
[root@oldboyedu ~]# oldboy=""
[root@oldboyedu ~]# [ -z "$oldboy" ] &&echo 真 || echo 假
真
[root@oldboyedu ~]# [ -n "$oldboy" ] &&echo 真 || echo 假
假
[root@oldboyedu ~]# [ -n "$oldboy" ] &&echo 真 || echo 假
假
[root@oldboyedu ~]# [ -z "$oldboy" ] &&echo 真 || echo 假
真
8. shell判斷句 :
如果 ....那么 ....
if 判斷句語(yǔ)法:
if [ 表達(dá)式 ]
then
fi
elif 多條件
書(shū)寫(xiě)腳本習(xí)慣:
1 以.sh結(jié)尾
2 腳本開(kāi)頭第一行 #!/bin/bash 腳本內(nèi)容由誰(shuí)解釋
由于linux下默認(rèn)是bash 所以也可以不用寫(xiě)著一行
read 命令 讀取用戶輸入
-p “提醒“
-t “多長(zhǎng)時(shí)間內(nèi)等待輸入“
[root@oldboyedu ~]# vim test.sh
1 #!/bin/bash
2 read -p "請(qǐng)輸入一句話" boy
3 if [ "$boy" == "潛力股" ]
4 then
5 echo "先和你談?wù)勁笥?
6 else
7 echo "白白"
8 fi
輸入兩個(gè)整數(shù),比較大小
[root@oldboyedu ~]# vim daxiao.sh
1 #!/bin/bash
2 read -p “輸入整數(shù):” a b
3 if [ "$a" -gt "$b" ]
4 then
5 echo "$a>$b"
6 elif [ "$a" -lt "$b" ]
7 then
8 echo "$a<$b"
9 else
10 echo "$a=$b"
11 fi
特殊位置變量
$1腳本文件的第一個(gè)參數(shù)
$2 腳本文件的第二個(gè)參數(shù)
另一種方法
#!/bin/bash
a=$1
b=$2
if [ "$a" -gt "$b" ]
then
echo "$a>$b"
elif [ "$a" -lt "$b" ]
then
echo "$a<$b"
else
echo "$a=$b"
fi
9. for 循環(huán)
for n in 取值列表
do
執(zhí)行命令
done