1.11 linux
shell編程基礎正則表達式
內容:shell
1. shell介紹編程
2. 案例:系統開機啓動優化vim
3. shell腳本書寫步驟bash
4. if判斷語句網絡
5. for循環語句less
前言:ssh
1. 如何學好shell編程:編輯器
核心
多練--多思考--再練--再思考,堅持 循環
大忌
拿來主義(能夠模仿 ,但要嚼爛了再下嚥)
方法
閱讀,模仿,思考 能夠參考cat /etc/init.d/functions , /etc/rc.sysinit , etc/profile練習
命令解釋器 cat/etc/shells
CentOS默認的shell是bash
查看linux中shell
echo $SHELL cat /etc/passwd |
命令大禮包,一個程序文件,包含若干行linux命令語句
循環,條件語句
查看腳本文件類型
[root@m01 ~]# file /server/scripts/fenfa.sh /server/scripts/fenfa.sh: Bourne-Again shell script text executable |
linux系統批量管理
提高工做效率
減小重複工做
熟練使用vim編輯器
熟悉ssh終端
熟悉掌握linux經常使用命令
熟練掌握linux正則表達式及三劍客命令
除了下面5個服務之外都關閉
crond sshd network rsyslog sysstat
定時任務 遠程鏈接 網絡 系統日誌 系統工具
方法一:
第一個里程碑-分析想要的結果
chkconfig 服務名字 off 這種形式 chkconfig abrt-ccpp off chkconfig abrtd off chkconfig acpid off |
第二個里程碑-先排除crond rsyslog network sshd sysstat
[root@oldboyedu-39-nb ~]# chkconfig |egrep "sshd|crond|rsyslog|network|sysstat" 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 ..... |
第三個里程碑-取出服務名字
[root@oldboyedu-39-nb ~]# chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#\1#g' abrt-ccpp abrtd .... |
第四個里程碑-拼接出 chkconfig 服務名字 off 樣子
[root@oldboyedu-39-nb ~]# chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#chkconfig \1 off#g' chkconfig abrt-ccpp off chkconfig abrtd off ... |
第五個里程碑-有了命令的形式樣子,有人來運行 執行
[root@oldboyedu-39-nb ~]# echo pwd|bash /root |
最終命令
[root@oldboyedu-39-nb ~]# chkconfig |egrep -v "sshd|crond|rsyslog|network|sysstat"|sed -r 's#(^.*)0.*#chkconfig \1 off#g'|bash [root@oldboyedu-39-nb ~]# 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 |
排除的方法
chkconfig |sed -r '/sshd|rsyslog|crond|network|sysstat/d' chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!p' |
拼接
chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!p'|sed -r 's#(.*)0.*#\1#gp' chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!p' 對於包含sshd或rsyslog或crond或 network或sysstat的行 不處理 不進行替換 sg //! s###g |
方法2 :
[root@oldboyedu-39-nb ~]# chkconfig |sed -rn '/sshd|rsyslog|crond|network|sysstat/!s#(.*)0.*#\1#gp' abrt-ccpp abrtd acpid atd auditd 省略 saslauthd smartd svnserve udev-post chkconfig|sed -r '/sshd|rsyslog|crond|network|sysstab/d;s#(.*)0.*#chkconfig \1 off#g' |
統一腳本存放目錄(自定義) /server/scripts
推薦使用vim編輯器編輯腳本(方便拍錯)
第一行支出由哪一個命令解釋器來執行腳本中的內容
#!/bin/bash 命令解釋器
#author : 做者
#date : 時間
#ver : 版本
#desc : 描述
例:編寫一個腳本---顯示日期和ip
[root@oldboy-gao ~]# vim /server/scripts/ip.sh #!/bin/bash 指定命令解釋器執行腳本 # author: gao # date: 180114 # ver: 版本 # desc:描述
date +%F /sbin/ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}'
[root@oldboy-gao scripts]# file backup.sh 若是不知道 --文本文件 backup.sh: ASCII text |
運行腳本
1)/bin/bash
[root@oldboy-gao ~]# /bin/sh /server/scripts/ip.sh 2018-01-13 10.0.0.201 |
2) 腳本的絕對路徑--須要x權限
[root@oldboy-gao ~]# /server/scripts/ip.sh -bash: /server/scripts/ip.sh: Permission denied |
加上x權限
[root@oldboy-gao ~]# chmod +x /server/scripts/ip.sh [root@oldboy-gao ~]# /server/scripts/ip.sh 2018-01-13 10.0.0.201 |
若是你是男生 && 你喜歡女生
若是 [ 你是男生 ];那麼
你喜歡女生
果如
if [ 你是男生 ];then
你喜歡女生
fi
例:若是a等於10則顯示恭喜你猜對了。
a=1 if [ $a == 10 ];then 兩個等號 中括號裏面兩邊空格 echo "gongxi " fi [root@oldboyedu-39-nb scripts]# cat pan.sh 把判斷語句寫進腳本 #!/bin/bash a=$1 if [ $a == 10 ];then shell 遇到中括號,先敲倆空格 echo "gongxi " fi [root@oldboyedu-39-nb scripts]# sh pan.sh 30 效果 [root@oldboyedu-39-nb scripts]# sh pan.sh 10 gongxi |
中括號裏的東西都在哪裏放着呢
test 測試
equal 等於 == -eq (test )
[root@oldboyedu-39-nb scripts]# [ 2 -eq 2 ] [root@oldboyedu-39-nb scripts]# echo $? 0 |
greater than 大於 > -gt [ 2 -gt 1 ]
less than 小於 < -lt
greater than 而且 equal 大於等於 >= -ge [ 3 -ge 2 ]
[root@oldboyedu-39-nb scripts]# [ 2 -ge 2 ] [root@oldboyedu-39-nb scripts]# echo $? 0 |
例:若是條件符合(成功)顯示hahah
[root@oldboy-gao ~]# [ 0 -eq 0 ]&&echo hahah [ ] 自己具備判斷的功能 hahah &&命令執行成功,而且符合[ ]內的條件,執行後面命令 [root@oldboy-gao ~]# [ 1 -eq 0 ]&&echo hahah |
例:書寫一個腳本:輸入兩個參數 若是第一個參數大於第二個參數則 顯示 $1>$2。
[root@oldboyedu-39-nb scripts]# cat pan.sh #!/bin/bash a=$1 b=$2 if [ $a -gt $b ];then echo "$a > $b " fi
[root@oldboyedu-39-nb scripts]# sh pan.sh 1 2 [root@oldboyedu-39-nb scripts]# sh pan.sh 10 2 10 > 2 |
1. 判斷文件是否存在
2. 判斷目錄是否存在
[root@oldboyedu-39-nb scripts]# [ -f /data/oldboy.txt ] [root@oldboyedu-39-nb scripts]# echo $? 0 0表示存在 [root@oldboyedu-39-nb scripts]# [ -f /data/oldboy.tx ] [root@oldboyedu-39-nb scripts]# echo $? 1 非0則不存在 |
[root@oldboyedu-39-nb scripts]# [ -d /data/ ] [root@oldboyedu-39-nb scripts]# echo $? 0 [root@oldboyedu-39-nb scripts]# [ -d /dataa/ ] [root@oldboyedu-39-nb scripts]# echo $? 1 |
vim有個模板,好比,只要你建立.sh文件,就會顯示格式(文件名,姓名之類),叫vimrc,不建議使用
elif 另外一個條件
例:判斷你輸入的目錄是否存在,若是不存在就建立他。
[root@oldboyedu-39-nb scripts]# cat dir.sh #!/bin/bash #filename:dir.sh dir=$1 if [ ! -d $dir ];then !不 若是目錄不存在 那麼 mkdir -p $dir 建立這個目錄 echo $dir create 顯示已經建立好了 目錄 dir fi [root@oldboyedu-39-nb scripts]# sh dir.sh /oldboy [root@oldboyedu-39-nb scripts]# sh dir.sh /oldbaby /oldbaby create |
小結:
1.判斷 if
if [ $a -eq $b ];then
echo
fi
2.在if中可使用的內容 -eq -ge*** -gt -f*** -d***
瞭解:if的第三種用法 若是成功了--顯示什麼 若是不成功--顯示什麼
if [ $a -gt $b ];then echo "$a > $b" else echo "$a no > $b" fi |
瞭解:if的第四種表達 若是成功了--下一個條件(成功)--下一個條件
不斷地判斷
for循環語句
語法: for 變量名 in 變量取值列表
do.
指令..
done..
例:顯示1 2 3 4 5 .... 10
for num in 1 2 3 4 5 6 7 8 9 10 for循環執行過程 do 第一次 num 1 第二次 num 2 echo $num echo 1 echo 2 done |
for num in {1..10} do echo $num done |
實例:優化linux開機啓動項目
第一個里程碑:明確目標-關閉沒必要要的 除了network crond sshd rsyslog sysstat chkconfig 服務名字 off
第二個里程碑:使用循環以後 咱們要的樣子 for fu in 列表 ##列表是咱們想要關閉的服務的名字 do chkconfig $fu off done
第三個里程碑:取出服務的名字 [root@oldboyedu-39-nb scripts]# chkconfig |egrep -v "sshd|crond|network|rsyslog|sysstat"|awk '{print $1}' abrt-ccpp abrtd acpid atd 此處省略 好多字
第四個里程碑:獲得結果 for fu in $(chkconfig |egrep -v "sshd|crond|network|rsyslog|sysstat"|awk '{print $1}' ) do # chkconfig $fu off echo $fu done |
保險---確保萬無一失
排查腳本錯誤 調試腳本 vim /opt.sh #!/bin/bash for fu in $(chkconfig|egrep -v "sshd|crond|network|rsyslog|sysstat"|awk '{prind $1}') do #chkcon $fu off echo $fu 先顯示循環內容 檢查是否正確 done 顯示腳本的執行過程 sh -x opt.sh 顯示結果先執行的在下面 若是感受沒問題 把腳本里面內容一條一條,一個管道一個管道的排查 |
2.判斷 --if
大於 [ 3 -gt 2 ]
大於等於 [ 3 -ge 3 ]
等於 [ 3 == 3 ] 等於 [ 3 -eq 3 ]
判斷文件是否存在 [ -f /data/oldboy.txt ]
判斷目錄是否存在 [ -d /data ]
if [ 條件 ];then 作什麼 fi |
3.for循環
for 變量 in 列表
do
命令
done