2019-04-09 Day-28 Shell編程基礎(chǔ)

Day28

作者:方維超

歸檔:課堂筆記

時間:2019/4/9

老男孩教育教學(xué)核心思想6重:重目標(biāo)、重思路、重方法、重實踐、重習(xí)慣、重總結(jié)

學(xué)無止境,老男孩教育成就你人生的起點!

一、Shell編程基礎(chǔ)

Shell編程3小時光速入門

因為Web集群架構(gòu)會用到Shell編程基礎(chǔ),提前講

跟老男孩學(xué)Linux運維:Shell編程實戰(zhàn)

https://item.jd.com/12117874.html

1、為什么要學(xué)Shell編程

Linux系統(tǒng)中會大量使用Shell,工作中我們也需要自動化實現(xiàn)業(yè)務(wù),

例如:自動備份、監(jiān)控、自動安裝服務(wù)

Shell編程是Linux運維人員必須要會的編程語言。最簡單的編程語言。

編程也是運維人員必須具備的本領(lǐng):

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的默認(rèn)shell

[root@CentOS-F~]# echo $SHELL

/bin/bash

5、什么是Shell腳本?

程序、命令放入到文件里執(zhí)行,這個文件稱之為Shell腳本文件。

工作中最多的是編程寫腳本,存放在文件里。

6、Shell的變量:

a. 全局變量(環(huán)境變量)

在整個系統(tǒng)中生效、一般是大寫,系統(tǒng)中默認(rèn)存在一些這樣的變量,滿足系統(tǒng)和程序運行的需求。

系統(tǒng)自帶的環(huán)境變量:

[root@CentOS-F~]# echo PS1 [\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\]\[\e[31;1m\]\w\[\e[0m\]]\

[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 OLDBOY #<==輸出一個變量內(nèi)容就加變量名

I am oldboy.

安裝java服務(wù)的時候就會配置環(huán)境變量

b.局部變量(普通變量)

是編寫Shell腳本最常用的變量。

變量名=值

例如:a=1,

變量名:數(shù)字、字母、下劃線,不能是數(shù)字開頭

= 等號:賦值符,把什么東西給誰。賦值符號兩邊不能有空格。

值:東西,變量內(nèi)容

引用內(nèi)容的符號:單引號(所見即所得)、雙引號()、反引號(解析命令)、不加引號(同雙引號)

[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 讓括號里的內(nèi)容進行計算

[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~]# [ a -gtb ] && echo 1||echo 2
2

1)整數(shù)表達式符 兩端必須要有空格

2)中括號里面兩端必須要有空格

3)變量和比較的內(nèi)容,不需要加引號

字符表達式

-z 變量內(nèi)容長度為0時,為真(正確)。zero

-n 變量內(nèi)容長度【不】為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 "先和你談?wù)勁笥?

else

echo "拜拜"

fi

~

"test.sh" 8L, 122C written

[root@CentOS-F~]# bash test.sh

先和你談?wù)勁笥?/p>

[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 6 ] || [(date +%w) -eq 0 ]

then

echo "一起去旅游吧"

else

echo "還是好好上課吧"

fi

read 命令,交互式讀取用戶輸入

-p “提醒:”

-t “多長時間內(nèi)等待輸入”

[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 "先和你談?wù)勁笥?
else
echo "白白"
fi

[root@oldboyedu ~]# sh test.sh
請輸入你喜歡的男孩的一句話:
我沒錢
白白
[root@oldboyedu ~]# sh test.sh
請輸入你喜歡的男孩的一句話:潛力股
先和你談?wù)勁笥?/p>

https://blog.51cto.com/oldboy/1864839

特殊位置變量:

$1 腳本文件的第一個參數(shù)

$2 腳本文件的第二個參數(shù)

[root@oldboyedu ~]# cat t.sh
echo 12
[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,這個怎么理解,為什么不是寫a,b 因為read命令 -p 和 雙引號里的屬于提示,不用管. 而后面的a b是變量,相當(dāng)于在外面寫變量a=1,變量b=2(用1,2舉例),而a,b是解析變量并取出里面的值來進行比較
2.a=1 b=2怎樣理解,例如sh int.sh 1 2可以理解為,把1給了第一個變量,把2給了第二個變量,1解析出第一個變量給了a,2解析出第二個變量給了b

練習(xí):

[root@CentOS-F~]# vim 1.sh

!/bin/sh

read -p "請輸入兩個整數(shù):" a b

if [ a -gtb ]

then

echo "a >b"

elif [ a -eqb ]

then

echo "a =b"

elif [ a -ltb ]

then

echo "a <b"

else

echo " "

fi

~

練習(xí):

[root@CentOS-F~]# vim juide_date.sh

!/bin/bash

read -p "請輸入你喜歡的男孩子的一句話:" boy

if [ "$boy" == "潛力股" ]

then

echo "先和你談?wù)勁笥?

elif [ "$boy" == "帥" ]

then

▽ echo "你想干啥"

elif [ "$boy" == "丑" ]

then

echo "你好萌"

else

fi

練習(xí)題:Shell編程實現(xiàn)兩個整數(shù)比較大小

[root@oldboyedu ~]# cat com_num.sh

!/bin/sh

read -p "請輸入兩個整數(shù):" a b

if [ a -gtb ]

then

echo "a>b"

elif [ a -eqb ]

then

echo "a=b"

else

echo "a<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

書寫腳本習(xí)慣:

  1. 以.sh結(jié)尾。

  2. 腳本開頭第一行 #!/bin/bash 腳本內(nèi)容有誰來解釋。

由于Linux下默認(rèn)時bash,所以可以不寫這行。

課后練習(xí):

1、比較整數(shù)大小。

[root@CentOS-F~]# vim 整數(shù).sh

!/bin/bash

read -p "請輸入兩個整數(shù):" a b

if [ a -gtb ]

then

echo "a>b"

elif [ a -eqb ]

then

echo "a=b"

else

echo "a<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 6 ]||[(date +%w) -eq 0 ]||[ $(date +%w) -eq 2 ]

then

echo "一起去旅游"

else

echo "一起去上課"

fi

~

"旅游.sh" 7L, 150C written

[root@CentOS-F~]# bash 旅游.sh

一起去旅游

3、取出當(dāng)前系統(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地址,當(dāng)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

……

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容