1. 程式人生 > >linux學習筆記3.0

linux學習筆記3.0

筆記

命令
service network restart 重啟網絡
systemctl network restart
systemctl restart ssh
name=“value” 變量賦值
$(1.../@/*/#/0/?/$) 位置變量
test EXPRESSION 測試命令
export 設置全局變量
readonly name 設置只讀變量
env、printenv、export、declare -x 查看全局變量
shift 左移參數
let 算數運算
read 接收輸入
locate 查詢系統上預建的文件索引數據庫
find 通過遍歷指定路徑完成文件查找
xargs 分割過大參數
壓縮/解壓縮:
compress/uncompress
gzip/gunzip
bzip2/bunzip2
xz/unxz
zip/unzip
tar 打包文件
cpio 通過重定向打包壓縮備份
sed 行編輯器


shell腳本編程基礎

編程基礎
程序:指令+數據
程序編程風格:
過程式:以指令為中心,數據服務於指令
對象式:以數據為中心,指令服務於數據
shell程序:提供了編程能力,解釋執行
程序的執行方式
計算機運行二進制指令
編程語言:
低級:匯編

高級:
編譯:高級語言-->編譯器(程序員)-->目標代碼(java,C#)
解釋:高級語言-->解釋器(電腦)-->機器代碼(shell,perl,python)
編程基本概念
編程邏輯處理方式:
順序執行,循環執行,選擇執行

shell編程:

過程式,解釋執行
編程語言的基本結構:
各種系統命令的組合
數據存儲:變量、數組
表達式:a+b
語句:if

shell腳本:

包含一些命令或聲明,並符合一定格式的文本文件
格式要求:
首行shebang機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
聲明所使用的語言
shell腳本用途:
自動化常用命令
執行系統管理命令
創建簡單的應用程序
處理文本或文件


創建shell腳本:

第一步:使用文本編輯器來創建文本文件
第一行必須包括shell聲明序列:#!
添加註釋,以#開頭
第二步:運行腳本
給予執行權限,在命令行上指定腳本的絕對或相對路徑
直接運行解釋器,將腳本作為解釋器程序的參數運行
腳本規範:
腳本代碼開頭約定
1、第一行一般為調用使用的語言
2、程序名,避免更改文件名為無法找到正確的文件
3、版本號
4、更改後的時間
5、作者相關信息
6、該程序的作用,及註意事項
7、最後是各個版本的更新簡要說明
腳本調試
檢測腳本中的語法錯誤(只能檢測出語法錯誤)
bash -n
調試執行
bash -x


變量

變量:命名的內存空間
數據儲存方式:
字符
數值(整型,浮點型)
變量類型作用:
1、數據存儲格式
2、參與的運算
3、表示的數據範圍
附:
強類型變量:
變量不經過強制轉換,他永遠是這個數據類型,不允許隱式的類型轉換。一般定
義變量是必須指定類型,參與運算必須符合類型要求;調用為聲明變量會產生錯
誤。如:java,c#
弱類型變量:
語言的運行時會隱式做數據類型轉換。無須指定類型,默認均為字符型;參與運
算時會自動進行隱式類型轉換;變量無須事先定義可直接調用
。如:bash(不支持浮點數),php
變量命名法則:
1、不能使用程序中的保留字(if,for等)
2、只能使用數字、字母以及下劃線,且不能以數字開頭
3、見名知義
4、統一命名規則:駝峰命名法(AbcDfg大駝峰;abcDfg小駝峰)


bash中變量種類

根據變量的生效範圍等標準劃分為下面變量類型:
局部變量:
生效範圍為當前shell進程,對其他任何shell進程均無效
變量賦值:name=‘value’
可以使用引用value:
(1)可以是直接字串:name=“root”
(2)變量引用:name=“$USER”
“”:強引用,其中的變量引用會被替換為變量值
‘’:弱引用,其中的變量引用不會被替換為變量值,而保持原字符串
(3)命令引用:name=command name=$(command)
顯示已定義的所有變量:set
附:""可以保留變量內容格式
刪除變量:unset name

環境(全局)變量:
生效範圍為當前shell進程及其子進程,全局變量可往下傳(父->子),但不能
回傳
變量聲明、賦值:
export name=VALUEexport
可將將局部變量轉換成環境變量
declare -x name=VALUE
變量引用:$name,${name}
顯示所有環境變量:
env
printenv
export
declare -x
刪除變量:
unset name
bash內建的環境變量:
PATH、SHELL、USER、UID、HOME、PWD、SHLVL(查看當前shell層級)、LANG(
語言)、MAIL、HOSTNAME、HISTSIZE、_(上個命令的最後一個字符串)
附:

()與{}的區別
共同點:執行多個命令的組合
不同點:()開個一次性子shell,對當前shell環境無影響,用於一次性任務(括號內
shellpid=當前shellpid,變量繼承當前變量)
{}不開啟子shell,對當前環境有影響,位置變量超過10需用{10}表示
{}中前後都需要加空格,且命令都需要跟;

本地變量:
生效範圍為當前shell進程中某代碼片斷,通常指函數

位置變量:
$1,$2,...來表示,用於讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
只讀變量:
只能聲明,不能修改和刪除
聲明只讀變量:
readonly name、declare -r name
查看只讀變量:
readonly -p

退出狀態
進程使用退出狀態來報告成功或失敗
0代表成功,1-255代表失敗
$?變量保存最近的命令退出狀態
退出狀態碼
bash自定義退出狀態碼
exit[n]:自定義退出狀態碼
註意:
1、腳本一旦遇到exit命令,腳本會立即終止,終止狀態碼取決於exit命令後面
的數字
2、如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決於腳本中執行的
最後一條命令的狀態碼
3、命令錯誤不影響繼續執行,語法錯誤終止執行


shift

作用:將輸入參數整體向左移(默認一位),後一位取代前一位
shift多用於循環


算數運算

bash中的算數運算:help let
+,-,*,/,%(取模,取余),**(乘方)
實現算數運算:
1、let var=算數表達式
2、var=$[算數表達式]
3、var=$((算數表達式))
4、var=$(expr arg1 arg2 arg3 ...)(arg參數)
5、declare -i var=數值
6、echo ‘算數表達式‘ |bc
乘法符號有些場景中需要轉義,如*
bash有內建的隨機數生成器:$RANDOM(0-32767)
echo$[$RANDOM%50]:0-49間的隨機數
增強型賦值:
x+=(x=x+1)、-=、*=、/=、%=
let x+=3:x自加3後自賦值
自增,自減:
let var+=1
let var++
let var-=1
let var--

邏輯運算
0 false
1 true
與;或
0&0=0;0|0=0
0&1=0;0|1=1
1&0=0;1|0=1
1&1=0;1|1=1

短路與,短路或
0&&0=0
0&&1=0
1&&0=0
1&&1=1
cmd1 && cmd2
若cmd1為假,cmd2不執行;反之,cmd2執行
0||0=0
0||1=1
1||0=1
1||1=1
cmd1 || cmd2
若cmd1為真,cmd2不執行;反之,cmd2執行

xor 異或
0^0=0
0^1=1
1^0=1
1^1=0
同為假,異為真
作用:取反

條件性的執行操作符
根據退出狀態而定,命令可以有條件地運行
&&:代表條件性的AND THEN
||:代表條件性的OR ELSE


條件測試

判斷某需求是否滿足,需要由測試機制來實現:
專用的測試表達式需要由測試命令輔助完成測試過程
評估布爾聲明,以便用在條件性執行中:
真,返回0
假,返回1
測試命令:
test EXPRESSION
[ EXPRESSION ](用於普通匹配)
[[ EXPRESSION ]](用於利用擴展正則匹配)
註意:EXPRESSION前後必須有空白字符
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”:字符串是否不空,不空為真,空為假
註意:用於字符串比較時的用到的操作數都應該使用引號

bash文件測試
存在性測試:
-a FILE:同-e
-e FILE:文件存在性測試,存在為真,否則為假
存在性及類別測試:
-b FILE:是否存在且為設備文件
-c FILE:是否存在且為字符設備文件
-d FILE:是否存在且為目錄文件
-f FILE:是否存在且為普通文件
-h或-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 -e FILE2:FILE1是否是FILE2的硬鏈接
FILE1 -nt FILE2:FILE1是否新於FILE2(mitme)
FILE1 -ot FILE2:FILE1是否舊於FILE2

bash的組合測試條件
方式一:
cmd1&&cmd2 並且
cmd1||cmd2 或者
!cmd 非
方式二:
EXPRESSION1(表達式) -a EXPRESSION2 並且
EXPRESSION1 -o EXPRESSION2 或者
!EXPRESSION 非
註意:必須使用測試命令進行


使用read命令來接收輸入

用read命令把輸入的值分配給一個或多個shell變量
-p 指定要顯示的提示,輸入不換行
-s 靜默輸入,一般用於密碼
-n 指定輸入的字符長度
-d 指定輸入結束符
-t 指定TIMEOUT時間
read從標準輸入中讀取值,給每個單詞分配一個變量,所有剩余單詞都被分配給
最後一個變量
read批量賦值:
read x y z <file
read x y z <<<"a b c"


防止擴展

反斜線:
會使隨後的字符按原意解釋
加引號來防止擴展:
單引號防止所有擴展
雙引號也防止所有擴展,但以下情況例外:
$-變量擴展
反引號-命令擴展
-禁止單個字符擴展
!-歷史命令替換


bash的配置文件

安生效範圍劃分:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
(profile:配置文件,放環境變量和啟動程序)
(bashrc:bash run command,即bash的運行配置文件,放別名和函數)
個人配置:
~/.bash_profile
~/.bashrc
shell登錄的兩種方式
交互式登錄:
1、直接通過終端輸入賬號密碼登錄
2、使用“su - UserName”切換用戶
執行順序:/etc/profile-->/etc/profile.d/.sh-->~/.bash_profile-- >~/bashrc-->/etc/bashrc
非交互式登錄:
1、su UserName
2、圖形界面下打開終端
3、執行腳本
4、任何其他的bash實例
執行順序:~/bashrc-->/etc/bashrc-->/etc/profile.d/`
`.sh

按功能劃分:
profile類:
為加交互式登錄的shell提供配置
全局:/etc/profile,/etc/profile.d/*.sh
個人:~/bash_profile
功用:(1)用戶定義環境變量 (2)運行命令或腳本
bashrc類:
全局:/etc/bashrc
個人:~/.bashrc
功用:(1)定義命令別名和函數 (2)定義本地變量

編輯配置文件生效
修改profile和bashrc文件後需生效
兩種方法:
1、重新啟動shell進程
2、.或source

Bash退出任務
保存在~/.bash_logout文件中(用戶)
在退出登錄shell時運行
用於:
1、創建自動備份
2、清除臨時文件

$-變量(代表一些功能的組合)
h:hashall,打開這個選項後,shell會將命令所在路徑hash下來,避免每次都
要查詢。通過set +h,將h選項關閉
i:interactive-comments,包含這個選項說明當前的shell是一個交互式的
shell。所謂的交互式shell,在腳本中,i選項是關閉的
m:monitor,打開監控模式,就可以通過Job control來控制進程的停止、繼續
,後臺或者前臺執行等
B:braceexpand,大括號擴展
H;history,H選項打開,可以展開歷史列表中的命令,可以通過!來完成使用
,如:“!!”返回最近一個歷史命令,“!n”返回第n個歷史命令

附:
1、.(source)和直接運行腳本的區別
source運行腳本是在當前shell中運行,改變的是當前shell的變量
直接運行腳本是在shell子進程中運行,改變子進程變量,對當前shell無影響
2、腳本中不識別別名,別名無法生效

bash如何展開命令行(執行順序)
1、把命令行分成單個命令詞
2、展開別名
3、展開{}內容
4、展開~符
5、用命令替換$()和“”
6、再把命令行分成命令詞
7、展開文件通配符
8、處理重定向
9、運行命令


文件查找

在文件系統上查找符合條件的文件
命令:
非實時查找(數據庫查找):locate
實時查找:find
locate搜索速度快,但不能實時更新
find功能強大,但搜索很慢,影響服務器性能

locate
查詢系統上預建的文件索引數據庫
/var/lib/mlocate/molcate.db
依賴於事先構建好的索引
索引的構建是在系統較為空閑時自動進行(周期性任務),管理員手動更新數據
庫(updatadb)
索引構建過程需要遍歷整個根文件系統,極消耗資源
工作特點:
查找速度快
模糊查找
非實時查找
搜索的是文件的全路徑,不僅僅是文件名
可能只搜索用戶具備讀取和執行權限的目錄
locate命令
locate KEYWORD
有的選項:
-i 不區分大小寫的搜索
-n N 只列舉前N個匹配選項
-r 使用正則表達式

find
實時查找工具,通過遍歷指定路徑完成文件查找
工作特點:
查找速度慢
精確查找
實時查找
可能只搜索用戶具備讀取和執行權限的目錄
find命令:
find [OPTION]...[查找路徑][查找條件][處理動作]
查找路徑:指定具體目標路徑(默認為當前目錄)
查找條件:指定的查找目標,可以文件名、大小、類型、權限等標準進行(默認
為找出指定路徑下的所有文件)
處理動作:對符合條件的文件做操作(默認輸出至屏幕)

查找條件
指搜索層級:
-maxdepth level 最大搜索目錄深度,指定目錄為第一級
-mindepth level 最小搜索目錄深度
根據文件名和inode查找:
-name“文件名稱”:支持使用glob(通配符:*,?,[],[^])
-iname“文件名稱”:不區分字母大小寫
-inum n:按inode號查找(inode節點編號)
-samefile name:相同inode號的文件
-links n:鏈接數為n的文件
-regex“PATTERN”:以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名

根據屬主、屬組查找:
-user USERNAME:查找屬主為指定用戶的文件
-group GRPNSME:查找屬組為指定組的文件
-uid UserID:查找屬主為指定UID號的文件
-gid GroupID:查找屬組為指定GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件

根據文件類型查找:
-type TYPE:
f:普通文件
d:目錄文件
l:符號鏈接文件
s:套接字文件
b:塊設備文件
c:字符設備文件
p:管道文件
-empty:空文件或目錄
-prune:排除(prune:砍掉,去除)

組合條件:
與:-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,#]
-#UNIT:[0,#-1]
+#UNIT:(#,無窮)

根據時間戳:
以“天”為單位:
-atime [+|-]#
#:[#,#+1)
+#:[#+1,無窮]
-#:[0,#)
-mtime
-ctime
以“分鐘”為單位:
-amin
-mmin
-cmin

根據權限查找:
-perm [/|-]MODE
MODE:精確權限匹配
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,/表
示並集(老版本為+)
-MODE:每一類對象都必須同時擁有指定權限,與關系
0表示不關註

處理動作
-print:默認的處理動作,顯示至屏幕
-ls:類似於對查找到的文件執行“ls -l”
-delete:刪除查找到的文件
-fls file:查找到的所有文件的長格式信息保存至指定文件中
-ok COMMAND{}\;:對查找到的每個文件執行由COMMAND指定的命令,對於每個
文件執行命令前,都會交互式要求用戶確認
-exec COMMAND{}\;:對查找到的每個文件執行由COMMAND指定的命令
{}:用於引用查找到的文件名稱自身
ok和exec選項後必須跟\;
find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性
傳遞給後面的命令


參數替換xargs

xargs用於產生某個命令的參數,xargs可以讀入stdin的數據,並且以空格符或
回車符將stdin的數據分隔成為arguments
xargs -n 解決參數過長無法執行問題
find和xargs組合使用格式:
find|xargs COMMAND


壓縮、解壓縮及歸檔工具

compress/uncompress:Z
-d:解壓縮,相當於uncompress
-c:結果輸出至標準輸出,不刪除原文件
-v:顯示詳情

gzip/gunzip:gz
-d:解壓縮,相當於gunzip
-c
-#:1-9,指定壓縮比,值越大壓縮比越大(默認為6)
zcat:不解壓前提下查看文本內容

bzip2/bunzip2
-k:保留原文件
-d
-#(默認為9)
bzcat

xz/unxz
-k
-d
-#(默認為6)
xzcat

zip/unzip
打包壓縮
zip -r /testdir/sysconfig /etc/sysconfig/
附:
1、linux中文件名後綴要求不嚴格,但壓縮工具對文件後綴名要求嚴格
2、xz太新,並不常用,常用的還是gzip和bzip


tar工具

tar(Tape ARchive,磁帶歸檔的縮寫)
(1)創建歸檔
tar -cpvf /PATH/TO/SOMEFILE.tar FILE...
(2)追加文件至歸檔(不支持對壓縮文件追加)
tar -r -f /PATH/TO/SOMEFILE.tar FILE...
(3)查看歸檔文件中的文件列表
tar -t -f /PATH/TO/SOMEFILE.tar
(4)展開歸檔
tar -x -f /PATH/TO/SOMEFILE.tar
tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH
(5)結合壓縮工具實現:歸檔並壓縮
-j:bzip2,-z:gzip,-J:xz

tar打包文件
-T:指定輸入文件
-X:指定包含要排除的文件列表
分割(tar文件為多個小份文件):
split -b Size -d tar-file-name prefix-name
合並:
cat


cpio

功能:復制文件從或到歸檔
cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具它可以解壓
縮以“.cpio”或者“.tar”結尾的文件
cpio[選項]>文件名或者設備名
cpio[選項]<文件名或者設備名
-o:將文件拷貝打包成文件或者將文件輸出到設備上
-i:解包,將打包文件解壓或將設備上的備份還原到系統
-t:預覽,查看文件內容或者輸出到設備上的文件內容
-v:顯示打包過程中的文件名稱
-d:解包生成目錄,在cpio還原時,自動的建立目錄
-c:一種較新的存儲方式


文本處理三劍客

sed,行編輯器,一次處理一行內容,自帶循環
處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成後,把緩沖區的內容送往屏幕。然後讀入下行,執行下一個循環
功能:
主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等
用法:
sed [option]...‘script’inputfile...

linux學習筆記3.0