歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 0525 第八節課

0525 第八節課

日期:2017/3/3 12:05:28   编辑:Linux技術

一.腳本編程基礎

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

本文出自 “博客作業初版” 博客,謝絕轉載!

Copyright © Linux教程網 All Rights Reserved