Linux系統批量管理linux
提高工做效率,減小重複工做正則表達式
熟悉使用vim編輯器shell
熟悉SSH終端編程
熟練掌握Linux經常使用命令vim
熟練掌握Linux正則表達式及三劍客命令(grep、sed、awk)bash
閱讀、模仿、閱讀、模仿less
核心:多練---->多思考---->再練---->再思考,堅持循環便可ssh
大忌:不可拿來主義,能夠模仿,可是要本身嚼爛了再吃下去tcp
看懂簡單腳本編輯器
嘗試寫腳本
變量,循環,判斷
命令解釋器:你輸入的命令,誰來給你運行、解釋
Centos默認的Shell是bash
[root@luffy-001 log]# echo $SHELL SHELL變量 /bin/bash [root@luffy-001 log]# cat /etc/shells 全部的命令解釋器 /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/csh [root@luffy-001 log]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash root用戶 的命令解釋器 bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin haldaemon:x:68:68:HAL daemon:/:/sbin/nologin ntp:x:38:38::/etc/ntp:/sbin/nologin saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin pizza:x:500:500::/home/pizza:/bin/bash oldboy:x:501:501::/home/oldboy:/bin/bash
命令大禮包,就是一個程序文件,包含若干行Linux命令語句
循環,條件語句
通常以.sh結尾,或者經過file命令查看,其類型是shell script
[root@luffy-001 log]# file /server/scripts/ip.sh /server/scripts/ip.sh: Bourne-Again shell script text executable
一、統一腳本存放目錄,/server/scripts/
二、推薦使用vim編輯器編輯腳本,腳本以.sh結尾
三、第一行支出是由哪個解釋器來執行腳本中的內容
#!/bin/bash /sbin/ifconfig eth0|awk -F '[ :]+' 'NR==2{print $4}'
#! 稱爲幻數,能被內核識別
必須寫在第一行,若是不是第一行就編程腳本註釋行
又能夠寫成#!/bin/sh
四、版權聲明
# desc: show ip address # author: pizza # time: 20191111 # version: v1.0
五、題目:寫一個簡單的腳本(切換目錄顯示文件實行)並運行
用一個固定的字符串,替代更多更復雜的內容,省事
x=1
[root@luffy-001 scripts]# x=1
[root@luffy-001 scripts]# echo $x
1
devPath=/server/ filelist=`ls`或者$(ls)
$LANG
$PATH
變量又分爲局部變量(普通變量)、全局變量(環境變量)、特殊變量
只能在建立他們Shell函數或者Shell腳本中使用
形式:變量名=value 變量名要求: #一、字母、數字、下戶線組成 #二、必須以字母開頭 #三、見名知意,規範變量名寫法定義 #四、駝峯寫法:RedPizzaCar 應用變量儘可能使用${} [root@luffy-001 scripts]# week=10 [root@luffy-001 scripts]# echo ${week}day 10day [root@luffy-001 scripts]# echo $weekday #這樣寫什麼也沒有 [root@luffy-001 scripts]# 能夠把一個命令做爲變量 普通字符串via你來定義測試
大寫、linux裏面哪裏均可以用(經常使用的$PATH、$LANG、$PS1)
在建立他們的Shell及其派生出來的子Shell中使用
注意:普通變量是沒法直接調用的,須要使用export將其轉化成全局變量後方能使用,例子見下面代碼
[root@luffy-001 scripts]# vim pizza.sh #!/bin/bash echo $PIZZA ~ ~ ~ "pizza.sh" 4L, 26C written [root@luffy-001 scripts]# PIZZA=10 [root@luffy-001 scripts]# echo $PIZZA 10 [root@luffy-001 scripts]# sh pizza.sh [root@luffy-001 scripts]# export PIZZA [root@luffy-001 scripts]# sh pizza.sh 10 [root@luffy-001 scripts]#
一、Shell經過環境變量來肯定登陸用戶名、命令路徑、終端類型、登陸目錄(LANG、PATH、SHELL、UID)
二、自定義環境變量:
建議全部環境變量均爲大寫
必須用export命令定義
查看全局變量:env
取消全局變量:unset PIZZA
與用戶環境變量有關的文件目錄...
全局環境變量配置文件
/etc/profile
/etc/bashrc
/etc/profile.d/ 用戶登陸到系統,會運行這個目錄下面的腳本(腳本要有執行權限chmod +x)
用戶環境變量配置文件
~/.bash_profile
~/.bashrc
$0 獲取當前執行腳本的文件名。若是執行腳本帶路徑,那麼就包括腳本路徑。模擬系統腳本使用$0
$n n表明腳本後面的參數,
$# 腳本一共有多少個參數,參數的個數
$? 顯示上一個命令的執行結果
###命令執行正確 結果0
###命令執行錯誤 結果非0
x=1 y=2 echo $x $y w=$1 s=$2 echo $w $s [root@luffy-001 scripts]# sh pizza.sh 10 20 10 1 2 10 20
[root@luffy-001 scripts]# read -p "input x y:" x y input x y:10 20 [root@luffy-001 scripts]# echo $x $y 10 20
能夠將該語句直接放入腳本中執行
read獲得的輸入默認存儲在變量REPLY中
能夠存儲在一個或者多個變量中
-p 「提示語句」, 屏幕就會顯示交互式語句
-t 等待時間
-s 關閉回顯,用於密碼輸入
[ <測試表達式> ]注意兩邊要有空格
-f 判斷文件是否存在
[root@luffy-001 scripts]# [ -f /server/scripts/pizza.sh ] [root@luffy-001 scripts]# echo $? 0
-d 判斷目錄是否存在 [root@luffy-001 scripts]# [ -d /server/scripts/ ] [root@luffy-001 scripts]# echo $? 0
等於equal -eq
不等於not equal -ne
大於 greater than -gt
大於等於 greater equal -ge
小於less than -lt
小於等於 less equal -le
[root@luffy-001 scripts]# [ 1 -eq 1 ] [root@luffy-001 scripts]# echo $? 0
簡單案例:判斷命令行參數個數等於2(配合&&)
[ $# -eq 2 ] && echo "arg:$#"
題目:若是/oldboy目錄不存在則建立
[ -d /oldboy ] || mkdir -p /oldboy
題目:若是/root/oldboy.txt存在則提示文件已存在
[ -f /root/oldboy.txt ] && echo file esists
語法:if [條件];then 命令 fi
題目:若是第一個數比第二個數大,顯示第一個數大於第而個數
num1=$1 num2=$2 if [ $num1 -gt $num2 ]; then echo $num1 bigger than $num2 fi
語法:if [條件];then 命令 else 命令 fi
num1=$1 num2=$2 if [ $num1 -gt $num2 ]; then echo $num1 bigger than $num2 elif [ $num1 -lt $num2 ]; then echo $num1 less than $num2 else echo $num1 equal $num2 fi
如今有一個問題是這樣的:若是參數過多,也會運行,後面多餘的參數變成了無用參數,只有一個參數會報錯
num1=$1 num2=$2 if [ $# -ne 2 ];then echo "Usage:"please input 2 num : num1 num2 exit fi if [ $num1 -gt $num2 ]; then echo $num1 bigger than $num2 else echo $num1 less than $num2 fi
[ -d /oldboy ] 至關於 test -d /oldboy
語法格式:
for 變量名字 in 列表 do 命令 done
例子:
[root@luffy-001 scripts]# for num in 1 2 3 4 5 > do > echo "the num is:$num" > done the num is:1 the num is:2 the num is:3 the num is:4 the num is:5
生成序列seq 或者{}
[root@luffy-001 scripts]# for num in {1..10}; do echo "the num is:$num"; done the num is:1 the num is:2 the num is:3 the num is:4 the num is:5 the num is:6 the num is:7 the num is:8 the num is:9 the num is:10
題目:優化linux開機啓動項,只保留crond;sshd;network;rsyslog;sysstat,其餘的都關閉
提示:chkconfig 服務 off
for name in $(chkconfig |egrep "crond|sshd|rsyslog|network|sysstat" -v |awk '{print $1}') do chkconfig $name off done
查看腳本執行過程 -x
題目:批量添加yoghurt並設置隨機密碼