1. 程式人生 > >Linux基礎知識:SHELL指令碼;find查詢、tar壓縮;sed檔案處理工具

Linux基礎知識:SHELL指令碼;find查詢、tar壓縮;sed檔案處理工具

Shell指令碼程式設計基礎
程式
程式:演算法+資料結構
資料:是程式的核心
資料結構:資料在計算機中的型別和組織方式
演算法:處理資料的方式
程式程式設計風格:
過程式:以指令為中心,資料服務於指令
物件式:以資料為中心,指令服務於資料
shell程式:提供了程式設計能力,解釋執行
高階程式語言:
編譯:高階語言-->編譯器-->機器程式碼-->執行
C,C++
解釋:高階語言-->執行-->直譯器-->機器程式碼
shell,python,php,JavaScript,perl
編譯語言:像吃大餐,做好再吃,從執行角度看,效率高。
解釋語言:像吃火鍋,邊吃邊做,從開發角度看,效率高。
shell指令碼基礎
shell指令碼:
包含一些命令或宣告,並符合一定格式的文字檔案
格式要求:首行shebang機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell指令碼的用途有:
自動化常用命令
執行系統管理和故障排除
建立簡單的應用程式
shell指令碼示例
#!/bin/bash

------------------------------------------

Filename: hello.sh

Revision: 1.1

Date: 2017/06/01

Author: wang

Email: [email protected]

Website: www.magedu.com

Des處理文字或檔案

指令碼除錯檢測指令碼中的語法錯誤
bash -n /path/to/some_script
除錯執行bash -x /path/to/somescri
變數
Shell中變數命名法則:
1、不能使程式中的保留字:例如if, for
2、只能使用數字、字母及下劃線,且不能以數字開頭
3、見名知義
4、統一命名規則:駝峰命名法
Shell中命名建議規則:
1、變數名大寫
2、區域性變數小寫
3、函式名小寫
4、用英文名字,並體現出實際作用
bash中變數的種類
根據變數的生效範圍等標準劃分下面變數型別
區域性變數:生效範圍為當前shell程序;對當前shell之外的其它shell程序,
包括當前shell的子shell程序均無效
環境變數:生效範圍為當前shell程序及其子程序
本地變數:生效範圍為當前shell程序中某程式碼片斷,通常指函式
位置變數:$1, $2, ...來表示,用於讓指令碼在指令碼在指令碼程式碼中呼叫通過命令列傳遞給它的引數
特殊變數:$?, $0, $*,

[email protected], $#,$$
練習
1、編寫指令碼/root/bin/systeminfo.sh,顯示當前主機系統資訊,包括主機名,IPv4地址,作業系統版本,核心版本,CPU型號,記憶體大小,硬碟大小
2、編寫指令碼/root/bin/backup.sh,可實現每日將/etc/目錄備份到
/root/etcYYYY-mm-dd中
3、編寫指令碼/root/bin/disk.sh,顯示當前硬碟分割槽中空間利用率最大的值
4、編寫指令碼/root/bin/links.sh,顯示正連線本主機的每個遠端主機的IPv4地址和連線數,並按連線數從大到小排序
環境變數
bash內建的環境變數:PATH SHELL USER UID HOME PWD SHLVL LANG MAIL HOSTNAME HISTSIZE
下劃線
只讀和位置變數
 只讀變數:只能宣告,但不能修改和刪除
 宣告只讀變數:
readonly name
declare -r name
 檢視只讀變數:
readonly -p
位置變數:在指令碼程式碼中呼叫通過命令列傳遞給指令碼的引數
$1, $2, ... 對應第1、第2等引數,shift [n]換位置
$0 命令本身
$ 傳遞給指令碼的所有引數,全部引數合為一個字串
[email protected] 傳遞給指令碼的所有引數,每個引數為獨立字串
$# 傳遞給指令碼的引數的個數
注意:[email protected] $
只在被雙引號包起來的時候才會有差異
set -- 清空所有位置變數
退出狀態
程序使用退出狀態來報告成功或失敗
0 代表成功,1-255代表失敗
$? 變數儲存最近的命令退出狀態
例如:
ping -c1 -W1 hostdown &> /dev/null
echo $?
算術運算
bash中的算術運算:help let
+, -, *, /, %取模(取餘), **(乘方),乘法符號有些場景中需要轉義
實現算術運算:
(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]
短路運算
短路與
第一個為0,結果必定為0
第一個為1,第二個必須要參與運算
短路或
第一個為1,結果必定為1
第一個為0,第二個必須要參與運算
異或:^
異或的兩個值,相同為假,不同為真
條件性的執行操作符根據退出狀態而定,命令可以有條件地執行• && 代表條件性的AND THEN• || 代表條件性的OR ELSE例如:grep -q no_such_user /etc/passwd \
|| echo 'No such user' No such userping -c1 -W2 station1 &> /dev/null \

