零基礎小白如何入門Shell,快來看看(收藏)這篇大總結!!

寫在前面: 博主是一名軟件工程系大數據應用開發專業的學生,暱稱來源於《愛麗絲夢遊仙境》中的Alice和本身的暱稱。做爲一名互聯網小白,寫博客一方面是爲了記錄本身的學習歷程,一方面是但願可以幫助到不少和本身同樣處於起步階段的萌新。因爲水平有限,博客中不免會有一些錯誤,有紕漏之處懇請各位大佬不吝賜教!我的小站:http://alices.ibilibili.xyz/ , 博客主頁:https://alice.blog.csdn.net/
儘管當前水平可能不及各位大佬,但我仍是但願本身可以作得更好,由於一天的生活就是一輩子的縮影。我但願在最美的年華,作最好的本身node

        最近有點小忙,心細的朋友們可能已經看出菌已經很久沒更新博客了。可是不慌,該掌握的知識,咋們也不能落下。這一期博客,我也不搞那些花裏胡哨了,專心寫一篇總結Shell精華的博客,也算是爲像Alice同樣的「小小白」謀點福利吧…φ(๑˃∀˂๑)♪
        python

在這裏插入圖片描述


一、Shell 概述

        首先,博主做爲一個大數據開發人士,先問你們一個問題:程序員爲何須要學習Shell呢?程序員

        緣由也很簡單,最明顯的無非就是下面兩點:web

  • 須要看懂運維人員編寫的 Shell 程序
  • 偶爾會編寫一些簡單 Shell 程序來管理集羣,提升開發效率。

在這裏插入圖片描述

二、Shell解析器

        (1)Linux提供的Shell解析器有:shell

[root@node01 hive-1.1.0-cdh5.14.0]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

        (2)bash和sh的關係vim

[root@node01 bin]$ ll | grep bash
-rwxr-xr-x. 1 root root 941880 5月  11 2016 bash
lrwxrwxrwx. 1 root root      4 5月  27 2017 sh -> bash

        (3)Centos默認的解析器是bashbash

[root@node01 bin]$ echo $SHELL
/bin/bash

三、Shell腳本入門

3.1 腳本格式

        腳本以 #!/bin/bash 開頭(指定解析器)less

3.2 編寫第一個Shell腳本:helloworld

        (1)需求:建立一個Shell腳本,輸出helloworld運維

        (2)案例實操:svg

[root@node01 datas] touch helloworld.sh
[root@node01 datas] vi helloworld.sh

在helloworld.sh中輸入以下內容
#!/bin/bash
echo "helloworld"

        (3)腳本的經常使用執行方式

  • 第一種:採用bash或sh+腳本的相對路徑或絕對路徑(不用賦予腳本+x權限)

        sh+腳本的相對路徑

[root@node01 datas] sh helloworld.sh 
Helloworld

        sh+腳本的絕對路徑

[root@node01 datas] sh /home/atguigu/datas/helloworld.sh 
helloworld

        bash+腳本的相對路徑

[root@node01 datas] bash helloworld.sh 
Helloworld

        bash+腳本的絕對路徑

[root@node01 datas] bash /home/atguigu/datas/helloworld.sh 
Helloworld
  • 第二種:採用輸入腳本的絕對路徑或相對路徑執行腳本(必須具備可執行權限+x)

        (a)首先要賦予helloworld.sh 腳本的+x權限

[root@node01 datasdatas]$ chmod 777 helloworld.sh

        (b)執行腳本

        相對路徑

[root@node01 datas datas]$ ./helloworld.sh 
Helloworld

        絕對路徑

[root@node01 datas datas]$ /home/atguigu/datas/helloworld.sh 
Helloworld

        注意:第一種執行方法,本質是bash解析器幫你執行腳本,因此腳本自己不須要執行權限。第二種執行方法,本質是腳本須要本身執行,因此須要執行權限。

  • 3.第二個Shell腳本:多命令處理

        (1)需求:

        在/home/datas目錄下建立一個banzhang.txt,在banzhang.txt文件中增長「I love cls」。

        (2)案例實操:

[root@node01 datas] touch batch.sh
[root@node01 datas] vi batch.sh

在batch.sh中輸入以下內容
#!/bin/bash

cd /home/datas
touch cls.txt
echo "I love cls" >>cls.txt

四、Shell中的變量

4.1 系統變量

        1. 經常使用系統變量

        $HOME$PWD$SHELL$USER

         2. 案例實操

        (1)查看系統變量的值

[root@node01 datas] echo $HOME
/home/node01

        (2)顯示當前Shell中全部變量:set

