標籤:bash
shell原理認知:
關於shell中的萬用字元*
shell先展開萬用字元後再傳給命令,例如"ls-ld /usr/include/*"先展開為"ls -ld file-list,"
查看曆史:
可以通過history命令來查看命令曆史
可一使用!!執行上一條命令
bash啟動:
尋找全域設定/etc/profile,之後尋找使用者主目錄下的設定,.bash_profile.bash_login .profile。按優先順序,前面的檔案執行了後面的就不會執行。
命令列提示符:
命令列提示符通過內建變數PS1和PS2定義,PS1是主提示符,PS2是同一條命令換行後顯示的,叫從提示符或副提示符,更多詳細資料可查看manbash PROMPTING段。通過export命令可修改變數
重新導向:
使用>符號重新導向會使覆蓋原有檔案,開啟bash選項noclobber則不會
開啟noclobber:set-o noclobber
關閉noclobber:set+o noclobber
>如果不指明,預設使用標準輸出1>
把標準輸出和錯誤輸出指定為同一個:command> outputfile 2>&1
tee命令可以既在標準輸出中輸出又儲存到檔案
塊語句重新導向多個語句的輸出一起重新導向可以使用{}({command;command;command;} >output.file)把語句括起來,然後使用重新導向
另一種方式是把命令序列放到子shell上執行,用()括起(command;command;)>output.file
指令碼中對語句塊使用重新導向:部分重要代碼,注意理解:
whileread line
do
count=$((count+1))
echo$(count):$(line)
done<$file >$filename.lined
管道:
讓接受參數的命令接收來自管道的資料:rm-i $(find . -name ‘*.out’)
HereDocument:
command<< delimiter
......
>delimiter
檔案描述符:
shell命令列每個命令自動開啟3個描述符STDIN0,STDOUT 1, STDERR 2
一個指令碼需要把不同的資料輸出到不同的檔案:
echo"data to file descriptor 3" >&3
echo"data to file descriptor 4" >&4
echo"data to file descriptor 5" >&5
運行命令./shname3>outputfile3 4>outputfile 5>outputfile
一個指令碼多個命令輸入或輸出都使用同一個檔案,但檔案名稱很長:
exec 4>outfile.nameexec 5>&4echo "data to file descriptor" 1>&5echo "data to file descriptor" >&4exec 4>&-exec 5>&-
開啟描述符:
execfd>outputfile如果檔案已存在,則覆蓋
execfd>>outputfile以追加方式
開啟後就可以使用了:command 1>&fd
輸入描述符的情況類似
execfd<inputfile
execfd2<&fd1
command<&fd2 = command <&fd1
使用<>可以同時讀/寫檔案
使用execfd&- 關閉描述符
進程:
列出進程:
ps-ef 查看系統所有進程,e為查看所有進程,相當於-A。f為使用完整格式顯示每個進程(UIDPID C-佔用cpu時間百分比STIME-啟動時間TTY TIME佔用CPU時間 CMD-啟動命令)
顯示關聯指定tty的程式 |
-t |
指定關心的PID列表 |
-p 後可接多個PID |
顯示某使用者的進程 |
-u |
顯示某進程建立的進程 |
-C |
列出進程目錄 |
相同的分支用[]括起並前面加上個數。子線程用進程名字表示並放在{}中,前面加上個數。-c選項可使分支不合并 |
command後面加& 在後台執行
jobs顯示的資訊:Running表示正在運行,Stoping表示已掛起,加號表示fg預設操作對象,數字表示任務編號,fg用法:fg%任務編號。bg命令把掛起的任務放到後台繼續運行
放入背景任務在bash結束時結束,可以使用nohup命令防止這種情況,bash結束時,任務的父進程將是1。nohupmake &
殺死進程:
一次性殺死多個進程killall
/proc/檔案系統:
虛擬檔案系統,只在記憶體中存在,/proc/目錄下的目錄為數位都代表一個進程(該數字就是PID),裡面儲存了所有進程的資訊,所有進程的這些目錄結構都是一樣的。
進程目錄內某些目錄
cmdline |
該檔案包含啟動該進程的整個命令列。它沒有經過格式化,及程式與其參數之間沒有空格,尾行沒有換行。 |
cwd |
該符號連結指向當前的工作目錄 |
environ |
該檔案包含為這個進程定義的所有環境變數,格式為“變數=值”,沒有經過格式化 |
exe |
該符號連結指向該進程所執行的可執行檔 |
fd |
此目錄包含該進程當前開啟的所有描述符(裡面為檔案符號列表,每個開啟的檔案符號由一個符號連結表示,其名稱為該檔案描述符的編號,並指向該檔案描述符開啟的檔案) |
maps |
列印該檔案的內容時,將看到該進程的地址空間中當前映射到檔案中的那部分自左到右各列為與該映射相關聯的地址空間,與該映射關聯的許可權,該映射起始位置的位移量(從檔案的開始處算起),儲存該對應檔裝置的主、從序號(HEX),該檔案的inode序號,以及該檔案的檔案名稱 |
root |
該符號連結指向進程使用的根目錄 |
status |
該檔案包含眾多資訊,包括可執行檔名、目前狀態、PID、PPID、實際以及有效UID和GID、記憶體使用量情況 |
機器上的各種硬體資訊:
cpuinfo |
該檔案包含使用者機器上CPU的資訊 |
modules |
該檔案包含核心當前使用的模組列表,以及每個模組的使用次數(lsmod報告的資訊) |
meminfo |
該檔案包含記憶體使用量的資訊(free命令只是一種易於閱讀的格式顯示) |
devices |
可用的裝置,包括字元裝置和塊裝置 |
filesystems |
系統支援的檔案系統 |
ioports |
查看系統的I/O連接埠 |
interrupts |
查看中斷資訊 |
mounts |
查看掛載的檔案系統 |
swaps |
查看交換分區使用的情況 |
partitions |
查看系統磁碟分割的資訊 |
version |
查看核心版本 |
核心源碼Documention/filesystems/proc.txt包括了完整的/proc/檔案系統介紹,並解釋了/proc/檔案系統中所有檔案的格式和意義
/proc/sys/是/proc特殊的子目錄,通過它可以顯示當前核心啟動並執行參數,並且可以在系統運行中更改這些參數,而且會立即生效哦。
例如:sudoecho 1 >/proc/sys/net/ipv4/ip_forward
這僅僅當系統運行時有效,當系統重新啟動之後會變回預設值,要想啟動時就改動這些值,方法是修改設定檔/etc/sysctl.conf,可參考mansysctl.conf(5)
文本操作和字串處理:
從一個目錄中取出最近訪問過的5個普通檔案,並輸出檔案名和最後的訪問時間:
ls-lut |grep "^-"|head -5 |cut -c 41-
將兩個文字檔對應的行串連起來(只是連在一起)
paste-d ‘:‘ file1 file2
三個文本串連起來:
paste-d ‘<‘ file1 file2 |paste -d ‘>‘ -file3
檢查當前系統中的各種shell並統計它們被多少個使用者使用和按照從多到少排序列印出來:
cat/etc/passwd|cut -d: -f7 |sort|uniq -c|sort -nr
統計一個文字檔中各個單詞出現的個數
#!/bin/bash
count(){
if[ $# != 1 ]
then
echo"Need one file parameter to work!"
exit1;
fi
#刪除標點符號和特殊字元
#構建一個很長的管道命令,每一段都單獨寫一行,增加可讀性
tr‘+-=*.,;:{}()#!?<>"\n\t‘ ‘ ‘ <$1 |\
#把所有大寫字母轉換為小寫字母
tr‘A-Z‘ ‘a-z‘ |\
#把連續的空格符轉換為一個空格符
tr-s ‘ ‘ |\
#把空格符轉換為分行符號
tr‘ ‘ ‘\n‘ |\
#把相同的單詞放到一起
sort|\
#重複資料刪除的單詞,並進行統計
uniq-c |\
#根據重複的次數進行排序
sort-rn
}
echo
echo"This script can count words of a specified file."
#使用空命令冒號構建無限迴圈
while:
do
read-p "Enter the file path(or quit):"
case"$REPLY" in
[Qq]|[Qq][Uu][Ii][Tt])
echo"Bye."
exit0
;;
*)
if[ -f "$REPLY" ] &&[ -r "$REPLY" ]&&[-s "$REPLY" ]
then
count"$REPLY"
else
echo"$REPLY can not be dealed with."
fi
;;
esac
done
exit0
tr命令提供字元集以方便使用:
alnum |
所有字母和數字 |
alpha |
所有字母 |
blank |
所有水平的空格符 |
cntrl |
控制字元 |
digit |
數字 |
graph |
可列印字元,但不包括空格 |
print |
可列印字元,包括空格 |
lower |
小寫英文字母 |
upper |
大寫英文字母 |
punct |
所有標點符號 |
space |
所有水平和垂直的空格符 |
xdigit |
十六進位的數字 |
文法:tr[OPTION]... ‘[:classname:]‘ ‘SET2‘ |
|
用相同寬度的空格代替TAB:
使用expand命令。unexpand的相反,但預設只轉換行首TAB使用unexpand-a進行全部轉換
把輸出格式化成一個表格:
(printf"PERMISSIONS LINKS OWNER GROUP SIZE DATE HH:MM FILE-NAME\n";ls-l |sed 1d)|column -t
debug:
bash-n 不真正的執行,只檢查文法,也不做替換等操作
-v選項可以讓Shell輸出指令碼中被處理過的每一行代碼
-x選項可以讓bash運行在trace下,輸出每一條執行的語句,並做替換。
部分調試:
在指令碼中加入set-option
option可以是-n、-v、-x中任意一個。
用set+option關閉
使用trap命令
3個偽訊號:
EXIT從一個函數中退出時及整個指令碼執行完畢時
ERR當一條命令執行失敗返回非零狀態時
DEBUG指令碼中的每一條命令執行前
可以捕獲ERR訊號,追蹤執行不成功的命令,$LINENO是Shell的內建變數,代表Shell指令碼的當前行號。
有趣的命令或用法:
cal:列印日曆
ls命令的輸出被重新導向後是一個檔案一行的,相當於ls-1這是ls命令內部做了判斷,可使用ls-C強制原樣輸出
expr命令可以對算數運算式和關聯運算式進行運算,還可以用來計算一個字串的長度,如:exprlength STRING
basename命令去除檔案名稱中的路徑,basename ./etc/init.d 輸出為init.d basename ./etc/init.d .d 輸出為 init。 去除了尾碼。
cat命令-E選項可以看到腳步檔案中各個分行符號的位置
本文出自 “重劍無鋒” 部落格,請務必保留此出處http://qianyang.blog.51cto.com/7130735/1615564
bash shell認知