1、 if 判斷一些特殊用法
if [ -z $a ] 這個表示當變量a的值為空時會怎麼樣
if [ ! -e file ]; then 表示檔案不存在時會怎麼樣
if (($a<1)); then …等同于 if [ $a -lt 1 ]; then… [ ] 中不能使用<,>,==,!=,>=,<=這樣的符号
$3不存在,是以n為空;判斷是否為空;
1
2
3
4
5
<code>[root@yong ~]</code><code># n=`wc -l /etc/passwd|awk '{print $3}'`</code>
<code>[root@yong ~]</code><code># echo $n</code>
<code>[root@yong ~]</code><code># if [ -z $n ];then echo "\$n is null";fi</code>
<code>$n is null</code>
if grep -q '123' 1.txt; then 表示如果1.txt中含有'123'的行時會怎麼樣?
1.txt中含有123;grep -q '123' 1.txt 比對OK,傳回值為真;
<code>[root@localhost shell]</code><code># cat 1.txt</code>
<code>123</code>
<code>sdwe</code>
<code>[root@localhost shell]</code><code># if grep -q "123" 1.txt ;then echo kong;fi</code>
<code>kong</code>
2、 shell中的case判斷
6
7
8
9
10
11
12
13
14
15
16
<code>格式: </code><code>case</code> <code>變量名 </code><code>in</code>
<code> </code><code>value1)</code>
<code> </code><code>command</code>
<code> </code><code>;;</code>
<code> </code><code>value2)</code>
<code> </code><code>*)</code>
<code> </code><code>commond</code>
<code> </code><code>;;</code>
<code> </code><code>esac</code>
<code>在</code><code>case</code><code>程式中,可以在條件中使用 |,表示或的意思, 比如</code>
<code>2|3)</code>
<code> </code><code>command</code>
<code> </code><code>;;</code>
<code>當變量為2或者3時,執行該部分指令。</code>
/etc/init.d/naginx 裡面有case語句;比對輸入的第一個參數是否為start stop reload restart conifgtest,輸入其他字元則傳回
Usage: /etc/init.d/nginx {start|stop|reload|restart|configtest}
17
18
19
20
<code>case</code> <code>"$1"</code> <code>in</code>
<code> </code><code>start)</code>
<code> </code><code>start</code>
<code> </code><code>;;</code>
<code> </code><code>stop)</code>
<code> </code><code>stop</code>
<code> </code><code>reload)</code>
<code> </code><code>reload</code>
<code> </code><code>restart)</code>
<code> </code><code>restart</code>
<code> </code><code>configtest)</code>
<code> </code><code>configtest</code>
<code> </code><code>*)</code>
<code> </code><code>echo</code> <code>$</code><code>"Usage: $0 {start|stop|reload|restart|configtest}"</code>
<code> </code><code>RETVAL=1</code>
<code>esac</code>
舉例,輸入的是字母,提示輸入一個純數字,輸入數字判斷是偶數或奇數;
21
22
23
24
<code>[root@localhost 0618]</code><code># cat case1.sh </code>
<code>#!/bin/bash</code>
<code>#要求輸入的是數字,判斷奇數或偶數;非數字則提示輸入數字,然後退出;</code>
<code>read</code> <code>-p </code><code>"please input a number:"</code> <code>n</code>
<code>n1=`</code><code>echo</code> <code>$n|</code><code>sed</code> <code>'s/[0-9]//g'</code><code>`</code>
<code>#輸入為數字則sed替換為空,傳回值為空;輸入為字母則傳回值不為空;</code>
<code>if</code> <code>[ ! -z $n1 ]</code>
<code>then</code>
<code> </code><code>echo</code> <code>"please input a number "</code>
<code>exit</code> <code>1</code>
<code>fi</code>
<code>n2=$[$n%2]</code>
<code>case</code> <code>$n2 </code><code>in</code>
<code> </code><code>0)</code>
<code> </code><code>echo</code> <code>"偶數"</code>
<code> </code><code>;; </code>
<code> </code><code>1) </code>
<code> </code><code>echo</code> <code>"奇數"</code>
<code> </code><code>*) </code>
<code> </code><code>echo</code> <code>"不存在"</code>
<code>[root@localhost 0618]</code><code># sh -x case1.sh </code>
<code>+ </code><code>read</code> <code>-p </code><code>'please input a number:'</code> <code>n</code>
<code>please input a number:</code>
<code>de2</code>
<code>++ </code><code>echo</code> <code>de2</code>
<code>++ </code><code>sed</code> <code>'s/[0-9]//g'</code>
<code>+ n1=de</code>
<code>+ </code><code>'['</code> <code>'!'</code> <code>-z de </code><code>']'</code>
<code>+ </code><code>echo</code> <code>'please input a number '</code>
<code>please input a number </code>
<code>+ </code><code>exit</code> <code>1</code>
<code>[root@localhost 0618]</code><code># sh case1.sh </code>
<code>please input a number:234</code>
<code>偶數</code>
<code>please input a number:we</code>
<code>please input a number</code>
case實驗2:輸入為空則提示輸入數字然後退出;輸入的數字在0-100内判斷成績;輸入為非數字則提示輸入數字然後退出;
輸入負數和大于100的都會提示輸入的數字為0-100;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<code>#!/bin/bash#case實驗,輸入為空提示輸入數字然後退出;輸入的數字在0-100内判斷成績;輸入的非數字提示輸入數字然後退出;</code>
<code>if</code> <code>[ -z $n ]</code>
<code> </code><code>echo</code> <code>"Please input a number"</code>
<code> </code><code>exit</code> <code>1</code>
<code>n1=`</code><code>echo</code> <code>$n|</code><code>sed</code> <code>'s/[-0-9]//g'</code><code>`</code>
<code>#sed替換加了-表示負數;</code>
<code>then</code>
<code> </code><code>echo</code> <code>"please input a number "</code>
<code>if</code> <code>[ $n -</code><code>ge</code> <code>0 ] && [ $n -lt 60 ]</code>
<code> </code><code>tag=1</code>
<code>elif</code> <code>[ $n -</code><code>ge</code> <code>60 ] && [ $n -lt 80 ]</code>
<code> </code><code>tag=2</code>
<code>elif</code> <code>[ $n -</code><code>ge</code> <code>80 ] && [ $n -lt 90 ]</code>
<code> </code><code>tag=3</code>
<code>elif</code> <code>[ $n -</code><code>ge</code> <code>90 ] && [ $n -</code><code>le</code> <code>100 ]</code>
<code> </code><code>tag=4</code>
<code>else</code>
<code> </code><code>tag=0</code>
<code>case</code> <code>$tag </code><code>in</code>
<code> </code><code>1)</code>
<code> </code><code>echo</code> <code>"不及格"</code>
<code> </code><code>;; </code>
<code> </code><code>2) </code>
<code> </code><code>echo</code> <code>"及格"</code>
<code> </code><code>;; </code>
<code> </code><code>3) </code>
<code> </code><code>echo</code> <code>"良好"</code>
<code> </code><code>;; </code>
<code> </code><code>4) </code>
<code> </code><code>echo</code> <code>"優秀"</code>
<code> </code><code>*) </code>
<code> </code><code>echo</code> <code>"輸入的數字為0-100"</code>
<code> </code><code>;;</code>
<code>[root@localhost 0618]</code><code># sh case2.sh </code>
<code>please input a number:-200</code>
<code>輸入的數字為0-100</code>
<code>please input a number:101</code>
3、 shell腳本中的循環
for循環 文法結構:for 變量名 in 條件; do … done
while 循環文法結構: while 條件; do … done 死循環用:表示
break直接結束本層循環; continue忽略continue之下的代碼,直接進行下一次循環
exit 直接退出shell
for循環實驗:列出/etc目錄下所有的目錄
<code>[root@yong ~]</code><code># cat for.sh </code>
<code>for</code> <code>f </code><code>in</code> <code>`</code><code>ls</code> <code>/etc/</code><code>`</code>
<code>do</code>
<code>if</code> <code>[ -d </code><code>/etc/</code><code>$f ]</code>
<code> </code><code>ls</code> <code>-d </code><code>"/etc/$f"</code>
<code>done</code>
while循環實驗:判斷負載的循環;
<code>[root@yong ~]</code><code># cat load.sh </code>
<code>#監測負載的腳本,取w負載1分鐘内的負載值如果大于10,則30秒發一次郵件;</code>
<code>while</code> <code>:</code>
<code>load=`w |</code><code>head</code> <code>-1 |</code><code>awk</code> <code>-F </code><code>"load average: "</code> <code>'{print $2}'</code><code>|</code><code>cut</code> <code>-d. -f1`</code>
<code>if</code> <code>[ $load -gt 10 ]</code>
<code> </code><code>top</code><code>|mail -s </code><code>"load is high:$load"</code> <code>[email protected]</code>
<code> </code><code>exit</code> <code>0</code>
<code> </code><code>sleep</code> <code>30</code>
while循環實驗:
如果輸入為空,提示要求輸入東西,如果輸入字元提示輸入純數字,輸入純數字列印數字,退出;
<code>[root@localhost 0618]</code><code># cat while.sh </code>
<code>#輸入為空,提示輸入東西一直到輸入不為空結束;如輸入的是字母則提示隻能輸入一個純數字,直到輸入純數字為止,列印數字結束;</code>
<code> </code><code>read</code> <code>-p </code><code>"please input a number:"</code> <code>n</code>
<code> </code><code>if</code> <code>[ -z $n ]</code>
<code> </code><code>then</code>
<code> </code><code>echo</code> <code>"請輸入一個東西"</code>
<code> </code><code>continue</code>
<code> </code><code>n1=`</code><code>echo</code> <code>$n | </code><code>sed</code> <code>'s/[-0-9]//g'</code><code>`</code>
<code> </code><code>if</code> <code>[ ! -z $n1 ]</code>
<code> </code><code>echo</code> <code>"請輸入一個純數字"</code>
<code> </code><code>break</code>
<code>echo</code> <code>$n</code>
continue 退出本次循環;循環内部繼續,不執行循環後面的了;
break跳出整個循環,循環後面的還會執行。
exit的話退出整個腳本;
break實驗:條件比對的話退出整個循環;
<code>[root@localhost 0618]</code><code># cat break.sh </code>
<code>#break實驗;條件比對的話退出整個循環;循環後面的還會執行;</code>
<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>1 5`</code>
<code> </code><code>echo</code> <code>$i </code>
<code> </code><code>if</code> <code>[ $i == 3 ]</code>
<code>then</code>
<code> </code><code>break</code>
<code>echo</code> <code>$i</code>
<code>echo</code> <code>OK</code>
<code>[root@localhost 0618]</code><code># sh break.sh</code>
<code>1</code>
<code>2</code>
<code>3</code>
<code>OK</code>
continue實驗;條件比對的話退出本次循環,繼續執行循環;
<code> </code><code>echo</code> <code>$i</code>
<code> </code><code>then</code>
<code> </code><code>continue</code>
<code> </code><code>fi</code>
<code>[root@localhost 0618]</code><code># sh continue.sh </code>
<code>4</code>
<code>5</code>
exit實驗;條件比對的話退出整個腳本;
<code> </code><code>exit</code> <code>1</code>
<code>[root@localhost 0618]</code><code># sh break.sh </code>
4、shell中的函數
函數就是把一段代碼整理到了一個小單元中,并給這個小單元起一個名字,當用到這段代碼時直接調用這個小單元的名字即可。
格式: function f_name() {
command
}
函數必須要放在最前面
函數裡可以export 全局變量;
函數實驗1:定義input函數,輸入一個字元,則列印一個字元;
<code>input(){</code>
<code> </code><code>echo</code> <code>$1</code>
<code> </code><code>}</code>
<code>input yonglinux</code>
<code>[root@yong ~]</code><code># sh 1.sh </code>
<code>yonglinux</code>
函數實驗2:定義sum函數,進行求和運算;
<code>sum</code><code>() {</code>
<code> </code><code>s=$[$1+$2]</code>
<code> </code><code>echo</code> <code>$s</code>
<code>}</code>
<code>sum</code> <code>1 2</code>
<code>[root@localhost 0618]</code><code># sh 2.sh </code>
檢視ip位址的函數;
<code>#檢視ip位址的函數;輸入一個網卡名,輸出網卡對應的ip位址;$1為互動時輸入的網卡名;</code>
<code>ip() {</code>
<code> </code><code>ifconfig</code> <code>|</code><code>grep</code> <code>-A1 </code><code>"$1"</code><code>|</code><code>tail</code> <code>-1|</code><code>awk</code> <code>'{print $2}'</code><code>|</code><code>awk</code> <code>-F </code><code>':'</code> <code>'{print $2}'</code>
<code>read</code> <code>-p </code><code>"please input the eth name:"</code> <code>e</code>
<code>myip=`ip $e`</code>
<code>echo</code> <code>"$e address is $myip"</code>
<code>please input the eth name:eth0</code>
<code>eth0 address is 192.168.11.100</code>
<code>please input the eth name:eth1</code>
<code>eth1 address is 192.168.20.100</code>
<code>please input the eth name:lo</code>
<code>lo address is 127.0.0.1</code>
本文轉自 模範生 51CTO部落格,原文連結:http://blog.51cto.com/mofansheng/1664557,如需轉載請自行聯系原作者