linux運維、架構之路-shell編程(二)

1、流程控制語句mysql

一、if語句nginx

①if單分支:一個條件一個結果面試

1
2
3
4
if  條件
   then
      命令
fi

②if雙分支:一個條件兩個結果sql

1
2
3
4
5
6
if  條件
   then
     命令
else
    命令2
fi

③if多分支:多個條件多個結果shell

1
2
3
4
5
6
7
8
9
10
11
12
13
if  條件
   then
     命令
elif 條件2
   then
     命令2
elif 條件3
   then
     命令3
…… 
else
    命令4
fi

#企業面試題001#編程

開發檢測系統內存監控腳本,若是低於800M,郵件報警,而且定時任務每三分鐘執行一次檢測數組

複製代碼
cat check_mem.sh
#!/bin/sh
Mem=`free -m|awk 'NR==3{print $NF}'`
if [ "$Mem" -lt "800" ]
  then
    echo $Mem|mail -s "系統內存低於800M" 774181401@qq.com
fi
複製代碼

#企業面試題002#bash

模擬啓動nginx腳本,使用if語句判斷輸入的是否爲start、stop、restart……app

複製代碼
#!/bin/sh
. /etc/init.d/functions
Nginx_Start="/application/nginx/sbin/nginx"
Nginx_stop="${Nginx_Start} -s stop"
if [ "$1" == "start" ]
  then
    ${Nginx_Start}
    action "starting Nginx" /bin/true
elif [ "$1" == "stop" ]
  then
    ${Nginx_stop}
    pkill nginx
    action "Nginx is stopped" /bin/true
elif [ "$1" == "restart" ]
  then
    ${Nginx_stop} && ${Nginx_Start}
   action "Nginx is restarting" /bin/true
elif [ "$1" != "start" -a "$1" != "stop" -a "$1" != "restart" ]
  echo "USAGE: $0 {start|stop|restart}"
fi
複製代碼

二、case語句ssh

①語法

1
2
3
4
5
6
7
8
9
10
11
12
13
case  $x  in
     值1)
        命令1
        ;;
     值2)
        命令2
        ;;
     值3)
        命令3
        ;;
     *)
        命令4
esac

②case語句至關於多分支if語句,適合變量少,且爲固定數字或者字符串集合,多用於系統啓動腳本

#case實戰菜單小題#

複製代碼
#!/bin/bash
cat<<EOF
1. install rsync
2. install nfs
3. install mysql
4. install all
5. exit
EOF
read -p '請輸入你的選擇:' num

case $num in
  1)
   echo "install rsync suscess!"
   ;;
  2)
   echo "install nfs suscess!"
   ;;
  3)
   echo "install mysql suscess!"
   ;;
  4)
   echo "install all suscess!"
   ;;
  5)
   exit
   ;;
  *)
    echo "選擇有誤"
esac
複製代碼

#case結合while實戰水果菜單選擇#

複製代碼
#!/bin/sh
RED='\E[1;31m'
GREEN='\E[1;32m'
YELLOW='\E[1;33m'
RES='\E[0m'

cat <<EOF
==================
1.apple
2.pear
3.banana
4.exit
==================
EOF
while true
do
read -p "請輸入你喜歡吃的水果:" choice
case $choice in
  1)
    echo -e "你喜歡的水果是: $RED apple $RES"
    ;;
  2)
    echo -e "你喜歡的水果是: $GREEN pear $RES"
    ;;
  3)
    echo -e "你喜歡的水果是:$YELLOW banana $RES"
    ;;
  4)
    exit
    ;;
  *)
    echo "輸入有誤"
esac
done
複製代碼

