一.腳本編程基礎
1.腳本是命令的堆積,但是要考慮命令結果的不等次冪
2.腳本開頭必須是shebang,即#!/bin/bash,#!必須頂格,後 面跟shell
3.行首加上#時既不會顯示出來也不會運行,因此在寫一些描述版本等信息的時候前邊要加上#,調試腳本時不想執行某一命令前邊也可以叫上#
4.空白行默認是不顯示的,想要顯示空白可以echo “ ”來表達
5.shell腳本是開啟一個子shell運行的
6.shell運行有兩種方式
a.給腳本以x執行權限
b.前邊加上腳本的解釋器,即加上shebang後邊的shell,如bash *.sh
7.腳本的執行分為:順序執行,循環執行,選擇執行
8.腳本開頭
script
#!/bin/bash 頂格
#author: 作者
#version: 版本(直接以2.0開頭)
#description: 描述腳本的作用
9.bash -n 檢查腳本的內容有沒有語法錯誤
-x 調試運行,並不真正運行,只是模擬運行,不會對目標做任何處理,會將過程結果輸出到屏幕
10.開機運行的腳本一般放在/etc/profile.d目錄下
二.變量
1.本地變量
本地變臉只對當前shell有效,且在沒有寫入到配置文件的本地變量將會在shell關閉後失效,配置文件是/etc/bashrc(全局) ~/.bashrc(個人)
本地變量的設置
name=“變量內容”(可以使命令等)
取消本地變量
unset name(不需要加$)
查看變量
set(包括了環境變量和函數)
變量的引用
echo ${}
2.環境變量
環境變量的作用對象是當前shell及其子shell,同本地shell,想要永久保存需要寫到配置文件中配置文件是/etc/profile (全局) ~/.bash_profile
環境變量的設置
export name=“變量內容”
declare -x name=“變量內容”
name=“變量內容” export/declare -x name
環境變量的取消
unset name
查看環境變量
declare -x
export
env
引用同本地變量
3.只讀變量
只讀變量只能讀取,不能刪除,也不能取消,只有在退出shell的失效
只讀變量的設置
declare -r name=“”
readonly name
4.位置變量
位置變量是想腳本內容傳遞參數的變量
jiaoben.sh s1 s2 s3
s1 s2 s3都成為jiaoben.sh位置變量
jiaoben.sh中想要引用可以用$1等引用這些參數
$1:腳本後邊跟的第一個參數,在腳本中用$1來表示
$2: 二
. .
. .
. .
注意:$10並不是第10個參數,而是第一個參數加0,第10個參數要用到引用${10}
$@:指的是後邊的全部參數,並且每一個參數都是一個字符串
$*:值得是後邊的全部參數,並且全部參數是一個字符串
$0:指的是命令本身,但是命令本身是會帶路徑的,所以,要用basename來取出基名,但是由於是命令所以要用到命令引用`basename $0`
$#:代指參數的個數
shift功能:在腳本中需要插入環境變量的上一行加上shift #,會讓腳本後邊跟的參數整體向左移動#位,默認是移動一位,即第二位及以
後的參數一起向左移動一位,覆蓋住第一位參數,值得注意的是,是覆蓋第一位參數,參數項會少一位,並且原先腳本中顯示第一個參數
的$1的內容現在變成第二個參數,以此類推,並不是循環,第一位不會跑到最後一位,腳本中最後一位參數的$*的位置將會為空
三.運算
因為在shell中都被視為是字符串,所以,10+10是不會被運算的,運算需要用到特殊的格式
運算方式:+加 -減 *乘 %取余(取余是指取前邊的數除後邊的數的余數,顯示的是余數而不是結果) **次冪
1.expr s1空格+空格s2
2.echo $[運算表達式]
3. s1=數值1
s2=數值2
s3=$s1 (+-*% **) $s2
echo $s3 | bc(計算器)
四.sed文本編輯器
sed工作方式:sed是一行一行處理文本的
保持空間
file的某一行---------- -----------輸出
模式空間
格式
sed [options] ‘script’ file file.bak文件後邊加上.bak可以先制作一個文件的備份
options
-i:對文本進行編輯,默認的是不會對原文本有任何更改的,在加了i後所做的一次修改都會被作用到源文件上
-f:-f/PATH/TO/FILE,可以講處理的動作命令等寫入腳本中,每次從腳本中讀取,更利於多文本處理
-n:不會輸出到屏幕,默認的是將處理過的沒處理過的都輸出到屏幕上
-e:多點編輯,例如 -e ‘script’ -e ‘script’
-r:支持正則表達式
’script‘
’地址命令‘
a.地址
#:第幾行
#1,#2:范圍,第#1行到第#2行
#,#+n:從第#行到第#+n行,n是表示偏移量
/par1/,/par2/:從正則表達式匹配到的第1行到正則表達式匹配到的第2行
#,/par/:。。。。。。。。。。
b.命令
d:刪除行
p:將修改成工的內容輸出到屏幕,不加n的話會有兩行一模一樣的,因此通常和-n連用
=:顯示行號
#a\xxxx:在第#行的後面另起一行,內容時XXx
#i\xxxx:在第#行的前面另起一行,內容時xxx #可以是正則表達式,但是正則表達式必須用/par/括起來
#c\xxxx:將第#行的內容替換為xxxx
w /PATH/TO/FILE 另存為的意思
r /PATH/TO/FILE 將另一文件的內容讀取進來
c.查找替換
基本等同於vim中的查找替換
’s/查找內容/替換內容/g‘
同樣支持正則表達式,但是前面必須加上-r
g:全部替換,同vim一樣,不加g的話一行中有多個查找內容只會替換第一個
p:顯示成功行,其實和上面那個p就是同一個p
w /PATH/TO/FILE 另存為
sed的高級編輯
-h:將模式空間的內容覆蓋到保持空間
-H:將模式空間的內容追加到保持空間
-g:將保持空間的內容覆蓋到模式空間
-G:將保持空間的內容追加到模式空間
-x:將保持空間的內容與模式空間的內容呼喚
-n:將讀取文件的當前行的下一行也一並讀取出來覆蓋到模式空間
-N:將讀取文件的當前行的下一行也一並讀取出來追加到模式空間
-d:刪除一行
-D:刪除多行
格式: sed ‘1!N;$!D' file
注意:分號是命令按次序執行的意思,而這段命令在思考是要注意sed是一行一行處理文件的,所以並不是將除了第一行以外的我全部取出
而是“首先取出1行,看是不是第一行,是則直接送去$!D命令,不是,則執行-N命令將其下一行一同取出追加到這行後邊,然後將這兩行送
去執行$!D命令,到了後邊,看是不是最後一行,不是,直接刪除,是,則保留在當前空間“,因此結果會是文件的最後一行和倒數第二行數
據
五.find與locate
locate:在數據庫中查找,locate會建立一個數據庫,裡邊包含著硬盤的所有文件的名字路徑等等信息,locate在搜索的時候,並不是搜索
硬盤,而是去搜索數據庫/var/lib/mlocate/locate.db
locate特性:速度快,不具備實時性,模糊搜索(會將路徑中包含字符的文件都找出來)
有時候可能需要用戶手動創建這個數據庫的情況
更新locate數據庫:updatedb,更新數據庫是需要讀取硬盤上的每一個文件,對於資源的消耗很大,因此手動更新的時候請選擇一個閒時
自動在閒時更新
-i:不區分大小寫
-b:只顯示基名不顯示路徑中包含字符串的內容
-r:支持正則表達式
-c:不顯示具體文件只顯示數量
-n #:只顯示前#個文件
find:在整個硬盤中搜索文件,具備實時性,但是消耗資源大,速度相較於locate要慢
格式
find 要搜索的位置 選項 處理動作
要搜索的位置
選項: -name “名字” :根據名字查找,是精確查找,但是支持通配符
-iname “ ” :不區分大小寫的-name
-regax name “ ” :支持正則表達的名字查找,但是會將路徑中包含的也一同線束出來
-user
-group :查找用戶或組,支持UID和GID
-uid
-gid :用uid gid查找,只支持uid gid
-nouser
-nogroup :查找無組或者無主的文件
-type :按類型查找
f普通文件 d目錄 l連接文件 c字符文件 b塊文件 p管道文件 s字符套接文件
-a:並且的關系
-o:或的關系
!/-not:非的關系
-size[+―]#:按大小查找
# (#-1,#]
-# [0,#-1]
+# (#,oo)
-atime #天
-ctime
-mtime
-amin #分鐘
-cmin
-mmin
# [#,#+1):#=7 在離現在起整7天的那天起的24個小時之內 0526 9:59 0518 9:59到0519 9.59之間
-# [0,#) :從現在0526 9.59起到0519 9.59之間的時間
+# (#,00]::0519 9.59以前修改過的文件
-perm xxx:精確指定xxx權限的文件
/xxx:三類用戶的9個權限中有一個符合條件,就是符合條件的文件
-xxx:三類用戶的權限都同時符合條件的,才是符合條件的文件
注意:/xxx -xxx這兩者的關系,非-xxx與/xxx互為半否命題
處理動作
-print:輸出到屏幕,默認的處理動作
-ls :對查到的文件執行ll命令
-fls :對執行了ll名的查到的文件的列表另存為
-ok COMMAND {} \; 最查到的文件執行命令,交互模式
-exec COMMAND {} \; 對查到的文件執行命令,不會要求你確認
注意:通常用find查到的文件有數十個甚至上千個上萬個,但是-ok -exec都是講文件作為參數全部由命令執行,而
很多命令並不支持一次性處理那麼多的參數,因此很多時候回報錯,這時候可以使用xagrs
find | xagrs COMMAND
xagrs會將find查到的文件一個一個交個命令來處理
六.配置文件
配置文件大致分為兩類
profile類:1.配置環境變量 2.開機運行的一些命令腳本
bashrc類: 1.配置變量 2.配置命令別名
用戶登錄又分為
交互式登錄: 1.su - name切換 2.任何終端登錄
分交互式登錄: 1.圖形界面下的終端 2.su name切換 3.執行腳本開啟的shell
交互式登錄的配置文件讀取順序:/etc/profile----->/etc/profile.d/------->~/.bash_profile----->~/.bashrc------>/etc/bashrc
非交互時登錄配置文件讀取順序:~/.bashrc------>/etc/bashrc-------->/etc/profile.d/
因此bashrc類的配置文件,無論是交互式還是非交互式登錄都要讀取(/etc/profile.d/*.sh也是,所以一些需要開機運行的腳本都放在這個目錄中)
退出時要讀取的配置文件是:~/.bash_logout
本文出自 “博客作業初版” 博客,謝絕轉載!