[root@node01 datas] set
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
....

4.2 自定義變量

        1.基本語法

        (1)定義變量:變量=值

        (2)撤銷變量:unset 變量

        (3)聲明靜態變量:readonly變量,注意:不能unset

        2.變量定義規則

        (1)變量名稱能夠由字母數字下劃線組成,可是不能以數字開頭,環境變量名建議大寫

        (2)等號兩側不能有空格

        (3)在bash中,變量默認類型都是字符串類型,沒法直接進行數值運算。

        (4)變量的值若是有空格,須要使用雙引號或單引號括起來。

        3.案例實操

        (1)定義變量A

[root@node01 datas] A=5
[root@node01 datas] echo $A
5

        (2)給變量A從新賦值

[root@node01 datas] A=8
[root@node01 datas] echo $A
8

        (3)撤銷變量A

[root@node01 datas] unset A
[root@node01 datas] echo $A

        (4)聲明靜態的變量B=2,不能unset

[root@node01 datas] readonly B=2
[root@node01 datas] echo $B
2
[root@node01 datas] B=9
-bash: B: readonly variable

        (5)在bash中,變量默認類型都是字符串類型,沒法直接進行數值運算

[atguigu@hadoop102 ~] C=1+2
[atguigu@hadoop102 ~] echo $C
1+2

        (6)變量的值若是有空格,須要使用雙引號或單引號括起來

[root@node01 ~] D=I love banzhang
-bash: world: command not found
[root@node01 ~] D="I love banzhang"
[root@node01 ~] echo $A
I love banzhang

        (7)可把變量提高爲全局環境變量,可供其餘Shell程序使用

        用法: export 變量名

[root@node01 datas] vim helloworld.sh 

#!/bin/bash

echo "helloworld"
echo $B

[root@node01 datas] ./helloworld.sh 
Helloworld

        發現並無打印輸出變量B的值

[root@node01 datas]export B
[root@node01 datas]./helloworld.sh 
helloworld
2

4.3 特殊變量:$n

        1.基本語法

