Shell編程3小時光速入門

作者:馬帥琦

歸檔:day28

時間:2019/4/9

Shell編程3小時光速入門

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

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

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

1、為什么要學(xué)習(xí)Shell編程?

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

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

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

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

Shell、Python是運維人員必須具備的本領(lǐng)

2、什么是Shell?

Shell就是一個命令解釋器(翻譯官),命令行的命令以及腳本都會通過shell解釋,

傳給操作系統(tǒng),處理后在輸出給用戶。

[root@oldboyedu ~]# tail -1 /etc/passwd

oldgirl1:x:8889:8889::/home/oldgirl1:/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

C shell又包括csh、tcsh兩種類型。

C7支持的shell:

[root@oldboyedu ~]# cat /etc/shells

/bin/sh

/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í)行,這個文件稱之為Shell腳本文件。

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

6、Shell變量:

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

? 在整個系統(tǒng)中生效、一般是大寫、系統(tǒng)中默認(rèn)就

? 存在一些這樣的變量,滿足系統(tǒng)和程序運行的需求。

系統(tǒng)自帶的環(huá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/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."

[root@oldboyedu ~]# 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ù)字開頭。

? ? ? oldboy、 123a、_abc

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

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

? ? 引用內(nèi)容的符號:單引號、雙引號、反引號、不加引號

[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"? #<==讓括號的內(nèi)容進(jìn)行計算。

[root@oldboyedu ~]# echo $y

2

[root@oldboyedu ~]# a=1

[root@oldboyedu ~]# echo ${a}b

1b


7、表達(dá)式

[ 表達(dá)式 ]中括號表達(dá)式,中括號里面兩端必須要有空格。

字符串要加雙引號

[root@oldboyedu ~]# [ "a" = "b" ] && echo 1||echo 0

0

[ "a" = "b" ] && echo 1||echo 0

如果表達(dá)式成立,打印1,否則打印0.

[ "a" = "b" ] && echo 1? #跟屁蟲。

如果表達(dá)式成立,打印1

[ "a" = "b" ] || echo 0? #杠精。

如果表達(dá)式成立是假的,打印0

取反:

[ ! "a" = "b" ] && echo 1

整數(shù)表達(dá)式:

>? ? ? -gt

>=? ? -ge

<? ? ? -lt

<=? ? -le

=? ? ? -eq

不等于 -ne

[root@oldboyedu ~]# a=1

[root@oldboyedu ~]# [ $a -eq 2 ] && echo 1||echo 0

0

[root@oldboyedu ~]# [ $a -eq 1 ] && echo 1 || echo 0

1

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

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

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

字符表達(dá)式:

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

-n 變量內(nèi)容長度【不】為0時,為真(表達(dá)式正確)。not zero

a == a 字符串是否相同

說明:

1)字符串要加雙引號

例子:

[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判斷句語法:

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ù)勁笥?/p>

[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

一起去旅游吧

實現(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@oldboyedu ~]# read? -p "請輸入一句話:" boy

請輸入一句話:潛力股

[root@oldboyedu ~]# echo $boy

潛力股

相當(dāng)于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>

[root@oldboyedu ~]# cat test.sh

#!/bin/bash

read -p "請輸入你喜歡的男孩的一句話:" 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編程實現(xiàn) 兩個整數(shù)比較大小

[root@oldboyedu ~]# cat com_num.sh

#!/bin/sh

read -p "請輸入兩個整數(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

請輸入兩個整數(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

特殊位置變量:

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

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

[root@oldboyedu ~]# cat t.sh

echo $1 $2

[root@oldboyedu ~]# sh t.sh oldboy oldgirl

oldboy oldgirl? #<==oldboy就是$1輸出的結(jié)果,oldgirl就是$2輸出的結(jié)果。

[root@oldboyedu ~]# cat com_num.sh

#!/bin/sh

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

a=$1

b=$2

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 2 3

2<3

[root@oldboyedu ~]# sh com_num.sh 2 2

2=2

[root@oldboyedu ~]# sh com_num.sh 3 2

3>2

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

[root@oldboyedu ~]# cat for1.sh

for n in {1..5}

do

? ? echo $n

done

[root@oldboyedu ~]# sh for1.sh

1

2

3

4

5

打印254個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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 白云依偎在藍(lán)天的懷抱, 陽光依舊執(zhí)著的高照, 偶爾聽到幾聲蟈蟈叫, 時常伴著好奇去尋找。 無風(fēng)樹兒靜悄悄, 幾片落...
    慢熱的陽光閱讀 93評論 0 3
  • 我知道你在看到這篇文章之前肯定早都看過無數(shù)關(guān)于拖延癥與戰(zhàn)拖的帖子,雖然看的時候熱血澎湃,但是看完還是該干嘛干嘛,對...
    門耳閱讀 420評論 0 1
  • 還是迷茫的不行,我到底想要什么自己真的不知道,事到如今什么都無所謂,轉(zhuǎn)念一想還是做好自己吧,至于你我不知道要怎么做...
    童童熊閱讀 211評論 0 0