shell腳本

Shell 是一個(gè)用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁.Shell 腳本(shell script)股毫,是一種為 shell 編寫的腳本程序尸诽。業(yè)界所說的 shell 通常都是指 shell 腳本,拉盾,shell 和 shell script 是兩個(gè)不同的概念靴患。Shell 腳本文件的名稱可以任意仍侥,但為了避免被誤以為是普通文件,建議將.sh 后綴加上鸳君,以表示是一個(gè)腳本文件访圃。

初識(shí)shell腳本

#!/bin/bash
# "#" 注釋行,不含第一行
echo hello word!

運(yùn)行shell腳本

chmod +x ./shell1.shh  #使腳本具有執(zhí)行權(quán)限
./shell.shh  #執(zhí)行腳本

shell腳本參數(shù)

  • $0 當(dāng)前腳本的文件名
  • $n 傳遞給腳本或函數(shù)的參數(shù)相嵌。n 是一個(gè)數(shù)字,表示第幾個(gè)參數(shù)况脆。例如饭宾,第一個(gè)參數(shù)是1, 第二個(gè)參數(shù)是2
  • $# 傳遞給腳本或函數(shù)的參數(shù)個(gè)數(shù)
  • $* 傳遞給腳本或函數(shù)的所有參數(shù)
  • $@ 傳遞給腳本或函數(shù)的所有參數(shù)格了。被雙引號(hào)(" ")包含時(shí)看铆,與 $* 稍有不同
  • $? 上個(gè)命令的退出狀態(tài),或函數(shù)的返回值盛末。一般情況下弹惦,大部分命令執(zhí)行成功會(huì)返回 0,失敗返回 1
  • $$ 當(dāng)前Shell進(jìn)程ID悄但。對(duì)于 Shell 腳本棠隐,就是這些腳本所在的進(jìn)程ID
[root@virtualLinux file]# cat sshel1.sh
#!/bin/bash
echo "Shell腳本名為$0"
echo "總共有$#個(gè)參數(shù),分別是$*"
echo "第一個(gè)參數(shù)為$1,第三個(gè)參數(shù)為$3"
echo "執(zhí)行l(wèi)s -l 命令"
ls -l
echo "執(zhí)行l(wèi)s -l 命令檐嚣,執(zhí)行狀態(tài)碼為$?"

運(yùn)行

[root@virtualLinux file]# sh sshel1.sh one two three
Shell腳本名為sshel1.sh
總共有3個(gè)參數(shù)助泽,分別是one two three
第一個(gè)參數(shù)為one,第三個(gè)參數(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 腳本中的條件測(cè)試語法可以判斷表達(dá)式是否成立嚎京,若條件成立則返回?cái)?shù)字 0嗡贺,否則便返回其他隨機(jī)數(shù)值。
測(cè)試語句格式:[ 條件表達(dá)式 ]
按照測(cè)試對(duì)象來劃分鞍帝,條件測(cè)試語句可以分為 4 種:

  • 文件測(cè)試語句诫睬;
  • 邏輯測(cè)試語句;
  • 整數(shù)值比較語句帕涌;
  • 字符串比較語句摄凡。

文件測(cè)試所用的參數(shù)

  • -d 測(cè)試文件是否為目錄類型
  • -e 測(cè)試文件是否存在
  • -f 判斷是否為一般文件類型
  • -r 測(cè)試當(dāng)前用戶是否有權(quán)限讀取
  • -w 測(cè)試當(dāng)前用戶是否有權(quán)限寫入
  • -x 測(cè)試當(dāng)前用戶是否有執(zhí)行權(quán)限

判斷一個(gè)文件是目錄還是文件

[root@virtualLinux file]# [ -d /home/vsftpd/java/file ]
[root@virtualLinux file]# echo $?
0
[root@virtualLinux file]#

與邏輯续徽,判斷當(dāng)前對(duì)象是目錄就輸出folder

[root@virtualLinux file]# [ -d test ]
[root@virtualLinux file]# echo $?
0
[root@virtualLinux file]# [ -d test ] && echo "folder"
folder
[root@virtualLinux file]#

或邏輯,判斷當(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]$

非邏輯架谎,判斷當(dāng)前用戶是否為root用戶

[root@virtualLinux ~]# [ $USER = root ] && echo "root"
root
[root@virtualLinux ~]#