$n	(功能描述:n爲數字,$0表明該腳本名稱,$1-$9表明第一到第九個參數,十以上的參數須要用大括號包含,如${10}

        2.案例實操

        (1)輸出該腳本文件名稱、輸入參數1和輸入參數2 的值

[root@node01 datas] touch parameter.sh 
[root@node01 datas] vim parameter.sh

#!/bin/bash
echo "$0 $1 $2"

[atguigu@hadoop101 datas] chmod 777 parameter.sh

[atguigu@hadoop101 datas] ./parameter.sh cls  xz
./parameter.sh  cls   xz

4.4 特殊變量:$#

        1.基本語法

$# (功能描述:獲取全部輸入參數個數,經常使用於循環)。

        2.案例實操

        (1)獲取輸入參數的個數

[root@node01 datas] vim parameter.sh

#!/bin/bash
echo "$0 $1 $2"
echo $#

[atguigu@hadoop101 datas] chmod 777 parameter.sh

[atguigu@hadoop101 datas] ./parameter.sh cls  xz
parameter.sh cls xz 
2

4.5 特殊變量:$ *、$@

        1.基本語法

$*	(功能描述:這個變量表明命令行中全部的參數,$*把全部的參數當作一個總體)
$@	(功能描述:這個變量也表明命令行中全部的參數,不過$@把每一個參數區分對待)

        2.案例實操

        (1)打印輸入的全部參數

[root@node01 datas]# bash paramter.sh 1 2 3
paramter.sh 1 2
3
1 2 3
1 2 3

4.6 特殊變量: $?

        1.基本語法

$?	(功能描述:最後一次執行的命令的返回狀態。若是這個變量的值爲0,證實上一個命令正確執行;若是這個變量的值爲非0(具體是哪一個數,由命令本身來決定),則證實上一個命令執行不正確了。)

        2.案例實操

        (1)判斷helloworld.sh腳本是否正確執行

[atguigu@hadoop101 datas] ./helloworld.sh 
hello world
[atguigu@hadoop101 datas] echo $?
0

五、運算符

  1. 基本語法:

(1)「$((運算式))」或「$[運算式]」

(2)expr + , - , \*, /, % 加,減,乘,除,取餘

  1. 案例實操:

    □ 計算3+2的值

[atguigu@hadoop101 datas] expr 2 + 3
5

    □ 計算3-2的值

[atguigu@hadoop101 datas] expr 3 - 2 
1

    □ 計算(2+3)X4的值

        ■ expr一步完成計算

[atguigu@hadoop101 datas] expr `expr 2 + 3` \* 4
20

        ■ 採用$[運算式] 方式

[atguigu@hadoop101 datas]# S=$[(2+3)*4]
[atguigu@hadoop101 datas]# echo $S

六、條件判斷

        1.基本語法

        [ condition ] (注意condition先後要有空格

        注意:條件非空即爲true,[ alice ]返回true,[] 返回false。

        2. 經常使用判斷條件

        <1> 兩個整數之間比較

= 字符串比較
-lt 小於(less than)			-le 小於等於(less equal)
-eq 等於(equal)				-gt 大於(greater than)
-ge 大於等於(greater equal)	-ne 不等於(Not equal)

        <2> 按照文件權限進行判斷

-r 有讀的權限(read)			-w 有寫的權限(write-x 有執行的權限(execute)

        <3> 按照文件類型進行判斷

-f 文件存在而且是一個常規的文件(file)
-e 文件存在(existence)		-d 文件存在並是一個目錄(directory)

        3.案例實操

        (1)23是否大於等於22

[atguigu@hadoop101 datas][ 23 -ge 22 ]
[atguigu@hadoop101 datas]echo $?
0

        (2)helloworld.sh是否具備寫權限

[atguigu@hadoop101 datas][ -w helloworld.sh ]
[root@node01 datas] echo $?
0

        (3)/home/atguigu/cls.txt目錄中的文件是否存在

[root@node01 datas] [ -e /home/atguigu/cls.txt ]
[root@node01 datas] echo $?
1

        (4)多條件判斷(&& 表示前一條命令執行成功時,才執行後一條命令,|| 表示上一條命令執行失敗後,才執行下一條命令)

[root@node01 ~][ condition ] && echo OK || echo notok
OK
[root@node01 datas] [ condition ] && [ ] || echo notok
notok

七、流程控制(重點)

7.1 if 判斷

        1.基本語法

if [ 條件判斷式 ];then 
  程序 
fi 
或者 
if [ 條件判斷式 ] 
  then 
    程序 
fi

        注意事項:

        (1)[ 條件判斷式 ],中括號和條件判斷式之間必須有空格。

        (2)if後要有空格

        2.案例實操

        (1)輸入一個數字,若是是1,則輸出alice zhen shuai,若是是2,則輸出cls zhen mei,若是是其它,什麼也不輸出。

[root@node01 datas] touch if.sh
[root@node01 datas] vim if.sh

#!/bin/bash

if [ $1 -eq "1" ]
then
        echo "alice zhen shuai"
elif [ $1 -eq "2" ]
then
        echo "alice zhen mei"
fi

[root@node01 datas] chmod 777 if.sh 
[root@node01 datas] ./if.sh 1
alice zhen shuai

7.2 case 語句

        1.基本語法

case $變量名 in 
  "值1") 
    若是變量的值等於值1,則執行程序1 
    ;; 
  "值2") 
    若是變量的值等於值2,則執行程序2 
    ;; 
  …省略其餘分支… 
  *) 
    若是變量的值都不是以上的值,則執行此程序 
    ;; 
esac

        注意事項:

# !/bin/bash

case $1 in
"1")
   echo "alice"
;;
"2")
   echo "TomWhite"
;;
*)
   echo "Cindy"
;;
esac

[root@node01 datas] chmod 777 case.sh
[root@node01 datas] ./case.sh 1
1

7.3 for 循環

        1.基本語法1

for (( 初始值;循環控制條件;變量變化 )) 
  do 
    程序 
  done

        2.案例實操

(1)從1加到100

[root@node01 datas] touch for1.sh
[root@node01 datas] vim for1.sh

#!/bin/bash

s=0
for((i=0;i<=100;i++))
do
        s=$[$s+$i]
done
echo $s

[root@node01 datas] chmod 777 for1.sh 
[root@node01 datas] ./for1.sh 
5050

        3.基本語法2

for 變量 in 值1 值2 值3… 
  do 
    程序 
  done

        4.案例實操

        (1)打印全部輸入參數

[root@node01 datas] touch for2.sh
[root@node01 datas] vim for2.sh

#!/bin/bash
#打印數字

for i in $*
 do
   echo "alice is beautiful"
 done

[root@node01 datas] chmod 777 for2.sh 
[root@node01 datas] bash for2.sh cls xz bd
alice is beautiful
alice is beautiful
alice is beautiful

        (2)比較 $* 和 $@ 區別

        (a)$*$@ 都表示傳遞給函數或腳本的全部參數,不被雙引號「」包含時,都以 $1 $2 … $n 的形式輸出全部參數。

#!/bin/bash

for i in $*
do
  echo "alice is beautiful " + $i
done

