本週主要講了shell腳本編程基礎,涉及一些基礎語法,Linux文件查找和壓縮,以及文本處理三劍客之一sed。 node
格式要求:首行shebang機制 python
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl 正則表達式
自動化經常使用命令
執行系統管理和故障排除
建立簡單的應用程序
處理文本或文件 shell
檢測腳本中的語法錯誤
bash -n /path/to/some_script
調試執行
bash -x /path/to/some_script 數據庫
Shell中變量命名法則:
一、不能使程序中的保留字:例如if, for
二、只能使用數字、字母及下劃線,且不能以數字開頭
三、見名知義
四、統一命名規則:駝峯命名法
Shell中命名建議規則:
一、變量名大寫
二、局部變量小寫
三、函數名小寫
四、用英文名字,並體現出實際做用 編程
根據變量的生效範圍等標準劃分下面變量類型 centos
變量賦值:name=‘value’
可使用引用value
(1) 能夠是直接字串:name=「root"
(2) 變量引用:name="$USER"
(3) 命令引用:name=COMMAND
name=$(COMMAND)
變量引用:${name} 或者 $name
" " 弱引用,其中的變量引用會被替換爲變量值
' ' 強引用,其中的變量引用不會被替換爲變量值,而保持原字符串
顯示已定義的全部變量:set
刪除變量:unset name bash
變量聲明、賦值:
export name=VALUE
declare -x name=VALUE
變量引用:
$name, ${name}
顯示全部環境變量:
env,
printenv,
export,
declare -x
刪除變量:
unset name app
bash內建的環境變量
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
MAIL
HOSTNAME
HISTSIZE
_ 下劃線 ide
只讀變量:只能聲明,但不能修改和刪除
聲明只讀變量:
readonly name
declare -r name
查看只讀變量:
readonly -p
位置變量:在腳本代碼中調用經過命令行傳遞給腳本的參數
$1, $2, ... 對應第一、第2等參數,shift [n]換位置
$0 命令自己
$ 傳遞給腳本的全部參數,所有參數合爲一個字符串
$@ 傳遞給腳本的全部參數,每一個參數爲獨立字符串
$# 傳遞給腳本的參數的個數
注意:$@ $ 只在被雙引號包起來的時候纔會有差別
set -- 清空全部位置變量
5.特殊變量:$?, $0, $*, $@, $#,$$
+, -, *, /, %取模(取餘), **(乘方),乘法符號有些場景中須要轉義
實現算術運算:
(1) let var=算術表達式
(2) var=$[算術表達式]
(3) var=$((算術表達式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare –i var = 數值
(6) echo ‘算術表達式’ | bc
bash有內建的隨機數生成器變量:$RANDOM(0-32767)
示例:生成 0 - 49 之間隨機數
echo $[$RANDOM%50]
加強型賦值:
+=, -=, *=, /=, %=
let varOPERvalue
例如:let count+=3
自加3後自賦值
自增,自減:
let var+=1
let var++
let var-=1
let var--
true, false
1, 0
與
1 與 1 = 1
1 與 0 = 0
0 與 1 = 0
0 與 0 = 0
或
1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0
非:!
! 1 = 0 ! true
! 0 = 1 ! false
短路運算
短路與
第一個爲0,結果一定爲0
第一個爲1,第二個必需要參與運算
短路或
第一個爲1,結果一定爲1
第一個爲0,第二個必需要參與運算
異或:^
異或的兩個值,相同爲假,不一樣爲真
判斷某需求是否知足,須要由測試機制來實現
專用的測試表達式須要由測試命令輔助完成測試過程
評估布爾聲明,以便用在條件性執行中
• 若真,則返回0 • 若假,則返回1 測試命令:
• test EXPRESSION
• [ EXPRESSION ] • [[ EXPRESSION ]]
注意:EXPRESSION先後必須有空白字符
-v VAR
變量VAR是否設置
數值測試:
-gt 是否大於
-ge 是否大於等於
-eq 是否等於
-ne 是否不等於
-lt 是否小於
-le 是否小於等於
= 是否等於
\> ascii碼是否大於ascii碼 < 是否小於
!= 是否不等於
=~ 左側字符串是否可以被右側的PATTERN所匹配
注意: 此表達式通常用於[[ ]]中;擴展的正則表達式
-z "STRING「 字符串是否爲空,空爲真,不空爲假
-n "STRING「 字符串是否不空,不空爲真,空爲假
注意:用於字符串比較時的用到的操做數都應該使用引號
存在性測試
-a FILE:同 -e -e FILE: 文件存在性測試,存在爲真,不然爲假
存在性及類別測試
-b FILE:是否存在且爲塊設備文件
-c FILE:是否存在且爲字符設備文件
-d FILE:是否存在且爲目錄文件
-f FILE:是否存在且爲普通文件
-h FILE 或 -L FILE:存在且爲符號連接文件
-p FILE:是否存在且爲命名管道文件
-S FILE:是否存在且爲套接字文件
文件權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
文件特殊權限測試:
-u FILE:是否存在且擁有suid權限
-g FILE:是否存在且擁有sgid權限
-k FILE:是否存在且擁有sticky權限
文件大小測試:
-s FILE: 是否存在且非空
文件是否打開:
-t fd: fd 文件描述符是否在某終端已經打開
-N FILE:文件自從上一次被讀取以後是否被修改過
-O FILE:當前有效用戶是否爲文件屬主
-G FILE:當前有效用戶是否爲文件屬組
雙目測試:
FILE1 -ef FILE2: FILE1是不是FILE2的硬連接
FILE1 -nt FILE2: FILE1是否新於FILE2(mtime)
FILE1 -ot FILE2: FILE1是否舊於FILE2
第一種方式:
[ EXPRESSION1 -a EXPRESSION2 ] 而且
[ EXPRESSION1 -o EXPRESSION2 ] 或者
[ ! EXPRESSION ] 取反
-a 和 -o 須要使用測試命令進行,[[ ]] 不支持
第二種方式:
COMMAND1 && COMMAND2 而且,短路與,表明條件性的AND THEN
COMMAND1 || COMMAND2 或者,短路或,表明條件性的OR ELSE
! COMMAND 非
示例:
[ -f 「$FILE」 ] && [[ 「$FILE」=~ .*.sh$ ]]
使用read來把輸入值分配給一個或多個shell變量
-p 指定要顯示的提示
-s 靜默輸入,通常用於密碼
-n N 指定輸入的字符長度N -d ‘字符’ 輸入結束符
-t N TIMEOUT爲N秒
read 從標準輸入中讀取值,給每一個單詞分配一個變量
全部剩餘單詞都被分配給最後一個變量
read -p 「Enter a filename: 「 FILE
多分支
if 判斷條件1; then
條件1爲真的分支代碼
elif 判斷條件2; then
條件2爲真的分支代碼
elif 判斷條件3; then
條件3爲真的分支代碼
else
以上條件都爲假的分支代碼
fi
逐條件進行判斷,第一次遇爲「真」條件時,執行其分支,然後結束整個if語句
case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默認分支
;;
esac
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
我的配置:
~/.bash_profile
~/.bashrc
按功能劃分,存在兩類:
profile類和bashrc類
profile類:爲交互式登陸的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
我的:~/.bash_profile
功用:
(1) 用於定義環境變量
(2) 運行命令或腳本
bashrc類:爲非交互式和交互式登陸的shell提供配置
全局:/etc/bashrc
我的:~/.bashrc
功用:
(1) 定義命令別名和函數
(2) 定義本地變量
修改profile和bashrc文件後需生效
兩種方法: 1從新啓動shell進程
2 . 或source
例:. ~/.bashrc
查詢系統上預建的文件索引數據庫
/var/lib/mlocate/mlocate.db
依賴於事先構建的索引
索引的構建是在系統較爲空閒時自動進行(週期性任務),管理員手動更新數據庫
(updatedb) 索引構建過程須要遍歷整個根文件系統,極消耗資源
工做特色: • 查找速度快 • 模糊查找
• 非實時查找
• 搜索的是文件的全路徑,不只僅是文件名
• 可能只搜索用戶具有讀取和執行權限的目錄
locate命令
locate KEYWORD
經常使用選項
-i 不區分大小寫的搜索
-n N 只列舉前N個匹配項目
-r 使用基本正則表達式
示例
搜索名稱或路徑中帶有「conf」的文件
locate conf
使用Regex來搜索以「.conf」結尾的文件
locate -r ‘.conf$’
工做特色:
• 查找速度略慢
• 精確查找
• 實時查找
• 可能只搜索用戶具有讀取和執行權限的目錄
語法:
find [OPTION]... [查找路徑] [查找條件] [處理動做]
查找路徑:指定具體目標路徑;默認爲當前目錄
查找條件:指定的查找標準,能夠文件名、大小、類型、權限等標準進行;
默認爲找出指定路徑下的全部文件
處理動做:對符合條件的文件作操做,默認輸出至屏幕
指搜索層級
-maxdepth level 最大搜索目錄深度,指定目錄下的文件爲第1級
-mindepth level 最小搜索目錄深度
先處理目錄內的文件,再處理指定目錄
-depth
根據文件名和inode查找:
-name "文件名稱":支持使用glob
*, ?, [], [^]
-iname "文件名稱":不區分字母大小寫
-inum n 按inode號查找
-samefile name 相同inode號的文件
-links n 連接數爲n的文件
-regex 「PATTERN」:以PATTERN匹配整個文件路徑,而非文件名稱
根據屬主、屬組查找:
-user USERNAME:查找屬主爲指定用戶(UID)的文件
-group GRPNAME: 查找屬組爲指定組(GID)的文件
-uid UserID:查找屬主爲指定的UID號的文件
-gid GroupID:查找屬組爲指定的GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
根據文件類型查找
-type TYPE
• f: 普通文件
• d: 目錄文件
• l: 符號連接文件
• s:套接字文件
• b: 塊設備文件
• c: 字符設備文件
• p: 管道文件
空文件或目錄
-empty
示例:find /app -type d -empty
組合條件:
與:-a
或:-o
非:-not !
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
根據文件大小來查找:
-size [+|-]#UNIT
經常使用單位:k, M, G,c(byte)
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)
根據時間戳:
以「天」爲單位
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞] -#: [0,#)
-mtime
-ctime
以「分鐘」爲單位
-amin
-mmin
-cmin
根據權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配便可,或關係,+
從centos7開始淘汰
-MODE:每一類對象都必須同時擁有指定權限,與關係
0 表示不關注
• find -perm 755 會匹配權限模式剛好是755的文件
• 只要當任意人有寫權限時,find -perm +222就會匹配
• 只有當每一個人都有寫權限時,find -perm -222纔會匹配
• 只有當其它人(other)有寫權限時,find -perm -002纔會匹配
-print:默認的處理動做,顯示至屏幕
-ls:相似於對查找到的文件執行「ls -l」命令
-delete:刪除查找到的文件
-fls file:查找到的全部文件的長格式信息保存至指定文件中
-ok COMMAND {} \; 對查找到的每一個文件執行由COMMAND指定的命令,對
於每一個文件執行命令以前,都會交互式要求用戶確認
-exec COMMAND {} \; 對查找到的每一個文件執行由COMMAND指定的命令
{}: 用於引用查找到的文件名稱自身
find傳遞查找到的文件至後面指定的命令時,查找到全部符合條件的文件一次性傳遞給後面的命令
參數替換xargs
因爲不少命令不支持管道|來傳遞參數,xargs用於產生某個命令的參數,xargs
能夠讀入 stdin 的數據,而且以空格符或回車符將 stdin 的數據分隔成爲參數
許多命令不能接受過多參數,命令執行可能會失敗,xargs能夠解決
注意:文件名或者是其餘意義的名詞內含有空格符的狀況
find和xargs的組合:find | xargs COMMAND
示例:
ls | xargs rm 刪除當前目錄下的大量文件
gzip [OPTION]... FILE ...
-d 解壓縮,至關於gunzip
-c 結果輸出至標準輸出,保留原文件不改變
-# 指定壓縮比,#取值爲1-9,值越大壓縮比越大
gunzip file.gz 解壓縮
zcat file.gz 不顯式解壓縮的前提下查看文本文件內容
示例:
gzip -c messages >messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
cat messages | gzip > m.gz
bzip2 [OPTION]... FILE ...
-k keep, 保留原文件
-d 解壓縮
-# 1-9,壓縮比,默認爲9 bunzip2 file.bz2 解壓縮
bzcat file.bz2 不顯式解壓縮的前提下查看文本文件內容
xz [OPTION]... FILE ...
-k keep, 保留原文件
-d 解壓縮
-# 壓縮比,取值1-9,默認爲6 unxz file.xz 解壓縮
xzcat file.xz 不顯式解壓縮的前提下查看文本文件內容
打包壓縮
zip –r /backup/sysconfig /etc/sysconfig/
解包解壓縮
unzip sysconfig.zip
cat /var/log/messages | zip messages -
unzip -p message.gz > message -p 表示管道
tar(Tape ARchive,磁帶歸檔的縮寫)
tar [OPTION]...
(1) 建立歸檔,保留權限
tar -cpvf /PATH/FILE.tar FILE...
(2) 追加文件至歸檔: 注:不支持對壓縮文件追加
tar -r -f /PATH/FILE.tar FILE...
(3) 查看歸檔文件中的文件列表
tar -t -f /PATH/FILE.tar
(4) 展開歸檔
tar -x -f /PATH/FILE.tar
tar -x -f /PATH/FILE.tar -C /PATH/
(5) 結合壓縮工具實現:歸檔並壓縮 -j: bzip2, -z: gzip, -J: xz
--exclude 排除文件
tar zcvf /root/a3.tgz --exclude=/app/host1 --exclude=/app/host2 /app
-T 選項指定輸入文件 -X 選項指定包含要排除的文件列表
tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist
split:分割一個文件爲多個文件
分割大的 tar 文件爲多份小文件
split -b Size –d tar-file-name prefix-name
功能:複製文件從或到歸檔
cpio命令是經過重定向的方式將文件進行打包備份,還原恢復的工具,它能夠解壓以
「.cpio」或者「.tar」結尾的文件
cpio [選項] > 文件名或者設備名
cpio [選項] < 文件名或者設備名
選項
-o 將文件拷貝打包成文件或者將文件輸出到設備上
-O filename 輸出到指定的歸檔文件名
-A 向已存在的歸檔文件中追加文件
-i 解包,將打包文件解壓或將設備上的備份還原到系統
-I filename 對指定的歸檔文件名解壓
-t 預覽,查看文件內容或者輸出到設備上的文件內容
-F filename 使用指定的文件名替代標準輸入或輸出
-d 解包生成目錄,在cpio還原時,自動的創建目錄
-v 顯示打包過程當中的文件名稱
用法:
sed [option]... 'script' inputfile...
經常使用選項:
-n 不輸出模式空間內容到屏幕,即不自動打印
-e 多點編輯
-f /PATH/SCRIPT_FILE 從指定文件中讀取編輯腳本
-r 支持使用擴展正則表達式
-i.bak 備份文件並原處編輯
地址定界:
(1) 不給地址:對全文進行處理
(2) 單地址:
#:指定的行,$:最後一行
/pattern/:被此處模式所可以匹配到的每一行
(3) 地址範圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步進
1~2 奇數行
2~2 偶數行
編輯命令:
d 刪除模式空間匹配的行,並當即啓用下一輪循環
p 打印當前模式空間內容,追加到默認輸出以後
a []text 在指定行後面追加文本,支持使用\n實現多行追加
i []text 在行前面插入文本
c []text 替換行爲單行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 讀取指定文件的文本至模式空間中匹配到的行後
= 爲模式空間中的行打印行號
! 模式空間中匹配行取反處理
s/// 查找替換,支持使用其它分隔符,s@@@,s###
替換標記:
g 行內全局替換
p 顯示替換成功的行
w /PATH/FILE 將替換成功的行保存至文件中
P: 打印模式空間開端至\n內容,並追加到默認輸出以前 h: 把模式空間中的內容覆蓋至保持空間中 H:把模式空間中的內容追加至保持空間中 g: 從保持空間取出數據覆蓋至模式空間 G:從保持空間取出內容追加至模式空間 x: 把模式空間中的內容與保持空間中的內容進行互換 n: 讀取匹配到的行的下一行覆蓋至模式空間 N:讀取匹配到的行的下一行追加至模式空間 d: 刪除模式空間中的行 D:若是模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本, 並不會讀取新的輸入行,而使用合成的模式空間從新啓動循環。若是模式空間 不包含換行符,則會像發出d命令那樣啓動正常的新循環