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

1、shell編程入門必備基礎linux

一、vim編輯器的命令,vimrc設置

二、150個linux基礎命令

三、linux中基礎的系統服務crond,ssh網絡服務,nfs,rsync,inotify,lnmp,sersync,nmap等

2、變量分類nginx

一、全局變量web

複製代碼
[root@nfs-server ~]# env
HOSTNAME=nfs-server
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=172.19.5.146 49184 22
SSH_TTY=/dev/pts/1
USER=root
……
複製代碼

二、局部變量 只對當前shell用戶生效面試

定義環境變量:shell

①export OLDBOY=1——>定義環境變量,臨時生效apache

②若是想要全局生效,須要加入到環境變量配置文件編程

 /etc/profile  /etc/bashrc  ~/.bashrc ~/.bash_profile

 /etc/profile.d

③unset OLDBOY——>刪除環境變量vim

④儘可能用有意義的字符串定義變量,好比大寫字母的方式bash

⑤駝峯語法定義:首個單詞字母小寫,其他單詞首字母大寫網絡

devPath=/server/scripts
devFileList=`ls`

⑥注意單、雙引號的問題,通常字符串用雙引號定義

⑦引用變量時,注意金庸新著問題---將變量名用大括號包起來

echo ${week}day

三、特殊位置變量

$0

獲取當前執行的shell腳本的文件名,包括路徑

$n

獲取當前執行的shell腳本的第N個參數值,n=1..9,若是n大於9,就用${10}

$#

獲取當前shell命令行中參數的總個數

$?

0表示成功***** 2權限拒絕, 126找到了命令,但沒法執行

$$

獲取當前shell的進程號(pid)

3、定義變量的三種方式

一、直接賦值

x=10
file=/etc/hosts
注:腳本中能用變量的地方儘可能就用變量

二、傳參

$0 $1 ... $n $#
注:此方式腳本更加靈活

三、read交互式設置變量

1
2
3
-p 設置提示語句
-t 設置超時時間
-s 關閉回顯,讓輸入不顯示在屏幕上 

小題:寫個atm程序,讓你輸入你的銀行卡帳號和密碼,而後在屏幕上打印你的輸入結果

[root@zabbix scripts]# sh atm.sh 
請輸入你的銀行卡:18774499487766
請輸入你的密碼:765689
你的銀行卡 18774499487766
「你的密碼」 765689

4、變量的子串

一、獲取變量值的長度

