準(zhǔn)備學(xué)習(xí)下大數(shù)據(jù)鹃骂,查了下大數(shù)據(jù)的學(xué)習(xí)步驟,首先進行Linux的學(xué)習(xí)。Linx日常開發(fā)中還是經(jīng)常使用到的蚣常,不過也沒有系統(tǒng)的去學(xué)習(xí)過,畢竟公司也有運維,也就偷懶了熔酷。本文是根據(jù)劉遄老是的Linux就該這么學(xué),做的閱讀筆記。如果對這本書有興趣羹应,可以在https://www.linuxprobe.com/docs/LinuxProbe.pdf 在線閱讀,當(dāng)然為了表示支持裸违,我自己也還是買了本實體書,哈哈ヾ?≧?≦)o
簡單的Shell腳本
Shell 是一個用 C 語言編寫的程序涌穆,它是用戶使用 Linux 的橋梁.Shell 腳本(shell script)朱监,是一種為 shell 編寫的腳本程序奋隶。業(yè)界所說的 shell 通常都是指 shell 腳本唯欣,嘹吨,shell 和 shell script 是兩個不同的概念。Shell 腳本文件的名稱可以任意境氢,但為了避免被誤以為是普通文件蟀拷,建議將.sh 后綴加上碰纬,以表示是一個腳本文件。
例1:一個簡單的Shell腳步悦析,顯示當(dāng)前目錄
#!/bin/bash
# 這個是一行注釋
pwd
ls -al
第一行:腳本聲明(#!)用來告訴系統(tǒng)使用哪種 Shell 解釋器來執(zhí)行該腳本道媚。
第二行:第二行的注釋信息(#)是對腳本的注釋掐隐,不一定非要寫到第二行光羞,根據(jù)需要來寫。
第三行:第三行和以后的都是我們的腳本命令。
執(zhí)行一下,執(zhí)行shell腳本有兩種方法,設(shè)置執(zhí)行權(quán)限或者bash 腳本名,這里用第二種呆贿,發(fā)現(xiàn)出現(xiàn)預(yù)期結(jié)果蒋情。
chmod +x ./test.sh #使腳本具有執(zhí)行權(quán)限
./test.sh #執(zhí)行腳本
[root@virtualLinux file]# bash test.sh
/home/vsftpd/java/file
總用量 8
drwxr-xr-x. 4 ftpuser ftp 65 10月 27 19:18 .
drwx------. 3 ftpuser ftp 74 5月 13 00:15 ..
drwxr-xr-x. 2 ftpuser ftp 63 10月 16 22:44 test
drwxr-xr-x. 3 root root 18 10月 7 19:32 test2
-rw-r--r--. 1 ftpuser ftp 46 10月 27 19:18 test.sh
-rw-r--r--. 1 root root 230 10月 7 19:29 test.tar.gz
[root@virtualLinux file]#
接收用戶參數(shù)
在實際的使用過程中护桦,腳本可能會根據(jù)情況傳遞參數(shù)因妙,在Shell中据德,已經(jīng)設(shè)置好了需要傳遞的參數(shù)方法系冗。Linux 系統(tǒng)中的 Shell 腳本語言早就考慮到了這些,已經(jīng)內(nèi)設(shè)了用于接收參數(shù)的變量棋弥,變量之間可以使用空格間隔。例如$0
對應(yīng)的是當(dāng)前 Shell 腳本程序的名稱,$#
對應(yīng)的是總共有幾個參數(shù)阶牍,$*
對應(yīng)的是所有位置的參數(shù)值芒澜,$?
對應(yīng)的是顯示上一次命令的執(zhí)行返回值,而$1创淡、$2痴晦、$3……
則分別對應(yīng)著第N個位置的參數(shù)值。
變量 | 含義 |
---|---|
$0 | 當(dāng)前腳本的文件名 |
$n | 傳遞給腳本或函數(shù)的參數(shù)琳彩。n 是一個數(shù)字誊酌,表示第幾個參數(shù)。例如露乏,第一個參數(shù)是2 |
$# | 傳遞給腳本或函數(shù)的參數(shù)個數(shù) |
$* | 傳遞給腳本或函數(shù)的所有參數(shù) |
$@ | 傳遞給腳本或函數(shù)的所有參數(shù)。被雙引號(" ")包含時瘟仿,與 $* 稍有不同 |
$? | 上個命令的退出狀態(tài)箱锐,或函數(shù)的返回值。一般情況下劳较,大部分命令執(zhí)行成功會返回 0驹止,失敗返回 1 |
$$ | 當(dāng)前Shell進程ID。對于 Shell 腳本观蜗,就是這些腳本所在的進程ID |
$*
和 $@
的區(qū)別
@ 都表示傳遞給函數(shù)或腳本的所有參數(shù)臊恋,不被雙引號(" ")包含時,都以"2" … "*` 會將所有的參數(shù)作為一個整體,以"2 … @" 會將各個參數(shù)分開岸售,以"2" … "$n" 的形式輸出所有參數(shù)。
例1:測試一下各個參數(shù)的用法
[root@virtualLinux file]# cat test1.sh
#!/bin/bash
echo "Shell腳本名為$0"
echo "總共有$#個參數(shù)厂画,分別是$*"
echo "第一個參數(shù)為$1,第三個參數(shù)為$3"
echo "執(zhí)行l(wèi)s -l 命令"
ls -l
echo "執(zhí)行l(wèi)s -l 命令凸丸,執(zhí)行狀態(tài)碼為$?"
[root@virtualLinux file]# sh test1.sh one two three
Shell腳本名為test1.sh
總共有3個參數(shù),分別是one two three
第一個參數(shù)為one,第三個參數(shù)為three
執(zhí)行l(wèi)s -l 命令
總用量 12
drwxr-xr-x. 2 ftpuser ftp 63 10月 16 22:44 test
-rw-r--r--. 1 root root 211 10月 28 19:24 test1.sh
drwxr-xr-x. 3 root root 18 10月 7 19:32 test2
-rw-r--r--. 1 ftpuser ftp 46 10月 27 19:18 test.sh
-rw-r--r--. 1 root root 230 10月 7 19:29 test.tar.gz
執(zhí)行l(wèi)s -l 命令袱院,執(zhí)行狀態(tài)碼為0
[root@virtualLinux file]#
判斷用戶的參數(shù)
Shell 腳本中的條件測試語法可以判斷表達式是否成立屎慢,若條件成立則返回數(shù)字 0瞭稼,否則便返回其他隨機數(shù)值。
測試語句格式:
[ 條件表達式 ]
按照測試對象來劃分腻惠,條件測試語句可以分為 4 種:
? 文件測試語句环肘;
? 邏輯測試語句;
? 整數(shù)值比較語句集灌;
? 字符串比較語句悔雹。
文件測試所用的參數(shù)
運算符 | 作用 |
---|---|
-d | 測試文件是否為目錄類型 |
-e | 測試文件是否存在 |
-f | 判斷是否為一般文件類型 |
-r | 測試當(dāng)前用戶是否有權(quán)限讀取 |
-w | 測試當(dāng)前用戶是否有權(quán)限寫入 |
-x | 測試當(dāng)前用戶是否有執(zhí)行權(quán)限 |
例1:判斷一個文件是目錄還是文件
[root@virtualLinux file]# [ -d /home/vsftpd/java/file ]
[root@virtualLinux file]# echo $?
0
[root@virtualLinux file]#
任何語言都離不開邏輯運算,在Shell腳本中也一樣欣喧,有與運算腌零,符號&&、或運算唆阿,運算符||益涧、非運算,運算符!驯鳖。
例1:與邏輯闲询,判斷當(dāng)前對象是目錄就輸出folder
[root@virtualLinux file]# [ -d test ]
[root@virtualLinux file]# echo $?
0
[root@virtualLinux file]# [ -d test ] && echo "folder"
folder
[root@virtualLinux file]#
例2:或邏輯,判斷當(dāng)前用戶是否為root用戶
[root@virtualLinux file]# echo $USER
root
[root@virtualLinux file]# [ $USER = root ] || echo "login is root"
[root@virtualLinux file]# su oracle
[oracle@virtualLinux file]$ [ $USER = root ] || echo "login not root"
login not root
[oracle@virtualLinux file]$
例3:非邏輯浅辙,判斷當(dāng)前用戶是否為root用戶
[root@virtualLinux ~]# [ $USER = root ] && echo "root"
root
[root@virtualLinux ~]#
由上面三個例子可以看出嘹裂,在執(zhí)行[ 條件表達式 ]
后,如果條表達式成了摔握,&&
與條件后面的命令會執(zhí)行,如果不成立丁寄,與條件后面的命令不會執(zhí)行氨淌。如果條件表達式后面跟的是||
或條件,如果條件表達不成立會執(zhí)行伊磺,如果成立不會執(zhí)行盛正。
例4:演示條件表達式的執(zhí)行
[root@virtualLinux ~]# [ ! $USER = root ] && echo "root" || echo "other"
other
[root@virtualLinux ~]#
例4可以看出,先條件判斷用戶為root,然后!
取非屑埋,反條件豪筝,執(zhí)行個與運算不成立,執(zhí)行的第二或運算摘能,輸出的other续崖。
在linux中和java正好相反,字符串比較用等號团搞,對數(shù)字的操作不能使用數(shù)學(xué)中的比較符號严望。
整數(shù)比較的運算符
運算符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
例1:做一個簡單的數(shù)字大小判斷
root@virtualLinux ~]# [ 10 -eq 10 ]
[root@virtualLinux ~]# echo $?
0
[root@virtualLinux ~]# [ 10 -lt 2 ]
[root@virtualLinux ~]# echo $?
1
[root@virtualLinux ~]# [ 10 -gt 2 ]
[root@virtualLinux ~]# echo $?
0
[root@virtualLinux ~]#
常見的字符串比較
運算符 | 作用 |
---|---|
= | 比較字符串是否相同 |
!= | 比較字符串是否不同 |
-z | 判斷字符串內(nèi)容是否為空 |
例1:一個沒有定義的變量判斷為空后賦值再次空判斷
[root@virtualLinux ~]# echo $String
[root@virtualLinux ~]# [ -z $String ]
[root@virtualLinux ~]# echo $?
0
[root@virtualLinux ~]# String="123"
[root@virtualLinux ~]# echo $String
123
[root@virtualLinux ~]# [ -z $String ]
[root@virtualLinux ~]# echo $?
1
[root@virtualLinux ~]#
流程控制語句
if、for逻恐、while像吻、case 在Shell腳本中必不可少的峻黍,應(yīng)該說在現(xiàn)在所有的編程語言都離不開這4中流程控制語句。
if 條件語句
if 條件語句分為單分支結(jié)構(gòu)拨匆,雙分支結(jié)構(gòu)姆涩,多分支結(jié)構(gòu)三種。
單分支結(jié)構(gòu)
單分支結(jié)構(gòu)就是只有一個條件惭每,如果條件成立骨饿,執(zhí)行預(yù)設(shè)的命令。
語法格式
if 條件
then 命令
fi
例1
[root@virtualLinux shell]# ls
test1.sh test.sh
[root@virtualLinux shell]# vim test2.sh
[root@virtualLinux shell]# cat test2.sh
#!/bin/bash
File="test.sh"
if [ -e $File ]
then echo "find file"
fi
[root@virtualLinux shell]# bash test2.sh
find file
[root@virtualLinux shell]#
雙分支結(jié)構(gòu)
雙分支結(jié)構(gòu)語法關(guān)鍵字if then else if 它只進行一次if條件洪鸭,如果滿足執(zhí)行then 不滿足執(zhí)行else样刷。
ping 命令中 -c定義重試次數(shù),-i定義重發(fā)間隔時間览爵,-W定義參數(shù)超時等待時間
例1:ping 百度置鼻,如果能連通輸出在線,不能連通輸出不在線
[root@virtualLinux shell]# more test3.sh
#!/bin/bash
ping -c 3 -i 0.5 -W 3 www.baidu.com
if [ $? -eq 0 ]
then echo "on-line"
else echo "off-line"
fi
[root@virtualLinux shell]# bash test3.sh
PING www.a.shifen.com (180.97.33.108) 56(84) bytes of data.
64 bytes from www.baidu.com (180.97.33.108): icmp_seq=1 ttl=54 time=40.7 ms
64 bytes from www.baidu.com (180.97.33.108): icmp_seq=2 ttl=54 time=39.5 ms
64 bytes from www.baidu.com (180.97.33.108): icmp_seq=3 ttl=54 time=37.5 ms
--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1004ms
rtt min/avg/max/mdev = 37.519/39.277/40.771/1.340 ms
on-line
[root@virtualLinux shell]#
多分支結(jié)構(gòu)
多分支結(jié)構(gòu)就是if,then,elsif,else,fi關(guān)鍵字組成蜓竹,相當(dāng)于口語的如果箕母。。俱济。嘶是。那么,如果蛛碌。聂喇。。那么蔚携。希太。。
在 Linux 系統(tǒng)中酝蜒,read 是用來讀取用戶輸入信息的命令誊辉, 能夠把接收到的用戶輸入信息賦值給后面的指定變量,-p 參數(shù)用于向用戶顯示一定的提示信息亡脑。
例1:根據(jù)輸入的成績輸出對應(yīng)的字符串
[root@virtualLinux shell]# vim test4.sh
[root@virtualLinux shell]# more test4.sh
#!/bin/bash
read -p "請輸入成績:" GRADE
if [ $GRADE -ge 80 ]
then echo "優(yōu)"
elif [ $GRADE -lt 80 ] && [ $GRADE -ge 70 ]
then echo "良"
elif [ $GRADE -lt 70 ] && [ $GRADE -ge 60 ]
then echo "合格"
else
echo "不合格"
fi
[root@virtualLinux shell]# bash test4.sh
請輸入成績:85
優(yōu)
[root@virtualLinux shell]# bash test4.sh
請輸入成績:55
不合格
[root@virtualLinux shell]# bash test4.sh
請輸入成績:76
良
[root@virtualLinux shell]# Linux shell]#
for 條件循環(huán)語句
for 循環(huán)在處理范圍數(shù)據(jù)時堕澄,是最適合是,它可以讀取文本數(shù)霉咨,也可以做自己的循環(huán)
語法格式
for 變量名 in 取值列表
do
命令序列
done
for 變量名 in 列表文件
do
命令序列
done
例1:循環(huán)輸出數(shù)字或者目錄
[root@virtualLinux shell]# ls
test1.sh test2.sh test3.sh test4.sh test5.sh test.sh
[root@virtualLinux shell]# cat test5.sh
#!/bin/bash
for num in {1..10}
do
echo $num;
done
for ((i=1;i<10;i++));
do
echo $i;
done
echo ‘在for執(zhí)行命令循環(huán)蛙紫,需用反引號``’
for str in `ls`;
do
echo $str;
done
[root@virtualLinux shell]# bash test5.sh
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
‘在for執(zhí)行命令循環(huán),需用反引號’
test1.sh
test2.sh
test3.sh
test4.sh
test5.sh
test.sh
[root@virtualLinux shell]#
最后一個執(zhí)行l(wèi)s 命令的也可以執(zhí)行文件,例如cat xxx.txt
while 條件循環(huán)語句
while是不斷的重復(fù)循環(huán)執(zhí)行躯护,直到循環(huán)條件為false,或者執(zhí)行exit 0命令才會退出循環(huán)
語法格式
while 條件
do 命名序列
done
列1:做一個循環(huán)
[root@virtualLinux shell]# cat test6.sh
#!/bib/bash
flag=true
num=1
while $flag
do
echo $num;
num=`expr $num + 1`;
if [ $num -eq 3 ]
then flag=false;
fi
done
num2=5
while true
do
echo $num2
num2=`expr $num2 + 1`;
if [ $num2 -eq 7 ]
then exit 0
fi
done
[root@virtualLinux shell]# bash test6.sh
1
2
5
6
[root@virtualLinux shell]#
case 條件語句
case條件就是java中的switch非常相似惊来,使用場景基本相同
case 變量值 in
條件1)
命令1
;;
條件2)
命令2
;;
條件3)
命令3
;;
......
*)
默認(rèn)命令
esac
1、) 相當(dāng)于其他語言中的default棺滞。
2裁蚁、除了)模式矢渊,各個分支中;;是必須的,;;相當(dāng)于其他語言中的break
3枉证、 | 分割多個模式矮男,相當(dāng)于or
例1:一個簡單的case 語句
[root@virtualLinux shell]# cat test8.sh
#!/bin/bash
read -p "請輸入一個字符,并按 Enter 鍵確認(rèn):" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "您輸入的是 字母室谚。"
;;
[0-9])
echo "您輸入的是 數(shù)字毡鉴。"
;;
*)
echo "您輸入的是 空格、功能鍵或其他控制字符秒赤。"
esac
[root@virtualLinux shell]# bash test8.sh
請輸入一個字符猪瞬,并按 Enter 鍵確認(rèn):1
您輸入的是 數(shù)字。
[root@virtualLinux shell]#