1、為什么要學(xué)習(xí)Shell編程官脓?
Linux系統(tǒng)中會(huì)大量的使用Shell,工作中我們也需要自動(dòng)化實(shí)現(xiàn)業(yè)務(wù)涝焙,例如:自動(dòng)備份卑笨、監(jiān)控、自動(dòng)安裝服務(wù)仑撞。
Shell編程是Linux運(yùn)維人員必須要會(huì)的編程語(yǔ)言赤兴。最簡(jiǎn)單的編程語(yǔ)言。編程也是運(yùn)維人員必須具備的本領(lǐng):Shell隧哮、Python是運(yùn)維人員必須具備的本領(lǐng)
2桶良、什么是Shell?
Shell就是一個(gè)命令解釋器(翻譯官)近迁,命令行的命令以及腳本都會(huì)通過(guò)shell解釋傳給操作系統(tǒng)艺普,處理后在輸出給用戶(hù)。
[root@oldboyedu ~]# tail -1 /etc/passwd
oldgirl1:x:8889:8889::/home/oldgirl1:/bin/bash #<==創(chuàng)建用戶(hù)時(shí),系統(tǒng)指定的翻譯官歧譬。
3岸浑、Shell的分類(lèi)
- Bourne shell
Bourne shell又包括Bourne shell (sh)、Korn shell (ksh)瑰步、Bourne Again Shell(bash)三種類(lèi)型矢洲。
- C shell
C shell又包括csh、tcsh兩種類(lèi)型缩焦。
[root@oldboyedu ~]# cat /etc/shells <<====查看C7支持的shell:
/bin/sh <<==== /bin/sh 是bash的軟連接
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/sh 是bash的軟連接
######4读虏、C7:默認(rèn)Shell
[root@oldboyedu ~]# echo $SHELL
/bin/bash
5、什么是Shell腳本袁滥?
程序盖桥、命令放入文件里執(zhí)行,這個(gè)文件稱(chēng)之為Shell腳本文件题翻。
工作中最多的編程寫(xiě)腳本揩徊,存放在文件里。
6嵌赠、Shell變量:
a.全局變量(環(huán)境變量)
在整個(gè)系統(tǒng)中生效塑荒、一般是大寫(xiě)、系統(tǒng)中默認(rèn)就
存在一些這樣的變量姜挺,滿(mǎn)足系統(tǒng)和程序運(yùn)行的需求齿税。
系統(tǒng)自帶的環(huán)境變量;
[root@oldboyedu ~]# echo $PS1 <<====內(nèi)核信息
[\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\]\[\e[31;1m\] \w\[\e[0m\]]\$
[root@oldboyedu ~]# echo $PATH <<====環(huán)境變量
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@oldboyedu ~]# echo $HOME
/root
[root@oldboyedu ~]# echo $SHELL
/bin/bash
[root@oldboyedu ~]# echo $UID
0
自定義環(huán)境變量:
方法1
export OLDBOY="I am oldboy."
方法2:
OLDBOY="I am oldboy."
export OLDBOY
[root@oldboyedu ~]# export OLDBOY="I am oldboy." 設(shè)定為環(huán)境變量
[root@oldboyedu ~]# echo $OLDBOY 打印發(fā)現(xiàn)是
I am oldboy.
/etc/profile==>~/.bash_profile===>~/.bashrc===>/etc/bashrc 環(huán)境變量文件
推薦以后把環(huán)境變量放入/etc/bashrc
[root@oldboyedu ~]# tail -1 /etc/bashrc
export OLDBOY="I am oldboy."
[root@oldboyedu ~]# . /etc/bashrc
[root@oldboyedu ~]# echo $OLDBOY #<==輸出一個(gè)變量?jī)?nèi)容就加$變量名
I am oldboy.
安裝java服務(wù)的時(shí)候就會(huì)配置環(huán)境變量。
b.局部變量(普通變量)
是編寫(xiě)Shell腳本最常用的變量炊豪。
變量名=值
a=1
變量名:數(shù)字凌箕、字母、下劃線溜在,不能是數(shù)字開(kāi)頭陌知。
oldboy他托、 123a掖肋、_abc
= 等號(hào):賦值符,把什么東西給誰(shuí)赏参。賦值符號(hào)兩邊不能有空格志笼。
值:東西,變量?jī)?nèi)容把篓。
引用內(nèi)容的符號(hào):?jiǎn)我?hào)纫溃、雙引號(hào)、反引號(hào)韧掩、不加引號(hào)
[root@oldboyedu ~]# a=1
[root@oldboyedu ~]# echo $a
1
[root@oldboyedu ~]# y=$x+1
[root@oldboyedu ~]# echo $y
1+1
[root@oldboyedu ~]# y="$x+1"
[root@oldboyedu ~]# echo $y
1+1
[root@oldboyedu ~]# y='$x+1'
[root@oldboyedu ~]# echo $y
$x+1
[root@oldboyedu ~]# y=`$x+1`
-bash: 1+1: command not found
[root@oldboyedu ~]# let y="$x+1" #<==讓括號(hào)的內(nèi)容進(jìn)行計(jì)算紊浩。
[root@oldboyedu ~]# echo $y
2
[root@oldboyedu ~]# a=1
[root@oldboyedu ~]# echo ${a}b
1b
7表達(dá)式
[ 表達(dá)式 ]中括號(hào)表達(dá)式,中括號(hào)里面兩端必須要有空格。
要加雙引號(hào)
[root@oldboyedu ~]# [ "a" = "b" ] && echo 1||echo 0
0
分段釋義:
[ "a" = "b" ] && echo 1||echo 0
如果表達(dá)式成立坊谁,打印1费彼,否則打印0.
[ "a" = "b" ] && echo 1 #跟屁蟲(chóng)。
如果表達(dá)式成立口芍,打印1
[ "a" = "b" ] || echo 0 #杠精箍铲。
如果表達(dá)式成立是假的,打印0
取反:
[ ! "a" = "b" ] && echo 1
數(shù)表達(dá)式:
-gt >
-ge >=
-lt <
-le <=
-eq =
-ne不等于
[root@oldboyedu ~]# a=1 a=1
[root@oldboyedu ~]# [ $a -eq 2 ] && echo 1||echo 0 如果$a=2就打印1不是則打印0
0
[root@oldboyedu ~]# [ $a -eq 1 ] && echo 1 || echo 0
1
1)整數(shù)表達(dá)式符 兩端必須要有空格
2)中括號(hào)里面兩端必須要有空格鬓椭。
3)變量和比較的內(nèi)容颠猴,不需要加引號(hào)。
符表達(dá)式:
-z 變量?jī)?nèi)容長(zhǎng)度為0時(shí)小染,為真(表達(dá)式正確)翘瓮。zero
-n 變量?jī)?nèi)容長(zhǎng)度【不】為0時(shí),為真(表達(dá)式正確)裤翩。not zero
a == a 字符串是否相同
說(shuō)明:
1)字符串要加雙引號(hào)
例子:
[root@oldboyedu ~]# oldboy="I am oldboy"
[root@oldboyedu ~]# [ -z "$oldboy" ] && echo 1 || echo 0
0
[root@oldboyedu ~]# oldboy=""
[root@oldboyedu ~]# [ -z "$oldboy" ] && echo 1 || echo 0
1
[root@oldboyedu ~]# [ -n "$oldboy" ] && echo 1 || echo 0
0
[root@oldboyedu ~]# [ "test" == "host" ] && echo 1 || echo 0
0
[root@oldboyedu ~]# [ "test" == "test" ] && echo 1 || echo 0
1
8.shell判斷句:
如果...那么春畔。
如果[ 你是潛力股 ]
那么
就和你談朋友
否則
拜拜
果如
if判斷句語(yǔ)法:
if [ 表達(dá)式 ]
then
命令
fi
如果[ 你是潛力股 ]
那么
就和你談朋友
果如
[root@oldboyedu ~]# cat test.sh
#!/bin/bash
a=10
if [ $a -gt 1 ]
then
echo 1
fi
如果[ 你是潛力股 ]
那么
就和你談朋友
否則
拜拜
果如
[root@oldboyedu ~]# cat test.sh
#!/bin/bash
a=1
if [ $a -gt 1 ]
then
echo 1
else
echo 0
fi
[root@oldboyedu ~]# cat test.sh
#!/bin/bash
boy="潛力股"
if [ "$boy" == "潛力股" ]
then
echo "先和你談?wù)勁笥?
else
echo "白白"
fi
[root@oldboyedu ~]# sh test.sh
先和你談?wù)勁笥?
[root@oldboyedu ~]# cat judge_date.sh
if [ $(date +%w) -eq 6 ]
then
echo "一起去旅游吧"
else
echo "還是好好上課吧"
fi
[root@oldboyedu ~]# sh judge_date.sh
還是好好上課吧
[root@oldboyedu ~]# date
Tue Apr 9 11:33:13 CST 2019
[root@oldboyedu ~]# date -s '2019/4/13'
Sat Apr 13 00:00:00 CST 2019
[root@oldboyedu ~]# sh judge_date.sh
一起去旅游吧
實(shí)現(xiàn)多條件
[root@oldboyedu ~]# cat judge_date.sh
if [ $(date +%w) -eq 6 ] || [ $(date +%w) -eq 0 ]
then
echo "一起去旅游吧"
else
echo "還是好好上課吧"
fi
read命令 交互式讀取用戶(hù)輸入
-p "提醒:"
-t "多長(zhǎng)時(shí)間內(nèi)等待輸入"
[root@oldboyedu ~]# read -p "請(qǐng)輸入一句話:" boy
請(qǐng)輸入一句話:潛力股
[root@oldboyedu ~]# echo $boy
潛力股
相當(dāng)于boy="潛力股"
[root@oldboyedu ~]# cat test.sh
#!/bin/bash
read -p "請(qǐng)輸入你喜歡的男孩的一句話:" boy
if [ "$boy" == "潛力股" ]
then
echo "先和你談?wù)勁笥?
else
echo "白白"
fi
[root@oldboyedu ~]# cat test.sh
#!/bin/bash
read -p "請(qǐng)輸入你喜歡的男孩的一句話:" boy
if [ "$boy" == "潛力股" ]
then
echo "先和你談?wù)勁笥?
elif [ "$boy" == "老爸是李剛" ]
then
echo "直接嫁給你"
elif [ "$boy" == "二環(huán)內(nèi)有套房" ]
then
echo "立馬領(lǐng)證"
else
echo "白白"
fi
練習(xí)題:Shell編程實(shí)現(xiàn) 兩個(gè)整數(shù)比較大小
[root@oldboyedu ~]# cat com_num.sh
#!/bin/sh
read -p "請(qǐng)輸入兩個(gè)整數(shù):" a b
if [ $a -gt $b ]
then
echo "$a>$b"
elif [ $a -eq $b ]
then
echo "$a=$b"
else
echo "$a<$b"
fi
[root@oldboyedu ~]# sh com_num.sh
請(qǐng)輸入兩個(gè)整數(shù):2 3
2<3
[root@oldboyedu ~]# sh com_num.sh
請(qǐng)輸入兩個(gè)整數(shù):3 3
3=3
[root@oldboyedu ~]# sh com_num.sh
請(qǐng)輸入兩個(gè)整數(shù):3 4
3<4
[root@oldboyedu ~]# sh com_num.sh
請(qǐng)輸入兩個(gè)整數(shù):3 2
3>2
特殊位置變量:
1
2
[root@oldboyedu ~]# cat t.sh
echo 2
[root@oldboyedu ~]# sh t.sh oldboy oldgirl
oldboy oldgirl #<==oldboy就是2輸出的結(jié)果岛都。
9.for循環(huán)
for n in 取值列表
do
執(zhí)行命令
done
[root@oldboyedu ~]# cat for1.sh
for n in 1 2 3 4 5
do
echo $n
done
[root@oldboyedu ~]# sh for1.sh
1
2
3
4
5
[root@oldboyedu ~]# sh -x for1.sh
+ for n in 1 2 3 4 5
+ echo 1
1
+ for n in 1 2 3 4 5
+ echo 2
2
+ for n in 1 2 3 4 5
+ echo 3
3
+ for n in 1 2 3 4 5
+ echo 4
4
+ for n in 1 2 3 4 5
+ echo 5
5
打印254個(gè)IP
10.0.0.1---10.0.0.254
[root@oldboyedu ~]# cat for1.sh
for n in {1..254}
do
echo "10.0.0.$n"
done
課后練習(xí):
1律姨、比較整數(shù)大小。
[root@ltd58 ~]# cat zhengshu.sh
#!/bin/bash
read -p "請(qǐng)輸入兩個(gè)數(shù)字:" a b
if [ "$a" -gt "$b" ]
then
echo "$a>$b"
elif [ "$a" -eq "$b" ]
then
echo "$a=$b"
else
echo "$a<$b"
fi
2臼疫、判斷日期择份,每周六日去旅游,其它時(shí)間上課烫堤。
3荣赶、取出當(dāng)前系統(tǒng)Ip地址,判斷是否為10.0.0.31鸽斟,如果是提示正確拔创,如果不是給出提示。
[root@ltd58 ~]# cat ip.sh
#!/bin/sh
IP=$(hostname -I)
if [ $IP == "10.0.0.31" ]
then
echo "正確"
else
echo "錯(cuò)誤!IP地址為`hostname -I`"
fi
4富蓄、打印10.0.0.1--10.0.0.254個(gè)Ip地址剩燥,:當(dāng)IP地址為系統(tǒng)IP地址時(shí),給出某IP是系統(tǒng)IP的提示立倍。
#!/bin/bash
i=`hostname -I`
for a in 10.0.0.{1..254}
do
echo $a
if [ $a == $i ]
then
echo "此為本機(jī)ip地址"
fi
done