初識shell編程

一、shell編程之爲何學、怎麼學

爲何學shell編程

Linux系統批量管理linux

提高工做效率,減小重複工做正則表達式

學好shell編程所須要的基礎知識

熟悉使用vim編輯器shell

熟悉SSH終端編程

熟練掌握Linux經常使用命令vim

熟練掌握Linux正則表達式及三劍客命令(grep、sed、awk)bash

如何學shell編程

閱讀、模仿、閱讀、模仿less

核心:多練---->多思考---->再練---->再思考,堅持循環便可ssh

大忌:不可拿來主義,能夠模仿,可是要本身嚼爛了再吃下去tcp

本階段學習要求

看懂簡單腳本編輯器

嘗試寫腳本

變量,循環,判斷

二、shell編程基礎

什麼是shell

命令解釋器:你輸入的命令,誰來給你運行、解釋

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

 

 

什麼是Shell腳本

命令大禮包,就是一個程序文件,包含若干行Linux命令語句

循環,條件語句

通常以.sh結尾,或者經過file命令查看,其類型是shell script

[root@luffy-001 log]# file /server/scripts/ip.sh 
/server/scripts/ip.sh: Bourne-Again shell script text executable

 

建立Shell腳本

一、統一腳本存放目錄,/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

 

五、題目:寫一個簡單的腳本(切換目錄顯示文件實行)並運行

 

三、shell腳本深刻

變量

用一個固定的字符串,替代更多更復雜的內容,省事

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

 

 

二、read

[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條件語句

單分支條件語句

語法: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

man test

 

for循環語句

語法格式:

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
View Code

 

查看腳本執行過程 -x

 

題目:批量添加yoghurt並設置隨機密碼

相關文章
相關標籤/搜索