寫在前面: 博主是一名軟件工程系大數據應用開發專業的學生,暱稱來源於《愛麗絲夢遊仙境》中的Alice和本身的暱稱。做爲一名互聯網小白,
寫博客一方面是爲了記錄本身的學習歷程,一方面是但願可以幫助到不少和本身同樣處於起步階段的萌新
。因爲水平有限,博客中不免會有一些錯誤,有紕漏之處懇請各位大佬不吝賜教!我的小站:http://alices.ibilibili.xyz/ , 博客主頁:https://alice.blog.csdn.net/
儘管當前水平可能不及各位大佬,但我仍是但願本身可以作得更好,由於一天的生活就是一輩子的縮影
。我但願在最美的年華,作最好的本身
!node
最近有點小忙,心細的朋友們可能已經看出菌已經很久沒更新博客了。可是不慌,該掌握的知識,咋們也不能落下。這一期博客,我也不搞那些花裏胡哨了,專心寫一篇總結Shell精華的博客,也算是爲像Alice同樣的「小小白」謀點福利吧…φ(๑˃∀˂๑)♪
python
首先,博主做爲一個大數據開發人士,先問你們一個問題:程序員爲何須要學習Shell呢?程序員
緣由也很簡單,最明顯的無非就是下面兩點:web
(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
腳本以 #!/bin/bash 開頭(指定解析器)less
(1)需求:建立一個Shell腳本,輸出helloworld運維
(2)案例實操:svg
[root@node01 datas] touch helloworld.sh [root@node01 datas] vi helloworld.sh 在helloworld.sh中輸入以下內容 #!/bin/bash echo "helloworld"
(3)腳本的經常使用執行方式
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
(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解析器幫你執行腳本,因此腳本自己不須要執行權限。第二種執行方法,本質是腳本須要本身執行,因此須要執行權限。
(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
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=() ....
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
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
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
1.基本語法
$* (功能描述:這個變量表明命令行中全部的參數,$*把全部的參數當作一個總體) $@ (功能描述:這個變量也表明命令行中全部的參數,不過$@把每一個參數區分對待)
2.案例實操
(1)打印輸入的全部參數
[root@node01 datas]# bash paramter.sh 1 2 3 paramter.sh 1 2 3 1 2 3 1 2 3
1.基本語法
$? (功能描述:最後一次執行的命令的返回狀態。若是這個變量的值爲0,證實上一個命令正確執行;若是這個變量的值爲非0(具體是哪一個數,由命令本身來決定),則證實上一個命令執行不正確了。)
2.案例實操
(1)判斷helloworld.sh腳本是否正確執行
[atguigu@hadoop101 datas] ./helloworld.sh hello world [atguigu@hadoop101 datas] echo $? 0
(1)「$((運算式))」或「$[運算式]」
(2)expr + , - , \*, /, % 加,減,乘,除,取餘
□ 計算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
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
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
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
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)提示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
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
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的進階——經常使用工具的使用💪。
若是以上過程當中出現了任何的紕漏錯誤,煩請大佬們指正😅
受益的朋友或對大數據技術感興趣的夥伴記得點贊關注支持一波🙏
但願咱們都能在學習的道路上越走越遠😉