for j in $@
do echo "TomWhite wrote the first book about hadoop" + $j
done

[root@node01 datas]# bash for.sh cls cz bd
alice is beautiful  + cls
alice is beautiful  + cz
alice is beautiful  + bd
TomWhite wrote the first book about hadoop + cls
TomWhite wrote the first book about hadoop + cz
TomWhite wrote the first book about hadoop + bd

        (b)當它們被雙引號「」包含時,「$*」會將全部的參數做爲一個總體,以「$1 $2 …$n」的形式輸出全部參數;「$@」會將各個參數分開,以「$1」 「$2」…」$n」的形式輸出全部參數。

#!/bin/bash

for i in "$*"
#$*中的全部參數當作是一個總體,因此這個for循環只會循環一次
do
  echo "alice is beautiful " + $i
done

for j in "$@"
#$@中的每一個參數都當作是獨立的,因此「$@」中有幾個參數,就會循環幾回
do echo "TomWhite wrote the first book about hadoop" + $j
done


[root@node01 datas]# bash for.sh cls cz bd
alice is beautiful  + cls cz bd
TomWhite wrote the first book about hadoop + cls
TomWhite wrote the first book about hadoop + cz
TomWhite wrote the first book about hadoop + bd

7.4 While循環

        1.基本語法

while [ 條件判斷式 ] 
  do 
    程序
  done

        2.案例實操

        (1)從1加到100

[root@node01 datas] touch while.sh
[root@node01 datas] vim while.sh

#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
        s=$[$s+$i]
        i=$[$i+1]
done

echo $s

[root@node01 datas] chmod 777 while.sh 
[root@node01 datas] ./while.sh 
5050

八、read讀取控制檯輸入

  1. 基本語法

        read(選項)(參數)

        選項:

  • -p:指定讀取值時的提示符;
  • -t:指定讀取值時等待的時間(秒)

        參數

  • 變量:指定讀取值的變量名
  1. 案例實操

        (1)提示7秒內,讀取控制檯輸入的名稱

[root@node01 datas] touch read.sh
[root@node01 datas] vim read.sh

#!/bin/bash

read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME

[root@node01 datas] bash ./read.sh 
Enter your name in 7 seconds alice
alice

九、函數

9.1 系統函數

        1.basename 基本語法

        basename [string / pathname] [suffix] (功能描述:basename命令會刪掉全部的前綴包括最後一個(‘/’)字符,而後將字符串顯示出來。

        選項:

        suffix爲後綴,若是suffix被指定了,basename會將pathname或string中的suffix去掉

        2.案例實操

        (1)截取該 /home/atguigu/banzhang.txt 路徑的文件名稱

[root@node01 datas] basename /home/atguigu/banzhang.txt 
banzhang.txt
[root@node01 datas] basename /home/atguigu/banzhang.txt .txt
banzhang

        3. dirname 基本語法

        dirname 文件絕對路徑 (功能描述:從給定的包含絕對路徑的文件名中去除文件名(非目錄的部分),而後返回剩下的路徑(目錄的部分))

        4.案例實操

        (1)獲取banzhang.txt文件的路徑

[root@node01 ~]dirname /home/atguigu/banzhang.txt 
/home/atguigu

9.2 自定義函數

        1.基本語法

[ function ] funname[()]
{
	Action;
	[return int;]
}
funname

        2. 經驗技巧

        (1)必須在調用函數地方以前,先聲明函數,shell腳本是逐行運行。不會像其它語言同樣先編譯。

        (2)函數返回值,只能經過 $? 系統變量得到,能夠顯示加:return返回,若是不加,將以最後一條命令運行結果,做爲返回值。return後跟數值n(0-255)

        3.案例實操

        (1)計算兩個輸入參數的和

[root@node01 datas] touch fun.sh
[root@node01 datas] vim fun.sh

#!/bin/bash
function sum()
{
    s=0
    s=$[ $1 + $2 ]
    echo "$s"
}

read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;

[root@node01 datas] chmod 777 fun.sh
[root@node01 datas] ./fun.sh 
Please input the number1: 2
Please input the number2: 5
7

小結

        好啦,到這裏,Shell最基礎,最入門的部分已經介紹完了,感興趣的小夥伴們記得勤加練習😀下一篇博客,菌哥將爲你們帶來Shell的進階——經常使用工具的使用💪。

        若是以上過程當中出現了任何的紕漏錯誤,煩請大佬們指正😅

        受益的朋友或對大數據技術感興趣的夥伴記得點贊關注支持一波🙏

        但願咱們都能在學習的道路上越走越遠😉
在這裏插入圖片描述