在執(zhí)行[ 條件表達(dá)式 ] 后炸宵,如果條表達(dá)式成了,&& 與條件后面的命令會(huì)執(zhí)行谷扣,如果不成立土全,與條件后面的命令不會(huì)執(zhí)行。如果條件表達(dá)式后面跟的是||或條件会涎,如果條件表達(dá)不成立會(huì)執(zhí)行裹匙,如果成立不會(huì)執(zhí)行

條件表達(dá)式的執(zhí)行

[root@virtualLinux ~]# [ ! $USER = root ] && echo "root" || echo "other"
other
[root@virtualLinux ~]#

先條件判斷用戶為root,然后!取非,反條件末秃,執(zhí)行個(gè)與運(yùn)算不成立概页,執(zhí)行的第二或運(yùn)算,輸出的other练慕。

整數(shù)比較的運(yùn)算符

  • -eq 是否等于
  • -ne 是否不等于
  • -gt 是否大于
  • -lt 是否小于
  • -le 是否等于或小于
  • -ge 是否大于或等于

做一個(gè)簡(jiǎn)單的數(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)容是否為空

一個(gè)沒有定義的變量判斷為空后賦值再次空判斷

[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)
if 條件
    then 命令
fi

示例:

[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 它只進(jìn)行一次if條件悯仙,如果滿足執(zhí)行then 不滿足執(zhí)行else龄毡。
ping 命令中 -c定義重試次數(shù),-i定義重發(fā)間隔時(shí)間锡垄,-W定義參數(shù)超時(shí)等待時(shí)間

示例: 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ù)用于向用戶顯示一定的提示信息。
示例: 根據(jù)輸入的成績(jī)輸出對(duì)應(yīng)的字符串

[root@virtualLinux shell]# vim test4.sh
[root@virtualLinux shell]# more test4.sh
#!/bin/bash
read -p "請(qǐng)輸入成績(jī):" 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
請(qǐng)輸入成績(jī):85
優(yōu)
[root@virtualLinux shell]# bash test4.sh
請(qǐng)輸入成績(jī):55
不合格
[root@virtualLinux shell]# bash test4.sh
請(qǐng)輸入成績(jī):76
良
[root@virtualLinux shell]# Linux shell]#

for 條件循環(huán)語句

for 循環(huán)在處理范圍數(shù)據(jù)時(shí)粟按,是最適合是诬滩,它可以讀取文本數(shù),也可以做自己的循環(huán)
語法格式

for 變量名 in 取值列表
do 
    命令序列
done
------------------------------------
for 變量名 in 列表文件
do 
    命令序列
done

示例:循環(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)灭将,需用反引號(hào)``’
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)疼鸟,需用反引號(hào)’
test1.sh
test2.sh
test3.sh
test4.sh
test5.sh
test.sh
[root@virtualLinux shell]#

while 條件循環(huán)語句

while是不斷的重復(fù)循環(huán)執(zhí)行,直到循環(huán)條件為false,或者執(zhí)行exit 0命令才會(huì)退出循環(huán)
語法格式

while 條件
 do 命名序列
done

示例: 做一個(gè)循環(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]#
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庙曙,一起剝皮案震驚了整個(gè)濱河市空镜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捌朴,老刑警劉巖吴攒,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異砂蔽,居然都是意外死亡洼怔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門察皇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泽台,你說我怎么就攤上這事什荣。” “怎么了怀酷?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵稻爬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我蜕依,道長(zhǎng)桅锄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任样眠,我火速辦了婚禮友瘤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘檐束。我一直安慰自己辫秧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布被丧。 她就那樣靜靜地躺著盟戏,像睡著了一般绪妹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柿究,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天邮旷,我揣著相機(jī)與錄音,去河邊找鬼蝇摸。 笑死婶肩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的探入。 我是一名探鬼主播狡孔,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜂嗽!你這毒婦竟也來了苗膝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤植旧,失蹤者是張志新(化名)和其女友劉穎辱揭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體病附,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡问窃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了完沪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片域庇。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖覆积,靈堂內(nèi)的尸體忽然破棺而出听皿,到底是詐尸還是另有隱情,我是刑警寧澤宽档,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布尉姨,位于F島的核電站,受9級(jí)特大地震影響吗冤,放射性物質(zhì)發(fā)生泄漏又厉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一椎瘟、第九天 我趴在偏房一處隱蔽的房頂上張望覆致。 院中可真熱鬧,春花似錦肺蔚、人聲如沸篷朵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽声旺。三九已至笔链,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腮猖,已是汗流浹背鉴扫。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澈缺,地道東北人坪创。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像姐赡,于是被迫代替她去往敵國(guó)和親莱预。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348