寫在前面:
博客書寫牢記5W1H法則:What,Why,When,Where,Who,How。
本節主要內容:
◆ bash特徵之:命令補全和路徑補全
◆ 目錄管理命令:
mkdir、rmdir
◆ bash特徵之:命令行展開
tree
◆ bash特徵之:命令執行狀態結果
◆ 文件查看類命令:
more、less、head、tail、stat、touch
◆ 文件管理類命令:
cp、mv、rm
◆ bash特徵之:glob(通配符)
◆ bash特徵之:變量
set、unset、declare、export、env、printenv、readonly
◆ bash特徵之:I/O重定向和管道
tr
回顧:
廣義的shell:GUI和CLI
bash特徵之:命令補全和路徑補全
命令補全:
shell程序在接收到用戶執行命令的請求且分析完成之後,最左側的字符串講當做命令去查找,分別查找內部命令和外部命令。
由於外部命令文件存儲在不同的系統目錄中,那麼查找外部命令之前就必須讓系統知道命令文件路徑,而linux中的$PATH變量就是用來存儲這個路徑的。
$PATH的查找方式爲從左到右,當給定的頭部字符串能夠唯一標識某程序文件名時,則直接補全,不能唯一標識時,再次按tab給出列表。
命令錯誤時按tab沒有響應。
路徑補全:
與命令補全類似,當給出的路徑名前幾個字符串能夠唯一標識路徑或文件名時,按tab會自動補全
不能唯一標識時,按2下tab會給出列表。
路徑錯誤按tab沒有響應。
目錄管理命令:
mkdir與rmdir
mkdir
mkdir [OPTION]... DIRECTORY...
-m|--mode=MODE:設置目錄權限;
-p|--parents:當父目錄不存在時,直接創建,而不是報錯
-v|--verbose:顯示詳細信息
rmdir
rmdir [OPTION]... DIRECTORY...
-p|--parents:刪除子目錄後,如果其父目錄爲空,也一併刪除
-v|--verbose:顯示詳細信息
bash特徵之:命令行展開
把命令行給定的特殊符號直接自動替換爲相應字符串的機制。
~:自動替換爲登錄用戶家目錄;
~USERNAME:自動替換爲USERNAME的家目錄;
{}:路徑或文件展開符,可展開用“,”隔開的多個路徑;
如:/tmp/{x/y,m/{m,n}}則表示/tmp/x/y,/tmp/m/m,/tmp/m/n三個路徑或文件
tree:
list contents of directories in a tree-like format.
-d:只顯示目錄
-P PATTERN:只顯示匹配PATTERN的文件或目錄
-I PATTERN:不顯示匹配PATTERN的文件或目錄
-L LEVEL:顯示的最深目錄層級
bash特徵之:命令執行狀態結果
命令的執行狀態結果是命令執行完成後返回的一個狀態數值,與命令的輸出結果不是同一個概念。
通過命令引用,得到的是命令的執行完成輸出結果。
·COMMAND·
命令的執行狀態結果:
成功:0
失敗:1-255
bash將命令執行狀態結果保存在特殊變量$?中,注意其只保留了最後一次執行的命令狀態結果。
文件查看類命令:
分屏查看命令:more、less
more:
more [options] file [...]
less:
less file [...]
head:
output the first part of files
head [OPTION]... [FILE]...
-n,--lines=[-]N:打印前N行,如果爲-N,則打印除最後N行的其他行。
tail:
output the last part of files
tail [OPTION]... [FILE]...
-f,--follow:查看文件尾部並且不退出,當追加新內容時,繼續顯示;Ctrl+c結束顯示;
-n,--lines=[+]N:打印後N行,如果爲+N,則打印第N行至最後一行的內容;
stat:
display file or file system status
stat [OPTION]... FILE...
-f,--file-system:display file system status instead of file status
例如:不加任何參數stat的輸出如下:
File: `/etc/fstab' Size: 860 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 131079 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-03-05 18:15:15.642655122 +0800 Modify: 2016-03-05 18:02:57.132999974 +0800 Change: 2016-03-05 18:13:53.404999799 +0800
回顧:文件的數據組成分爲元數據(metadata,記錄了文件大小,訪問權限,屬組屬主等信息)和數據(data block,數據本身)
這裏指出了3個時間戳(timestamps):
Atime:文件最近一次被訪問的時間;
Mtime:文件最近一次被修改的時間(數據);
Ctime:文件最近一次被修改的時間(元數據);
touch:
change file timestamps
touch [OPTION]... FILE...
不加任何參數,則修改atime和mtime爲當前時間
-a:只修改atime;
-m:只修改mtime;
-t STAMP:使用[[CC]YY]MMDDhhmm[.ss]格式手動設置時間,而不是當前時間;
文件管理工具:
cp:
copy files and directories
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
默認情況下,cp複製遇到軟鏈接文件時,會直接複製鏈接指向的文件。
-a,--archive:歸檔複製,保留權限信息、遞歸、保留鏈接文件本身;
--bakcup:保留所有屬性信息,甚至atime都不會修改;
-i,--interactive:交互式提醒,有重複文件時提醒;
-f,--force:強制覆蓋;
-R,-r,--recursive:遞歸複製目錄及其子目錄下內容;
-P,--no-dereference:複製鏈接本身,而非鏈接指向的文件;
--parents:在目的目錄,保留目錄路徑信息;如cp --parents /etc/fstab .會在當前目錄新建etc目錄,然後在etc目錄裏創建fstab文件
--preserve[ATTR LIST]:指定保留的屬性列表
默認:mode,ownership,timestamps;
額外:context(上下文),links, xattr, all
-v, --verbose;顯示詳細信息;
mv:
move (rename) files
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
-i, --interactive:交互式提醒;
-f, --force:強制操作;
-v, --verbose;顯示詳細信息;
rm:
remove files or directories
rm [OPTION]... FILE...
-f,--force:強制複製,直接操作取消提醒;
-i:交互提醒;
-r, -R, --recursive:遞歸
-v, --verbose;顯示詳細信息
bash特徵之:glob(通配符)
glob:文件名統配,用以快速引用多個文件。
元字符:通配符中具有特殊意義的專用字符,可編寫匹配模式(pattern)。
*:匹配任意長度的任意字符;
如p*匹配:p、p88、prdsfsdflkj、p%%%%%等
?:匹配單個任意字符;
如p?匹配:p1、pr、pp等
[]:匹配指定字符集中的其中一個字符;
[a-z]匹配大小寫a-z之間的任意一個字符;
[0-9]匹配0到9之間任何一個字符;
用[]標示各種字符的特定格式如下:
man tr可以看到[:alnum:]等!!!
[[:upper:]]:所有大寫字母;
[[:lower:]]:所有小寫字母;
[[:digit:]]:所有的數字;
[[:alpha:]]:所有字母;
[[:alnum:]]:所有字母和數字;
[[:space:]]:空白字符;
[[:punct:]]:標點符號;
[^ ]:匹配指定字符以外的任意字符;
如[^0-9]匹配非數字的任意字符
bash特徵之:變量
變量:存儲於內存空間中的一段有名稱可改變值的數據;
變量命名規則:
1.名稱中只能使用字母、數字和下劃線;
2.不能以數字開頭;
3.區分大小寫;
4.儘量做到見名知義;
5.不能與系統內置變量及關鍵字相同;
變量賦值:
VAR_NAME=VAR_VALUE
變量類型:
bash是弱類型編程語言,變量無需事先聲明,不區分變量中存儲的數據類型,統一認爲是字符串類型。
變量引用:
${VAR_NAME};
變量作用域:
變量的生效範圍,即可被引用的範圍。
變量種類及設置:
本地變量:作用域爲當前shell進程,其他進程或當前shell的子進程無法引用,當前shell進程終止,變量會被自動撤銷;
定義本地變量:
set VAR_NAME=[VAR_VALUE]
撤銷變量:
unset VAR_NAME
環境變量:作用域爲當前shell進程及其子進程;
定義環境變量:
declare -x VAR_NAME[=VAR_VALUE]
export VAR_NAME[=VAR_VALUE]
查看環境變量:
export
declare -x
env
printenv
更改爲本地變量:
declare +x VAR_NAME
撤銷變量:
unset VAR_NAME
局部變量:函數中定義的變量,只在函數中可被引用;
位置參數變量:shell編程中經常用到的,運行腳本時後面跟的參數,在腳本內用$#調用;
特殊變量:如$?等具有特殊含義的變量;
只讀變量:
只讀變量不支持重新賦值和撤銷操作。
declare -r VAR_NAME
readonly VAR_NAME=VAR_VALUE
取消只讀:
declare +r VAR_NAME
bash特徵之:I/O重定向和管道
重定向允許講默認打印到屏幕的數據重新定位到文件,或者默認從鍵盤讀取的數據更改爲從文件讀取。
程序的默認數據流走向:
輸入數據流: <--,標準輸入(stdin),鍵盤;
輸出數據流:-->,標準輸出(stdout), 顯示器;
錯誤數據流:-->,錯誤輸出(stderr),顯示器;
文件描述符(File Descriptor,FD):
stdin(標準輸入):0
stdout(標準輸出):1
stderr(錯誤輸出):2
I/O重定向:
標準輸出重定向:
COMMAND > /PATH/TO/FILE
將標準輸出寫入文件,如文件已存在數據則覆蓋;文件不存在自動新建;
COMMAND >> /PATH/TO/FILE
將標準輸出追加到文件;文件不存在自動創建;
shell中重定向功能開關設置:
set -C
禁止覆蓋輸出重定向至已存在文件;仍然可以使用>|來覆蓋
set +C
關閉此功能開關
標準錯誤輸出重定向:
COMMAND 2> /PATH/TO/FILE
錯誤輸出寫入文件,覆蓋原文件數據,文件不存在自動創建
COMMAND 2>> /PATH/TO/FILE
錯誤輸出追加到文件,文件不存在自動創建
合併標準輸出和標準錯誤輸出:
1、使用&>或&>>符號
如:COMMAND &> /PATH/TO/FILE
2、使用>和2>&1 或 >>和2>&1
如:COMMAND > /PATH/TO/FILE 2>&1
COMMAND >> /PATH/TO/FILE 2>&1
特殊輸入輸出文件:
/dev/zero:
會源源不斷的提供二進制數據流
/dev/null:位桶
任何重定向到此文件的數據都會被丟棄
標準輸入重定向:
COMMAND < /PATH/FROM/FILE
輸入結束符:<< EOF
cat > FILE << EOF
當輸入EOF時結束輸入
tr:
translate or delete characters
tr [OPTION]... SET1 [SET2]
實現所有字符轉換爲另一個:
tr [ABC] [abc] < FILE1
FILE1文件中所有A字符替換爲a,所有B替換爲b,所有C替換爲c。並不真的改動文件內容,輸出到屏幕內容改變。
實現刪除某一字符:
tr -d [ABC] < FILE1
FILE1文件所有A/B/C字符被刪除,輸出到屏幕,不修改原文件
補充:
man tr可以看到[:alnum:]等!!!
管道:
COMMAND1 | COMMMAND2 | COMMAND3 | ...
用以將前一個命令的標準輸出作爲後一個命令的標準輸入
如:head -n5 /dev/fstab | tail -n1 打印fstab文件的第5行
tee
read from standard input and write to standard output and files
tee [OPTION]... [FILE]...
-a,--append:追加內容到文件
COMMAND | tee FILE 前面COMMAND命令的執行結果輸出到屏幕並保存到FILE文件