Day28
作者:方維超
歸檔:課堂筆記
時間:2019/4/9
老男孩教育教學核心思想6重:重目標糟秘、重思路黔攒、重方法、重實踐舶斧、重習慣欣鳖、重總結
學無止境,老男孩教育成就你人生的起點茴厉!
一泽台、Shell編程基礎
Shell編程3小時光速入門
因為Web集群架構會用到Shell編程基礎矾缓,提前講
跟老男孩學Linux運維:Shell編程實戰(zhàn)
https://item.jd.com/12117874.html
1怀酷、為什么要學Shell編程
Linux系統(tǒng)中會大量使用Shell,工作中我們也需要自動化實現(xiàn)業(yè)務,
例如:自動備份、監(jiān)控、自動安裝服務
Shell編程是Linux運維人員必須要會的編程語言。最簡單的編程語言茶没。
編程也是運維人員必須具備的本領:
Shell、Python 是運維必備的
2笛求、什么是Shell探入?
Shell就是一個命令解釋器(翻譯官),命令行的命令以及腳本都會通過Shell解釋殃恒,傳給操作系統(tǒng)病附,處理后再輸出給用戶
[root@CentOS-F~]# tail -l /etc/passwd
oldboy:x:1000:1000::/home/oldboy:/bin/bash #《===創(chuàng)建用戶時系統(tǒng)指定的翻譯官
3贮竟、Shell的分類
1)Bourne shell
Bourne shell又包括Bourne shell (sh)啊送、Korn shell (ksh)、Bourne Again Shell(bash)三種類型婆排。
2)C shell 又包含csh段只、tcsh兩種類型
C7支持的shell
[root@CentOS-F~]# cat /etc/shells
/bin/sh 是bash的軟鏈接
/bin/bash
/usr/bin/sh
/usr/bin/bash
4、C7的默認shell
[root@CentOS-F~]# echo $SHELL
/bin/bash
5、什么是Shell腳本?
程序悉抵、命令放入到文件里執(zhí)行,這個文件稱之為Shell腳本文件岂座。
工作中最多的是編程寫腳本疹瘦,存放在文件里。
6奖年、Shell的變量:
a. 全局變量(環(huán)境變量)
在整個系統(tǒng)中生效中燥、一般是大寫友浸,系統(tǒng)中默認存在一些這樣的變量祭往,滿足系統(tǒng)和程序運行的需求。
系統(tǒng)自帶的環(huán)境變量:
[root@CentOS-F~]# echo
[root@CentOS-F~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@CentOS-F~]# echo $HOME
/root
[root@CentOS-F~]# echo $SHELL
/bin/bash
自定義環(huán)境變量:
方法1
export OLDBOY=“I am oldboy.”
[root@CentOS-F~]# export OLDBOY="I am oldboy"
[root@CentOS-F~]# echo $OLDBOY
I am oldboy
方法2
OLDBOY=“I am oldboy.”
export OLDBOY
[root@CentOS-F~]# OLDBOY="I am oldboy"
[root@CentOS-F~]# export OLDBOY
[root@CentOS-F~]# echo $OLDBOY
I am oldboy
永久生效的方法:
/etc/profile==>/.bash_profile===>/.bashrc===>/etc/bashrc < 依次被覆蓋
推薦以后把環(huán)境變量放入/etc/bashrc
[root@oldboyedu ~]# tail -1 /etc/bashrc
export OLDBOY="I am oldboy."
[root@oldboyedu ~]# . /etc/bashrc
[root@oldboyedu ~]# echo 變量名
I am oldboy.
安裝java服務的時候就會配置環(huán)境變量
b.局部變量(普通變量)
是編寫Shell腳本最常用的變量火窒。
變量名=值
例如:a=1硼补,
變量名:數(shù)字、字母熏矿、下劃線已骇,不能是數(shù)字開頭
= 等號:賦值符离钝,把什么東西給誰。賦值符號兩邊不能有空格褪储。
值:東西卵渴,變量內容
引用內容的符號:單引號(所見即所得)、雙引號()鲤竹、反引號(解析命令)浪读、不加引號(同雙引號)
[root@CentOS-F~]# a=1
[root@CentOS-F~]# echo $a
1
[root@CentOS-F~]# x=1
[root@CentOS-F~]# y=$x+1
[root@CentOS-F~]# echo $y
1+1
[root@CentOS-F~]# let y=“$x+1” #<==== let 讓括號里的內容進行計算
[root@CentOS-F~]# echo $y
2
[root@CentOS-F~]# a=1
[root@CentOS-F~]# echo $a
1
[root@CentOS-F~]# echo ${a}b
1b
7、表達式
[ 表達式 ] 中括號表達式辛藻,中括號里面兩端必須要有空格碘橘,可以有多個,至少有一個吱肌。
字符串要加雙引號
[root@CentOS-F~]# [ a=a ] &&echo 1||echo 0
1
[root@CentOS-F~]# [ a=b ] &&echo 1||echo 0
1
[root@CentOS-F~]# [ "a" = "b" ] &&echo 1||echo 0 #如果表達式成立痘拆,打印1,否則打印0
0
[root@CentOS-F~]# [ "a" = "b" ] &&echo 1 #如果表達式成立氮墨,打印1纺蛆,不成立不打印
[root@CentOS-F~]# [ "a" = "b" ] ||echo 0 #杠精 如果表達式是假的,打印0
0
[root@CentOS-F~]# [ ! "a" = "b" ] &&echo 1 #取反
1
整數(shù)表達式:
(大于) -gt
= (大于等于) -ge
< (小于) -lt
<= (小于等于) -le
= (等于) -eq
不等于 -ne
[root@CentOS-F~]# a=1
[root@CentOS-F~]# [ $a -eq 2 ] && echo 1||echo 2
2
[root@CentOS-F~]# [ $a -eq 1 ] && echo 1||echo 2
1
[root@CentOS-F~]# a=1
[root@CentOS-F~]# b=3
[root@CentOS-F~]# [ b ] && echo 1||echo 2
2
1)整數(shù)表達式符 兩端必須要有空格
2)中括號里面兩端必須要有空格
3)變量和比較的內容勇边,不需要加引號
字符表達式
-z 變量內容長度為0時犹撒,為真(正確)。zero
-n 變量內容長度【不】為0時粒褒,為真(正確)识颊。not zero
a==a 雙等號 字符串是否相同
說明:
1)字符串要加雙引號
例子:
[root@CentOS-F~]# oldboy="I am oldboy"
[root@CentOS-F~]# [ -z "$oldboy" ] && echo 1 || echo 0
0
[root@CentOS-F~]# oldboy=""
[root@CentOS-F~]# [ -z "$oldboy" ] && echo 1 || echo 0
1
[root@CentOS-F~]# [ -n "$oldboy" ] && echo 1 || echo 0
0
[root@CentOS-F~]# [ "你" == "我" ] && echo 1 || echo 0
0
8、判斷句:
如果…那么奕坟。
如果[ 你是潛力股 ]
那么
就和你談朋友
否則
拜拜
if判斷句語法:
if [ 表達式 ]
then
命令
fi
如果[ 你是潛力股 ]
那么
就和你談朋友
果如
[root@CentOS-F~]# vim test.sh
!/bin/bash
a=10
if [ $a -gt 1 ]
then
echo 1
fi
~
"test.sh" 6L, 52C written
[root@CentOS-F~]# bash test.sh
1
[root@CentOS-F~]# vim test.sh
!/bin/bash
a=3
if [ $a -gt 5 ]
then
echo 1
fi
echo 2
~
"test.sh" 7L, 61C written
[root@CentOS-F~]# bash test.sh
2
[root@CentOS-F~]# vim test.sh
!/bin/bash
boy="潛力股"
if [ "$boy" == "潛力股" ]
then
echo "先和你談談朋友"
else
echo "拜拜"
fi
~
"test.sh" 8L, 122C written
[root@CentOS-F~]# bash test.sh
先和你談談朋友
[root@CentOS-F~]# vim juide_date.sh
if [ $(date +%w) -eq 2 ]
then
echo "一起睡覺"
else
echo "一起游戲"
fi
~
"juide_date.sh" [New] 6L, 86C written
[root@CentOS-F~]# bash juide_date.sh
一起睡覺
實現(xiàn)多條件用 || 符號
[root@oldboyedu ~]# cat judge_date.sh
if [ (date +%w) -eq 0 ]
then
echo "一起去旅游吧"
else
echo "還是好好上課吧"
fi
read 命令祥款,交互式讀取用戶輸入
-p “提醒:”
-t “多長時間內等待輸入”
[root@CentOS-F~]# read -t 3 -p "請輸入一句話:"
請輸入一句話:[root@CentOS-F~]#
[root@CentOS-F~]# read -p "請輸入一句話:" boy
請輸入一句話:潛力股
[root@CentOS-F~]# echo $boy
潛力股
[root@oldboyedu ~]# cat test.sh
!/bin/bash
read -p "請輸入你喜歡的男孩的一句話:" boy
if [ "$boy" == "潛力股" ]
then
echo "先和你談談朋友"
else
echo "白白"
fi
[root@oldboyedu ~]# sh test.sh
請輸入你喜歡的男孩的一句話:
我沒錢
白白
[root@oldboyedu ~]# sh test.sh
請輸入你喜歡的男孩的一句話:潛力股
先和你談談朋友
https://blog.51cto.com/oldboy/1864839
特殊位置變量:
$1 腳本文件的第一個參數(shù)
$2 腳本文件的第二個參數(shù)
[root@oldboyedu ~]# cat t.sh
echo 2
[root@oldboyedu ~]# sh t.sh oldboy oldgirl
oldboy oldgirl
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 -x#<====查看輸出過程 + 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
[root@CentOS-F~]# vim for.sh
for n in 10.0.0{1..254}
do
echo $n
done
[root@CentOS-F~]# vim for.sh
for n in {1..254}
do
echo “10.0.0.$n”
done
注意:
1.read -p "請輸入兩個整數(shù)" a b,這個怎么理解,為什么不是寫b 因為read命令 -p 和 雙引號里的屬于提示,不用管. 而后面的a b是變量,相當于在外面寫變量a=1,變量b=2(用1,2舉例),而b是解析變量并取出里面的值來進行比較
2.a=2怎樣理解,例如sh int.sh 1 2可以理解為,把1給了第一個變量,把2給了第二個變量,2解析出第二個變量給了b
練習:
[root@CentOS-F~]# vim 1.sh
!/bin/sh
read -p "請輸入兩個整數(shù):" a b
if [ b ]
then
echo "b"
elif [ b ]
then
echo "b"
elif [ b ]
then
echo "b"
else
echo " "
fi
~
練習:
[root@CentOS-F~]# vim juide_date.sh
!/bin/bash
read -p "請輸入你喜歡的男孩子的一句話:" boy
if [ "$boy" == "潛力股" ]
then
echo "先和你談談朋友"
elif [ "$boy" == "帥" ]
then
▽ echo "你想干啥"
elif [ "$boy" == "丑" ]
then
echo "你好萌"
else
fi
練習題:Shell編程實現(xiàn)兩個整數(shù)比較大小
[root@oldboyedu ~]# cat com_num.sh
!/bin/sh
read -p "請輸入兩個整數(shù):" a b
if [ b ]
then
echo "b"
elif [ b ]
then
echo "b"
else
echo "b"
fi
[root@oldboyedu ~]# sh com_num.sh
請輸入兩個整數(shù):2 3
2<3
[root@oldboyedu ~]# sh com_num.sh
請輸入兩個整數(shù):3 3
3=3
[root@oldboyedu ~]# sh com_num.sh
請輸入兩個整數(shù):3 4
3<4
[root@oldboyedu ~]# sh com_num.sh
請輸入兩個整數(shù):3 2
3>2
書寫腳本習慣:
以.sh結尾月杉。
腳本開頭第一行 #!/bin/bash 腳本內容有誰來解釋刃跛。
由于Linux下默認時bash,所以可以不寫這行苛萎。
課后練習:
1桨昙、比較整數(shù)大小。
[root@CentOS-F~]# vim 整數(shù).sh
!/bin/bash
read -p "請輸入兩個整數(shù):" a b
if [ b ]
then
echo "b"
elif [ b ]
then
echo "b"
else
echo "b"
fi
~
"整數(shù).sh" [New] 12L, 157C written
[root@CentOS-F~]# bash 整數(shù).sh
請輸入兩個整數(shù):2 3
2<3
[root@CentOS-F~]# bash 整數(shù).sh
請輸入兩個整數(shù):9 9
9=9
[root@CentOS-F~]# bash 整數(shù).sh
請輸入兩個整數(shù):4 1
4>1
2腌歉、判斷日期蛙酪,每周六日去旅游,其它時間上課翘盖。
[root@CentOS-F~]# vim 旅游.sh
!/bin/bash
if [ (date +%w) -eq 0 ]||[ $(date +%w) -eq 2 ]
then
echo "一起去旅游"
else
echo "一起去上課"
fi
~
"旅游.sh" 7L, 150C written
[root@CentOS-F~]# bash 旅游.sh
一起去旅游
3桂塞、取出當前系統(tǒng)Ip地址,判斷是否為[圖片上傳失敗...(image-8c2208-1554814171245)] 10.0.0.31馍驯,如果是提示正確阁危,如果不是給出提示玛痊。**
[root@CentOS-F~]# vim IP.sh
!/bin/bash
read -p "請輸入IP:" a
if [ "$a" == hostname -I
]
then
echo -e "\033[41;36;1m "正確" \033[0m"
elif [ "$a" == "10.0.0.31" ]
then
echo -e "\033[41;36;1m "錯誤" \033[0m"
fi
~
~
"IP.sh" 9L, 201C written
[root@CentOS-F~]# bash IP.sh
請輸入IP:10.0.0.200
正確
[root@CentOS-F~]# bash IP.sh
請輸入IP:10.0.0.31
錯誤
4、打印[圖片上傳失敗...(image-40ffcf-1554814171245)] 10.0.0.1--[圖片上傳失敗...(image-1187b3-1554814171245)] 10.0.0.254個Ip地址狂打,當IP地址為系統(tǒng)IP地址時擂煞,給出某IP是系統(tǒng)IP的提示。**
[root@CentOS-F~]# vim 打印.sh
!/bin/bash
for n in {1..254}
do
a=10.0.0.$n
echo "$a"
if [ $a == hostname -I
]
then
echo "$a 本機IP"
fi
done
~
"打印.sh" 10L, 130C written
[root@CentOS-F~]# bash 打印.sh
10.0.0.1
10.0.0.2
…….
10.0.0.199
10.0.0.200
10.0.0.200 本機IP
10.0.0.201
10.0.0.202
……