第1章 初識Linux shell
內存存儲單元按組劃分紅不少塊,這些塊稱做頁面(page).
內核建立了第一個進程(稱爲init進程)來啓動系統上全部其餘進程.
Linux系統將硬件設備當成特殊的文件,稱爲設備文件.git
第3章 基本的bash shell命令
/etc/passwd文件包含了全部系統用戶帳戶列表以及每一個用戶的基本配置信息.正則表達式
man命令用來訪問存儲在Linux系統上的手冊頁面.
關鍵字搜索:man -k 關鍵字
ls命令: -R參數叫做遞歸選項.它列出了當前目錄下包含的子目錄中的文件.
-l參數會產生長列表格式的輸出.shell
touch: 修改每一個指定文件的存取(access)和修改(modification)時間戳記.若文件不存在且沒有使用-c選項,則會生成空文件.
cp: 複製文件 用法: cp [source] [destination]
-R遞歸複製整個目錄express
連接文件
符號連接就是一個實實在在的文件,它指向存放在虛擬目錄結構中某個地方的另外一個文件.這兩個經過符號連接在一塊兒的文件,彼此的內容並不相同.
硬連接會建立獨立的虛擬文件,其中包含了原始文件的信息及位置,可是它們從根本上而言是同一個文件.安全
mv: 重命名,移動.
rm: 刪除.
mkdir: 建立目錄.
file: 查看文件類型
查看文件:cat,more,less,tail,head.bash
第4章 更多的的bash shell命令
ps: 查看進程 經常使用選項:
-ef 查看系統上運行的全部進程less
top: 實時顯示進程信息.編輯器
結束進程:kill,killall.函數
df: 查看磁盤使用狀況.測試
du: 顯示某個特定目錄的磁盤使用狀況
sort: 排序
grep:
grep [options] pattern [file]
-v參數,反向搜索(不匹配)
-n參數,顯示匹配模式的行所在的行號
-c參數,打印有多少行含有匹配的模式
-e參數,指定多個匹配模式
-b參數,在輸出的每行前面同時打印出當前行在輸入文件中的字節偏移量
-o參數,只輸出文件中匹配到的部分.經常和 -b 一塊兒使用,得出匹配內容的偏移量.
-r參數,遇到目錄時遞歸讀取目錄下每個文件
第5章 理解shell
在生成子shell進程時,只有部分父進程的環境被複制到子shell環境中.
進程列表: 將一系列命令放入括號()中,命令之間用;分割.進程列表會生成子shell來執行命令.echo $BASH_SUBSHELL若大於0則代表有子shell.
後臺模式: 在命令末尾加上&. jobs命令顯示後臺做業信息.
alias: 建立別名.
第6章 使用Linux環境變量
環境變量分爲兩類:全局變量和局部變量.全局變量能夠用於全部shell,局部環境變量只能在定義它們的進程中可見.本身建立的局部變量或shell腳本,應使用小寫字母命名,避免重定義系統環境變量.
要查看全局變量,可使用env或printenv命令
set命令顯示某個特定進程設置的全部環境變量.
unset命令用來刪除某個環境變量.
在變量名前加$至關於取環境變量的值(相似於c中的*).
在設定全局環境變量的進程所建立的子進程中,該變量都是可見的,修改(刪除)子shell中全局環境變量並不會影響到父shell中該變量.
PATH環境變量定義了用於進行命令和程序查找的目錄.添加目錄方法PATH=$PATH:/home/christine/Scripts
/etc/profile :該文件是bash shell默認的的主啓動文件.只要你登陸了Linux系統,bash就會執行/etc/profile啓動文件中的命令.
存儲我的用戶永久性bash shell變量的地方是$HOME/.bashrc文件,該文件有兩個做用:查看/etc目錄下通用的bashrc文件,爲用戶提供一個定製本身的命令別名的地方.
第7章 理解Linux文件權限
/etc/passwd 文件包含如下信息:
登陸用戶名
用戶密碼
用戶帳戶的UID(數字形式)
用戶帳戶的組ID(GID)(數字形式)
用戶帳戶的文本描述(稱爲備註字段)
用戶HOME目錄的位置
用戶的默認shell
示例:wanfeng:x:1000:1000:wanfeng,,,:/home/wanfeng:/bin/bash
用戶密碼字段都被設置成了x,Linux系統都將用戶密碼保存在/etc/shadow中.
/etc/shadow 文件包含如下信息:
與/etc/passwd文件中的登陸名字段對應的登陸名
加密後的密碼
自上次修改密碼後過去的天數密碼(自1970年1月1日開始計算)
多少天后才能更改密碼
多少天后必須更改密碼
密碼過時前提早多少天提醒用戶更改密碼
密碼過時後多少天禁用用戶帳戶
用戶帳戶被禁用的日期(用自1970年1月1日到當天的天數表示)
預留字段給未來使用
useradd:添加新用戶
userdel:刪除用戶
usermod:修改/etc/passwd文件中的字段
passwd:修改用戶密碼
chsh:修改默認登陸shell
八進制模式安全設置:獲取這3個rwx權限的值,而後將其轉換成3位二進制值,用一個八進制值來表示.三位八進制值組成了user,group,other的權限.
umask:umask值只是個掩碼,它會屏蔽掉不想授予該安全級別的權限,對文件來講一開始的權限是666,減去umask值以後,剩下的文件權限就是默認文件權限,對目錄來講一開始的權限是777.
chmod:改變文件和目錄權限.
除了三位八進制權限以外,Linux還儲存了三個額外信息位:
設置用戶ID(SUID):當文件被用戶使用時,程序會以文件屬主的權限運行.
設置組ID(SGID):對文件來講,程序會以文件屬組的權限運行;對目錄來講,目錄中建立的新文件會以目錄的默認屬組做爲默認屬組.
粘着位:文件或目錄只能由root用戶或者其全部者移動或刪除.
這三位組成一位八進制值,加在標準三位八進制權限以前.
第11章 構建基本腳本
shell腳本里變量、等號和值之間不能出現空格.
命令替換: 命令替換容許將shell命令的輸出賦給變量,有兩種格式:反引號字符(`)和$()格式.例:val=`ls $HOME`或val=$(ls $HOME)
輸出重定向: 命令的輸出發送到一個文件中,而不是在屏幕打印.使用大於號完成這項功能.
command > outputfile
若不想覆蓋文件原有內容,能夠用雙大於號(>>)來追加數據.
輸入重定向: 輸入重定向符號是小於號(<).
command < inputfile.
內聯輸入重定向: 符號是遠小於號(<<).除了這個符號,你必須指定一個文本標記來劃分輸入數據的開始和結尾.任何字符串均可做爲文本標記,但在數據的開始和結尾文本標記必須一致.
command << marker
data
marker
管道: 管道被放在命令之間,將一個命令的輸出重定向到另外一個命令中:
command1 | command2
Linux系統實際上會同時運行這兩個命令,在系統內部將它們鏈接起來.在第一個命令產生輸出的同時,輸出會被當即送給第二個命令.
數學運算:
bash shell提供了一種更簡單的方法來執行數學表達式$[ operation ],bash shell數學運算符只支持整數運算.
bash計算器(bc): 支持浮點數運算.浮點運算是由內建變量scale控制的,必須將這個值設置爲但願在計算結果中保留的小數位數.
在腳本中有兩種使用方法:
variable=$(echo "options; expression" | bc)
或者
1 variable=$(bc << EOF 2 options 3 statements 4 expressions 5 EOF 6 )
退出腳本: 默認狀況下,shell腳本會以腳本中的最後一個命令的退出狀態碼退出.exit命令容許你在腳本結束時指定一個退出狀態碼,範圍爲0~255.
第12章 使用結構化命令
if-then 語句:若if後面命令的狀態退出碼是0,位於then部分的命令就會被執行.
if command then commands fi
if-then-else 語句:
if command then commands else commands fi
嵌套的if-then語句:
if command1 then commands elif command2 then more commands fi
總結:if後面必須有命令和then.
test命令
if test condition then commands fi
condition是test命令要測試的一系列參數和值.
bash shell提供了另外一種條件測試方法,無需在if-then語句中聲明test命令:
if [ condition ] then commands fi
方括號定義了測試條件.第一個方括號以後和第二個方括號以前必須加上一個空格,不然就會報錯.
1. 數值比較(整數)
n1 -eq n2 檢查n1是否與n2相等 n1 -ge n2 檢查n1是否大於或等於n2 n1 -gt n2 檢查n1是否大於n2 n1 -le n2 檢查n1是否小於或等於n2 n1 -lt n2 檢查n1是否小於n2 n1 -ne n2 檢查n1是否不等於n2
2. 字符串比較:大於小於符號需轉義( \ )
str1 = str2 檢查str1是否和str2相同 str1 != str2 檢查str1是否和str2不一樣 str1 < str2 檢查str1是否比str2小 str1 > str2 檢查str1是否比str2大 -n str1 檢查str1的長度是否非0 -z str1 檢查str1的長度是否爲0
3. 文件比較
-d file 檢查file是否存在並是一個目錄 -e file 檢查file是否存在 -f file 檢查file是否存在並是一個文件 -r file 檢查file是否存在並可讀 -s file 檢查file是否存在並不是空 -w file 檢查file是否存在並可寫 -x file 檢查file是否存在並可執行 -O file 檢查file是否存在並屬當前用戶全部 -G file 檢查file是否存在而且默認組與當前用戶相同 file1 -nt file2 檢查file1是否比file2新 file1 -ot file2 檢查file1是否比file2舊
複合條件測試:
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]
第13章
for命令:
for var in list do commands done
for根據IFS來分隔list
若是要指定多個IFS字符,只要將它們在賦值行串起來就行. IFS=$'\n':;
IFS='\n' 將字符\和字符n做爲IFS的換行符.
IFS=$'\n' 使用換行符作爲字段分隔符.
在文件名或路徑名中使用通配符可以使for自動遍歷目錄中的文件.
若文件名中含有空格,應該將$file變量用雙引號圈起來.
while命令:
while test command do other commands done
break命令:break能夠跳出單層循環,break n能夠指定要跳出的循環層級.
continue和break同樣,也能夠指定要終止的循環層級.
在shell腳本中,你能夠對循環的輸出使用管道或進行重定向。這能夠經過在done命令以後添加劇定向命令來實現.
第14章 處理用戶輸入
bash shell會將一些稱爲位置參數(positional parameter)的特殊變量分配給輸入到命令行中的全部參數.
位置參數變量是標準的數字: $0是程序名,$1是第一個參數, $2是第二個參數,依次類推.當參數序號大於9時,要使用{}將數字包圍起來,如${10}.因爲每一個參數是經過空格分隔的,若參數值中有空格,須要使用引號.也可使用變量替換數字,如${!count},注意:花括號中不能使用$符號,用!替代.
basename命令:返回不包含路徑的腳本名.
在使用參數以前,須要判斷參數中是否存在數據[ -n "$1" ],在判斷時,要將被判斷的參數加上雙引號,不然會判斷失敗.
特殊變量:
$# :參數個數(不計入$0)
$* :將命令行上提供的全部參數看成一個單詞保存(在for中不能被分隔)
$@ :將命令行上提供的全部參數看成同一字符串中的多個獨立的單詞(在for中能夠被分隔)
$$ 本進程PID
shift命令: 刪除最左邊的變量,將全部參數左移一個位置.注:$0不會受影響.也能夠一次移動多個位置:shift n.
getopt命令: getopt optstring parameters
optstring定義了命令行有效的選項字母,每一個須要參數值的選項字母后緊跟一個冒號.例:
getopt ab:cd -a -b test1 -cd test2 test3
-a -b test1 -c -d -- test2 test3
set和getopt配合使用就能夠達到格式化原參數並將其替換的目的,方法以下:
set -- $(getopt -q ab:cd "$@")
getopt不擅長處理帶空格的參數
getopts命令: getopts optstring variable
每次調用它時,它只處理命令行上檢測到的一個參數.能很好的處理帶空格的參數.
optstring值相似於getopt命令,variable中保存當前正在處理的那個參數
getopts命令會用到兩個環境變量.若是選項須要跟一個參數值,OPTARG環境變量就會保存這個值.OPTIND環境變量保存了參數列表中getopts正在處理的參數位置.
例:
#!/bin/bash # simple demonstration of the getopts command # echo while getopts :ab:c opt do case "$opt" in a) echo "Found the -a option" ;; b) echo "Found the -b option, with value $OPTARG";; c) echo "Found the -c option" ;; *) echo "Unknown option: $opt";; esac done
練習例程:
#!/bin/bash count=0; while [ -n "${!count}" ] do echo Parameter $count is ${!count} count=$[$count + 1] done
read命令: 從標準輸入或另外一個文件描述符中接受輸入.read命令會將提示符後輸入的全部數據分配給單個變量.若指定多個變量,輸入的每一個數據值都會按序分配給下一個變量.若是變量數量不夠,剩下的數據就所有分配給最後一個變量
-p選項,打印提高信息.
-t選項,指定計時器(單位爲秒),過時後read返回非0退出狀態碼.
-n選項,指定讀取多少個字符後退出.
-s選項,避免輸入數據顯示出來.
從文件中讀取方法: cat test | while read line
第15章 呈現數據
只重定向錯誤: STDERR文件描述符被設成2.能夠選擇只重定向錯誤消息,將該文件描述符值放在重定向符號前: ls -al badfile 2> test2
重定向錯誤和數據: ls -al badtest 2> test2 1> test1
臨時重定向: 文件描述符數字以前加一個&. echo "This is an error message" >&2
永久重定向: exec命令會啓動一個新shell並將STDOUT文件描述符重定向到文件. exec 2>testerror
tee命令: 至關於管道的一個T型接頭.它將從STDIN過來的數據同時發往兩處.一處是STDOUT,另外一處是tee命令行所指定的文件名: tee filename,若想追加到文件,使用-a選項.
第16章 控制腳本
生成信號:
Ctrl+C組合鍵會生成SIGINT信號
Ctrl+Z組合鍵會生成一個SIGTSTP信號
kill能夠向指定pid的進程發送信號.
捕獲信號:
trap commands signals
commands爲捕獲到信號時運行的命令.
當signals爲EXIT時,會捕獲腳本的退出.
能夠刪除已設置好的捕獲,只須要在trap命令與但願恢復默認行爲的信號列表之間加上兩個破折號就好了.
第17章 建立函數
建立函數有兩種方法:
function name {
commands
}
或
name() {
commands
}
函數使用時只須要指定函數名,且不能在定義以前使用.重定義會覆蓋原來的定義,且不會有警告.
函數的默認退出狀態碼是最後運行的命令的退出狀態碼.使用return命令來退出函數並返回特定的退出狀態碼(範圍爲0~255)
函數中的全部echo語句都會成爲函數輸出,而不是輸出到標準輸出.接受函數輸出的方式與c語言類似.
bash shell會將函數看成小型腳原本對待.這意味着能夠像普通腳本那樣向函數傳遞參數.
全局變量: 在腳本中定義的任何變量都是全局變量.
局部變量: 變量聲明前有local關鍵字的變量.
第19章 初識sed和gawk
sed編輯器
s命令: s/pattern/replacement/flags
用斜線間指定的第二個文本字符串來替換第一個文本字符串模式. 標記(flags)爲可選部分,默認狀況(無標記)下它只替換每行中出現的第一處,g標記表示所有替換,數字n標記時表示替換第n處的匹配.
d命令: 刪除模式匹配或指定地址的全部行.
i命令: 會在指定行前增長一個新行.
a命令: 會在指定行後增長一個新行.
c命令: 使用新行替換指定行的文本的內容.注:命令i和a還有c以後的全部字符都將會被認爲是新行的內容("\"除外).
y命令: [address]y/inchars/outchars/ 轉換命令會對inchars和outchars值進行一對一的映射.inchars中的第一個字符會被轉換爲outchars中的第一個字符,第二個字符會被轉換成outchars中的第二個字符,inchars和outchars長度必須相同.
=命令: 打印行號.
l命令: 打印數據流中的文本和不可打印的ASCII字符.
w命令: [address]w filename 向文件寫入行.
r命令: [address]r filename 將一個獨立文件中的數據插入到數據流中.
p標記: 打印一行,一般和-n選項一塊兒使用,只打印包含匹配文本模式的行
命令組合: 可使用花括號將多條命令組合起來.注:尋址可在花括號以前,表示對花括號之中的全部命令適用,也能夠在花括號之中,只對其後的一條語句適用.
行尋址:分爲數字方式的行尋址和文本模式過濾.行地址區間:a,b 從某行開始的全部行:a,$.
[address]command
address {
command1
command2
command3
}
-e選項: 執行多個命令. sed -e 's/brown/green/; s/dog/cat/'
gawk程序
gawk options program file
選項:
-F fs 指定行中劃分數據字段的字段分隔符
-f file 從指定的文件中讀取程序
-v var=value 定義gawk程序中的一個變量及其默認值
gawk程序腳本用一對花括號來定義,並且因爲gawk命令行假定腳本是單個文本字符串,你還必須將腳本放到單引號中.
gawk會自動給一行中的每一個數據元素分配一個變量,$0表明整個文本行,$n表明第n個數據字段,默認使用空格來劃分數據,也可使用-F選項.
注:使用print命令打印字符串時必須用雙引號包括,不然會被當作變量,由於gawk不須要使用$來引用變量.
練習: 使用gawk實現打印本目錄下的的文件大小和名字: ls -lh | gawk 'BEGIN{print "SIZE\tNAME"} {print $5"\t"$9}'
練習腳本:
#!/bin/bash
ls -l | sed '1d'| gawk 'BEGIN{print "SIZE\tNAME"} {print $5"\t"$9}' > output.txt
flag=1;
cat output.txt | while read line
do
if [ $flag -eq 0 ]
then
echo $line
fi
flag=0
done | sort -n
rm output.txt
第20章 正則表達式
BRE
^ 定義從數據流中文本行的行首開始的模式,^ 放到模式開頭以外的其餘位置,那麼它就跟普通字符同樣.
$ 定義了行尾錨點,將這個特殊字符放在文本模式以後來指明數據行必須以該文本模式結尾.
. 匹配除換行符以外的任意單個字符.
[chars] 使用方括號定義一個字符組,方括號中包含全部但願出如今該字符組中的字符.
[^chars] 在字符組的開頭加個脫字符就是排除型字符組,匹配不含組內字符的模式.
[0-9] -表示區間
* *放置在字符(組)後面代表該字符(組)必須在匹配模式的文本中出現0次或屢次
[[:alpha:]] 匹配任意字母字符,不論是大寫仍是小寫
[[:alnum:]] 匹配任意字母數字字符0~九、 A~Z或a~z
[[:blank:]] 匹配空格或製表符
[[:digit:]] 匹配0~9之間的數字
[[:lower:]] 匹配小寫字母字符a~z
[[:print:]] 匹配任意可打印字符
[[:punct:]] 匹配標點符號
[[:space:]] 匹配任意空白字符:空格、製表符、 NL、 FF、 VT和CR
[[:upper:]] 匹配任意大寫字母字符A~Z
ERE
? 代表前面的字符能夠出現0次或1次.
+ 代表前面的字符能夠出現1次或屢次,但必須至少出現1次.
{} 花括號容許你爲可重複的正則表達式指定一個上限.這一般稱爲間隔(interval).能夠用兩種格式來指定區間.必須指定gawk程序的--re-interval命令行選項
m:正則表達式準確出現m次。
m, n:正則表達式至少出現m次,至多n次
| 邏輯OR,組合兩個或多個模式.
() 表達式分組該組會被視爲一個標準字符