OLDBOY="I am oldboy"
echo ${#OLDBOY}

二、截取字符串

複製代碼
[root@web01 ~]# OLDBOY="I am oldboy"
[root@web01 ~]# echo ${OLDBOY:2}
am oldboy
[root@web01 ~]# echo ${OLDBOY:2:2}
am
[root@web01 ~]# echo ${OLDBOY:5}
oldboy
複製代碼

三、字符串的刪除

複製代碼
#從前日後
oldboy=abcABC123ABCabc
[root@web01 scripts]# echo ${oldboy#abc}
ABC123ABCabc
[root@web01 scripts]# echo ${oldboy##a*c}
#從後往前
[root@web01 scripts]# echo ${oldboy%abc}
abcABC123ABC
[root@web01 scripts]# echo ${oldboy%%a*c}
複製代碼

四、字符串的替換

複製代碼
[root@web01 ~]# OLDBOY=abcABC123ABCabc
[root@web01 ~]# echo ${OLDBOY/123/456}
abcABC456ABCabc
[root@web01 ~]# echo ${OLDBOY/a/A}
AbcABC123ABCabc
[root@web01 ~]# echo ${OLDBOY//a/A}
AbcABC123ABCAbc
複製代碼

五、變量的數值計算

①自增自減運算

複製代碼
[root@web01 scripts]# i=0
[root@web01 scripts]# echo $((i++))
0
[root@web01 scripts]# echo $((i++))
1
[root@web01 scripts]# echo $((i--))
4
[root@web01 scripts]# echo $((i--))
3
複製代碼

②let

[root@web01 ~]# i=1
[root@web01 ~]# let i=i+8
[root@web01 ~]# echo $i
9

③expr——能夠判斷是否爲整數

複製代碼
[root@web01 ~]# expr 3 - 2
1
[root@web01 ~]# expr 1 + 2
3
[root@web01 ~]# expr 2 - 1
1
[root@web01 ~]# expr 1 + a
expr: 非整數參數
[ echo $? -eq 2 ]時,不是整數
複製代碼

④bc

[root@web01 ~]# echo 1+1|bc
2
[root@web01 ~]# echo 2*2|bc
4

⑤awk

[root@web01 ~]# echo "5.4 4.3"|awk '{print ($1-$2)}'
1.1

六、變量賦值

apache啓動腳本應用

1
2
3
4
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd
pidfile=${PIDFILE-/ var /run/httpd/httpd.pid}
lockfile=${LOCKFILE-/ var / lock /subsys/httpd} 

5、 條件表達式

一、經常使用文件判斷

①判斷文件存在且爲普通文件

[root@zabbix scripts]# [ -f /etc/hosts ] && echo "表達式成立"||echo "表達式不成立"
表達式成立

②判斷目錄存在且爲目錄文件

[root@zabbix scripts]# [ -d /etc ] && echo "表達式成立"||echo "表達式不成立"
表達式成立

③判斷文件存在且爲軟連接文件

[root@zabbix scripts]# [ -L /etc/rc.local ] && echo "表達式成立"||echo "表達式不成立"
表達式成立

④判斷文件存在且可讀

[root@zabbix scripts]# [ -r /etc/hosts ] && echo "表達式成立"||echo "表達式不成立"
表達式成立

⑤判斷文件存在且可執行

[root@zabbix scripts]# [ -x /etc/init.d/sshd ] && echo "表達式成立"||echo "表達式不成立"
表達式成立

⑥判斷文件存在且可寫

[root@zabbix scripts]# [ -w /etc/hosts ] && echo "表達式成立"||echo "表達式不成立"
表達式成立

二、經常使用字符串判斷

①判斷字符串長度是否爲0

[root@zabbix scripts]# [ -z "oldboy" ]&& echo "表達式成立"||echo "表達式不成立"
表達式不成立

②空則爲0

[root@zabbix scripts]# [ -z "" ]&& echo "表達式成立"||echo "表達式不成立"
表達式成立

③雙引號裏面有空格,空格不爲0

[root@zabbix scripts]# [ -z " " ]&& echo "表達式成立"||echo "表達式不成立"
表達式不成立

三、 整數比較

1
2
3
4
5
6
-eq  equal           等於
-ne  not equal       不等於
-gt  great than      大於
-ge  great equal     大於等於
-lt  less than  <   小於
-le  less equal ≤    小於等於
複製代碼
[root@web01 scripts]# [ 3 -ne 1 ] && echo "表達式成立"||echo "表達式不成立"
表達式成立
[root@web01 scripts]# [ 3 -eq 1 ] && echo "表達式成立"||echo "表達式不成立"
表達式不成立
[root@web01 scripts]# [ 3 -ge 1 ] && echo "表達式成立"||echo "表達式不成立"
表達式成立
[root@web01 scripts]# [ 3 -gt 1 ] && echo "表達式成立"||echo "表達式不成立"
表達式成立
[root@web01 scripts]# [ 3 -le 1 ] && echo "表達式成立"||echo "表達式不成立"
表達式不成立
[root@web01 scripts]# [ 3 -lt 1 ] && echo "表達式成立"||echo "表達式不成立"
表達式不成立
複製代碼

四、邏輯判斷符

1
2
3
與 條件表達式1 and 條件表達式2       -a
或 條件表達式1 or 條件表達式2        -o
非 !條件表達式1                     !

五、練習題:開發腳本比較兩個整數大小

①經過傳參的方式

②read交互式

5、流程控制語句

一、if語句

語法:

1、if[判斷條件];then

    執行的程序

elif[判斷條件];then

    執行的程序

else

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
複製代碼
[root@web01 scripts]# crontab -l|tail -2
#check free Mem
*/3 * * * * /bin/sh /server/scripts/check_mem.sh &>/dev/null

 #企業面試題#002

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

複製代碼
#!/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
複製代碼

#企業面試題#003

③使用if語句實現對nginx以及MySQL服務進行檢測,若是服務未啓動,則啓動服務

 一、經過端口

複製代碼
#!/bin/sh
. /etc/init.d/functions
port=`lsof -i:80|grep nginx|wc -l`
if [ $port -ge 2 ];then
  action "Nginx is running" /bin/true
else 
  action "Nginx is not running" /bin/false
  /application/nginx/sbin/nginx
  action "starting Nginx" /bin/true
fi
複製代碼

#企業面試題004#

④批量建立用戶user1,user2,user3……,而且設置隨機密碼,若是用戶存在的時候提示用戶已在並退出

複製代碼
#!/bin/sh
rm -f /tmp/user.log
for n in `seq 3`
do
  pass=`echo $RANDOM|md5sum|cut -c 1-8`
  #grep "user$n" /etc/passwd &>/dev/null
  id user$n &>/dev/null
  if [ $? -ne 0 ];then
    useradd user$n
    echo $pass|passwd --stdin user$n
    echo -e "user: user$n pass: $pass" >>/tmp/user.log
  else
        echo "user$n 已存在"
    exit
  fi
done
複製代碼

二、經過進程的方式

複製代碼
#!/bin/sh
. /etc/init.d/functions
port=`ps -ef|grep nginx|grep -v grep|wc -l`
if [ $port -ge 2 ];then
  action "Nginx is running" /bin/true
else 
  action "Nginx is not running" /bin/false
  /application/nginx/sbin/nginx
  action "starting Nginx" /bin/true
fi
複製代碼

三、wget返回內容的方式

複製代碼
#!/bin/sh
. /etc/init.d/functions
port=`wget -T 5 --spider http://172.19.5.8 &>/dev/null`
if [ $? -eq 0 ];then
  action "Nginx is running" /bin/true
else 
  /application/nginx/sbin/nginx
  action "starting Nginx" /bin/true
fi
複製代碼

四、curl返回值200的方式(header)

複製代碼
#!/bin/sh
. /etc/init.d/functions
port=`curl -s -I -w "%{http_code}\n" 172.19.5.8 -o /dev/null`
if [ "$port" == "200" ];then
  action "Nginx is running" /bin/true
else 
  /application/nginx/sbin/nginx
  action "starting Nginx" /bin/true
fi
複製代碼

二、case語句

語法

case 值 in

模式1)

    command

    ;;