#給輸出字體加顏色#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
前景顏色:<br>echo -e  "\033[30m 黑色字oldboy trainning \033[0m"
echo -e  "\033[31m 紅色字oldboy trainning \033[0m"
echo -e  "\033[32m 綠色字oldboy trainning \033[0m"
echo -e  "\033[33m 黃色字oldboy trainning \033[0m"
echo -e  "\033[34m 藍色字oldboy trainning \033[0m"
echo -e  "\033[35m 紫色字oldboy trainning \033[0m"
echo -e  "\033[36m 天藍字oldboy trainning \033[0m"
echo -e  "\033[37m 白色字oldboy trainning \033[0m"
背景顏色:
echo -e  "\033[40;37m 黑底白字 welcome to old1boy\033[0m"
echo -e  "\033[41;37m 紅底白字 welcome to old2boy\033[0m"
echo -e  "\033[42;37m 綠底白字 welcome to old3boy\033[0m"
echo -e  "\033[43;37m 黃底白字 welcome to old4boy\033[0m"
echo -e  "\033[44;37m 藍底白字 welcome to old5boy\033[0m"
echo -e  "\033[45;37m 紫底白字 welcome to old6boy\033[0m"
echo -e  "\033[46;37m 天藍白字 welcome to old7boy\033[0m"
echo -e  "\033[47;30m 白底黑字 welcome to old8boy\033[0m"
關閉顏色\033[0m

三、for語句

①語法

1
2
3
4
5
6
7
for  i(變量)  in  {1..10}   in 後面能夠加命令`ls`  `seq 10`
 
do
 
      echo $i
 
done

②經過for循環優化開機啓動

複製代碼
#!/bin/sh
Close_Service=`chkconfig|grep 3:on|awk '{print $1}'|egrep -v "crond|network|sshd|rsyslog|sysstat"`
for name in $Close_Service
do
  chkconfig $name off
done
複製代碼

四、while語句

①語法

1
2
3
4
5
6
7
8
9
while  條件
   do
     命令
done
 
條件永遠成立--死循環
守護進程:不中止的進程
 
true

②while按行讀文件的方式

複製代碼
方式1、
exec <file
sum=0
while read line
do
     cmd
done
方式二、
cat ${file_path}|while read line
do
      cmd
done
方式三、
while read line
do
       cmd
done<file
複製代碼

③防止腳本中斷的方法

1
2
3
一、sh  while .sh &
二、nohup /server/scripts/uptime.sh &
三、screen,保持會話

五、函數

①語法

1
2
3
4
#!/bin/bash
oldboy(){
     echo  "Hello world"
}  

注:oldboy爲定義的函數,執行時不須要帶小括號,函數定義及函數體必須在要執行的函數名的前面定義

②帶參數的函數執行方法

1
2
3
4
在函數體中位置參數($一、$二、$3...$#、$*以及$@)均可以是函數的參數。
父腳本的參數臨時被函數參數所掩蓋或隱藏。
$0比較特殊,他仍然是父腳本的名稱。
當函數完成時,原來的命令行參數會恢復
複製代碼
#!/bin/bash
function oldboyedu(){
    echo "Hello world"
    echo $0
    echo $1
    echo $2
    exit
}

etiantian(){
    echo "good"
    return 3
    echo 'bad'
}

#oldboyedu hanshu1 hanshu2
oldboyedu $1 $2
etiantian
複製代碼

③如何寫好函數腳本

1
2
3
#分層
#每個步驟能夠寫成一個函數
#每個功能分拆爲函數 

④函數優點

把相同的程序段定義成函數,能夠減小程序代碼量。
增長程序的可讀、易讀性。
實現程序的功能模塊化。

六、shell數組

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
x=(1 2 3)
 
# 打印全部數組內容
[root@oldboyedu scripts]# echo ${x[*]}
1 2 3
#打印數組元素
[root@oldboyedu scripts]# echo ${x[0]}
1
[root@oldboyedu scripts]# echo ${x[1]}
2
[root@oldboyedu scripts]# echo ${x[2]}
3
#打印數組長度
[root@oldboyedu scripts]# echo ${#x[@]}
3
[root@oldboyedu scripts]# echo ${#x[*]}
3

2、各個語句應用場景

if(取值判斷)

for(正常循環處理)語句最經常使用,

while(守護進程無限循環,小於1分鐘的任務均可以用while循環)

case(系統服務啓動腳本)

3、shell腳本調試

①要記得首先用dos2unix對腳本格式化。
②直接執行腳本根據報錯來調試,有時報錯不許確。
③sh -x調試整個腳本,顯示執行過程。
④set -x和set +x調試部分腳本(在腳本中設置)
⑤echo輸出變量及相關內容,而後緊跟着exit退出,不執行後面程序的方式,一步步跟蹤腳本,對於邏輯錯誤比較好用。
寫法:echo $var;exit
⑥最關鍵的是語法熟練、編碼習慣、編程思想,將錯誤扼殺在萌芽之中,減輕調試負擔,提升效率

4、控制循環結構中的走向

命令

說明

break n

n表示跳出循環的層數,若是省略n表示跳出整個循環

continue n

n表示退出到第n層繼續循環,若是省略n表示跳過本次循環,忽略本次循環的代碼,進入循環的下一次循環

exit n

退出當前shell程序,n爲返回值,n也能夠省略,在下一個shell裏經過$?接收這個n的值

return n

用在函數裏,做爲函數的返回值,用於判斷函數執行是否正確,和exit同樣,若是函數裏有循環,也會直接退出循環,退出函數

一、 break 跳出整個循環,繼續循環後面的程序執行二、 continue 結束本次循環,繼續下一次循環三、 exit 退出整個腳本

相關文章
相關標籤/搜索