Shell命令腳本初步認(rèn)識霸妹,Shell腳本入門

準(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ù)是1碧浊,第二個參數(shù)是2
$# 傳遞給腳本或函數(shù)的參數(shù)個數(shù)
$* 傳遞給腳本或函數(shù)的所有參數(shù)
$@ 傳遞給腳本或函數(shù)的所有參數(shù)。被雙引號(" ")包含時瘟仿,與 $* 稍有不同
$? 上個命令的退出狀態(tài)箱锐,或函數(shù)的返回值。一般情況下劳较,大部分命令執(zhí)行成功會返回 0驹止,失敗返回 1
$$ 當(dāng)前Shell進程ID。對于 Shell 腳本观蜗,就是這些腳本所在的進程ID

$*$@ 的區(qū)別
* 和@ 都表示傳遞給函數(shù)或腳本的所有參數(shù)臊恋,不被雙引號(" ")包含時,都以"1" "2" … "n" 的形式輸出所有參數(shù)嫂便。 但是當(dāng)它們被雙引號(" ")包含時捞镰,`*` 會將所有的參數(shù)作為一個整體,以"12 … n"的形式輸出所有參數(shù)毙替;"@" 會將各個參數(shù)分開岸售,以"1" "2" … "$n" 的形式輸出所有參數(shù)。

image.png

例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]#
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末入篮,一起剝皮案震驚了整個濱河市陈瘦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌潮售,老刑警劉巖痊项,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酥诽,居然都是意外死亡鞍泉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門肮帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咖驮,“玉大人,你說我怎么就攤上這事训枢∮窝兀” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵肮砾,是天一觀的道長。 經(jīng)常有香客問我袋坑,道長仗处,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任枣宫,我火速辦了婚禮婆誓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘也颤。我一直安慰自己洋幻,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布翅娶。 她就那樣靜靜地躺著文留,像睡著了一般好唯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上燥翅,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天骑篙,我揣著相機與錄音,去河邊找鬼森书。 笑死靶端,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凛膏。 我是一名探鬼主播杨名,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猖毫!你這毒婦竟也來了台谍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤鄙麦,失蹤者是張志新(化名)和其女友劉穎典唇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胯府,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡介衔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了骂因。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炎咖。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寒波,靈堂內(nèi)的尸體忽然破棺而出乘盼,到底是詐尸還是另有隱情,我是刑警寧澤俄烁,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布绸栅,位于F島的核電站,受9級特大地震影響页屠,放射性物質(zhì)發(fā)生泄漏粹胯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一辰企、第九天 我趴在偏房一處隱蔽的房頂上張望风纠。 院中可真熱鬧,春花似錦牢贸、人聲如沸竹观。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臭增。三九已至懂酱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間速址,已是汗流浹背玩焰。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芍锚,地道東北人昔园。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像并炮,于是被迫代替她去往敵國和親默刚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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