模式2)

    command

    ;;

*)

    command

    ;;

esac

讓用戶經過輸入水果的名字,輸出到屏幕上並加顏色

給輸出字體加顏色

複製代碼
字體顏色設置:
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循環語句

語法:

#!/bin/bash

for i(變量) in {1..10}  in後面能夠加命令`ls`  `seq 10`

do

     echo $i

done

經過for循環寫一個開機自啓動優化腳本

複製代碼
[root@zabbix scripts]# sh chkconfig.sh 
[root@zabbix scripts]# chkconfig|grep 3:on
crond              0:off    1:off    2:on    3:on    4:on    5:on    6:off
network            0:off    1:off    2:on    3:on    4:on    5:on    6:off
rsyslog            0:off    1:off    2:on    3:on    4:on    5:on    6:off
sshd               0:off    1:off    2:on    3:on    4:on    5:on    6:off
sysstat            0:off    1:on     2:on    3:on     4:on   5:on    6:off
複製代碼

寫一個好玩的倒計時腳本,在屏幕上輸出10 09 08 07 06 05 ……

echo命令知識點小結:

echo  -n 不換行 -e 支持特殊字符 \b退一格

四、while循環語句

true  爲真,條件永遠成立

while true

  do

   echo "Hello world"

   sleep 1

done

五、各個條件表達語句使用場景

if(取值判斷)

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

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

case(系統服務啓動腳本)

相關文章
相關標籤/搜索