&& echo "station1 is up" \
|| (echo 'station1 is unreachable'; exit 1)
station1 is up
test命令
長格式的例子:
test "$A" = "$B" && echo "Strings are equal"
test “$A”-eq “$B” && echo "Integers are equal"
簡寫格式的例子:
[ "$A" = "$B" ] && echo "Strings are equal"
[ "$A" -eq "$B" ] && echo "Integers are equal"
bash的數值測試
-v VAR
變數VAR是否設定
數值測試:
-gt 是否大於
-ge 是否大於等於
-eq 是否等於
-ne 是否不等於
-lt 是否小於
-le 是否小於等於
bash的字串測試
字串測試:
= 是否等於
ascii碼是否大於ascii碼
< 是否小於
!= 是否不等於
=~ 左側字串是否能夠被右側的PATTERN所匹配
注意: 此表示式一般用於[[ ]]中;擴充套件的正則表示式
-z "STRING“ 字串是否為空,空為真,不空為假
-n "STRING“ 字串是否不空,不空為真,空為假
注意:用於字串比較時的用到的運算元都應該使用引號
read -p “Enter a filename: “ FILE
條件選擇if語句
選擇執行:
注意:if語句可巢狀
單分支
if 判斷條件;then
條件為真的分支程式碼
fi
雙分支
if 判斷條件; then
條件為真的分支程式碼
else
條件為假的分支程式碼
Fi
If示例
根據命令的退出狀態來執行命令
if ping -c1 -W2 station1 &> /dev/null; then
echo 'Station1 is UP'
elif grep "station1" ~/maintenance.txt &> /dev/null; then
echo 'Station1 is undergoing maintenance‘
else
echo 'Station1 is unexpectedly DOWN!'
exit 1
Fi
條件判斷:case語句
case 變數引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
)
預設分支
;;
esac
find查詢 tar壓縮 部分
查詢條件
根據屬主、屬組查詢:
-user USERNAME:查詢屬主為指定使用者(UID)的檔案
-group GRPNAME: 查詢屬組為指定組(GID)的檔案
-uid UserID:查詢屬主為指定的UID號的檔案
-gid GroupID:查詢屬組為指定的GID號的檔案
-nouser:查詢沒有屬主的檔案
-nogroup:查詢沒有屬組的檔案
查詢空檔案或目錄:find /app -type d -emp
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
示例:找出/tmp目錄下,屬主不是root,且檔名不以f開頭的檔案
find /tmp ( -not -user root -a -not -name 'f
' ) -ls
find /tmp -not ( -user root -o -name 'f' ) –ls
排除目錄
示例:
查詢/etc/下,除/etc/sane.d目錄的其它所有.conf字尾的檔案
find /etc -path ‘/etc/sane.d’ -a –prune -o -name “
.conf”
查詢/etc/下,除/etc/sane.d和/etc/fonts兩個目錄的所有.conf字尾的檔案
find /etc ( -path "/etc/sane.d" -o -path "/etc/fonts" ) -a -prune -o -
name ".conf"
根據許可權查詢:根據許可權查詢:
-perm [/|-]MODE
MODE: 精確許可權匹配
/MODE:任何一類(u,g,o)物件的許可權中只要能一位匹配即可,或關係,+ 從centos7開始淘汰
-MODE:每一類物件都必須同時擁有指定許可權,與關係
0 表示不關注
• find -perm 755 會匹配許可權模式恰好是755的檔案
• 只要當任意人有寫許可權時,find -perm +222就會匹配
• 只有當每個人都有寫許可權時,find -perm -222才會匹配
• 只有當其它人(other)有寫許可權時,find -perm -002才會匹配
有些命令不能接受過多引數,命令執行可能會失敗,xargs可以解決
替換引數xargs示例:
ls f
|xargs rm
find /sbin/ -perm +700 |ls -l 這個命令是錯誤的
find /bin/ -perm /7000 | xargs ls -l 查詢有特殊許可權的檔案
find /bin/ -perm -7000 | xargs ls -l 此命令和上面有何區別?
find和xargs格式:find | xargs COMMAND
備份配置檔案,新增.orig這個副檔名
find -name “.conf” -exec cp {} {}.orig \;
提示刪除存在時間超過3天以上的joe的臨時檔案
find /tmp -ctime +3 -user joe -ok rm {} \;
在主目錄中尋找可被其它使用者寫入的檔案
find ~ -perm -002 -exec chmod o-w {} \;
查詢/data下許可權為644,字尾為sh的普通檔案,增加執行許可權
find /data –type f -perm 644 -name “
.sh” –exec chmod 755 {} \;
檢視/home的目錄
find /home –type d -ls
壓縮:gunzip file.gz 解壓縮
zcat file.gz 不顯式解壓縮的前提下檢視文字檔案內容
bunzip2 file.bz2 解壓縮
bzcat file.bz2 不顯式解壓縮的前提下檢視文字檔案內容
unxz file.xz 解壓縮
xzcat file.xz 不顯式解壓縮的前提下檢視文字檔案內容
打包壓縮
zip –r /backup/sysconfig /etc/sysconfig/
解包解壓縮
unzip sysconfig.zip
cat /var/log/messages | zip messages -
unzip -p message > message
Tar:tar -cpvf /PATH/FILE.tar FILE... 建立歸檔
tar -r -f /PATH/FILE.tar FI 追加檔案至文件
檢視歸檔檔案中的檔案列表
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
檔案查詢工具sed
|sed -r '[email protected](./)([^/]+)/[email protected]\[email protected]' 取基名
|sed -r '[email protected](./)([^/]+)/[email protected]\[email protected]' 取目錄名
使用sed命令取IPV4地址:
1、|sed -n '2p' |sed -r 's/inet//' |sed -r 's/netmask.
//' |tr -d " "
2、|sed -n '2p' sed -e 's/^.inet//' -e 's/.//'
3、|sed -n -e '2s/^.inet//' -e '2s/ .//p'
4、|sed -nr '[email protected]inet (.) .n.@\[email protected]'
5、|sed -nr '2s/[^0-9]+([0-9.]+).*/\1/p'