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]#