引言
第1章
學(xué)習(xí) shell
第2章
第3章
第4章
第5章
第6章
第7章
第8章
第9章
第10章
第11章
配置文件和 shell 環(huán)境
第12章
第13章
第14章
常見任務(wù)和基本工具
第15章
第16章
第17章
第18章
第19章
第20章
第21章
第22章
第23章
第24章
編寫 Shell 腳本
第25章
第26章
第27章
第28章
第29章
第30章
第31章
第32章
第33章
第34章
第35章
第36章
第37章
第1章
內(nèi)容略
第2章
bash是shell的增強版本
和shell交互的工具叫終端訪問器,一般稱為terminal
[me@linuxbox ~]$ #用戶名@主機名,如果最后一個字符是#,則說明超級管理員用戶
簡單命令
cal #顯示日歷
date #顯示日期
df #顯示磁盤剩余空間數(shù)量
free #顯示空閑內(nèi)存的數(shù)量
exit #退出終端
第3章:文件系統(tǒng)中跳轉(zhuǎn)
linux的文件結(jié)構(gòu)形式是樹結(jié)果,根節(jié)點是"/",所有的文件都是掛載在這個根節(jié)點上面,絕對路徑是從這個根節(jié)點開始,相對路徑參考下面。
pwd #顯示當前目錄
ls #顯示所有文件
ls -a #會顯示隱藏文件
ls -l #顯示長格式文件
cd #改變文件目錄
cd - #更改到先前的工作目錄
cd ~ #改變到文件當前目錄下面
. #當前目錄
.. #當前目錄的家目錄
第4章:探究操作系統(tǒng)
file filename #在文本中查看文件類型
less filename #查看文件內(nèi)容,按q退出
cat filename #查看文件內(nèi)容
顯示長格式內(nèi)容以及各自的意義
#格式參考command -options arguments
ls -l
#顯示結(jié)果:
-rw-r--r-- 1 root root 3576296 2007-04-03 11:05 ubuntu.ogg
-rw-r--r-- :第一個符號表示文件的類型,-表示普通文件,第一個位數(shù)表示文件擁有者的權(quán)限,第二個三位數(shù)表示用戶組的權(quán)限,第三個三位數(shù)表示其他用戶的權(quán)限
1:表示文件的硬鏈接數(shù)目
root: 表示文件所有者名稱
root: 表示用戶組名稱
3576296:表示文件內(nèi)容大小
2007-04-03 11:05:文件最后一次修改時間
ubuntu.ogg:表示文件名稱
第五章:操作文件和目錄
通配符
* 匹配任意多個字符(包括零個或一個)
? 匹配任意一個字符(不包括零個)
[characters] 匹配任意一個屬于字符集中的字符
[!characters] 匹配任意一個不是字符集中的字符
[[:class:]] 匹配任意一個屬于指定字符類中的字符
[:alnum:] 匹配任意一個字母或數(shù)字
[:alpha:] 匹配任意一個字母
[:digit:] 匹配任意一個數(shù)字
[:lower:] 匹配任意一個小寫字母
[:upper] 匹配任意一個大寫字母
舉例:
[[:upper:]]* 以大寫字母開頭的文件
[![:digit:]]* 不以數(shù)字開頭的文件
*[[:lower:]123] 文件名以小寫字母結(jié)尾,或以 “1”,“2”,或 “3” 結(jié)尾的文件
常用命令
#建立文件夾,可以一次性建立多個文件夾
mkdir dir1 dir2
#復(fù)制文件,如果目的文件沒有,會創(chuàng)建這個文件
cp file1 file2
cp -r dir1 dir2 #對于文件夾,要添加參數(shù)-r(recursive 遞歸 循環(huán))
#移動文件
#也可以實現(xiàn)重命名
mv file1 file2 #移動 file1 到 file2。如果 file2 存在,它的內(nèi)容會被 file1 的內(nèi)容重寫。 如果 file2 不存在,則創(chuàng)建 file2。每種情況下,file1 不再存在。
mv file1 file2 dir1 #移動 file1 和 file2 到目錄 dir1 中。dir1 必須已經(jīng)存在
mv dir1 dir2 # 如果目錄 dir2 不存在,創(chuàng)建目錄 dir2,并且移動目錄 dir1 的內(nèi)容到 目錄 dir2 中,同時刪除目錄 dir1
#刪除文件
rm file 刪除文件
rm -r dir 刪除文件夾,添加參數(shù) -r
硬鏈接和軟鏈接
#硬鏈接的局限性
1.不能在不同的分區(qū)上建立鏈接
2.不能對文件夾建立鏈接
#格式
ln name name_one #建立硬鏈接
ln -s name name_one #建立軟鏈接
#查看是否是鏈接
- #硬鏈接的形式一般都是“-”
l #軟鏈接的形式一般都是“l(fā)”
ls -li #通過文件索引號來判斷是否是指向同一文件的鏈接
第六章:使用命令
命令的種類:
1、可執(zhí)行程序
2、shell腳本
3、內(nèi)建的shell程序
4、別名
常用命令
type command #顯示命令的類型
which command #顯示可執(zhí)行程序的位置,針對的是可執(zhí)行程序
help command #顯示命令文檔
man command #顯示程序手冊
使用alias創(chuàng)建命令
#首先要給這個命令命名,查看這個命令是否已經(jīng)有
type command
#對命令進行命名
alias foo='cd /usr; ls; cd -' #注意結(jié)構(gòu)是 alias foo='string',其中命令間以分號結(jié)束
#取消這個命令
unalias foo
#查看已經(jīng)被別名的命令
alias
第七章:重定向
標準輸出
在ubuntu下面建立一個文件,一般情況需要改變文件的權(quán)限,文件流的前三個看作標準輸入,輸出和錯誤,shell 內(nèi)部參考它們?yōu)槲募枋龇?,1和2
#將標準輸出導(dǎo)入到文件中
ls -l /usr/bin > ls-output.txt
#清空文件中的內(nèi)容
ls-output.txt
#使用上面方法,每次都會清空再來,繼續(xù)添加的方式為
ls -l /usr/bin >> ls-output.txt
#重定向標準錯誤
ls -l /bin/usr 2> ls-error.txt
#重定向標準輸出和錯誤到同一個文件中,第二種方式為最新方式
ls -l /bin/usr > ls-output.txt 2>&1 #“2>&1”等同于“>&2”
ls -l /bin/usr &> ls-output.txt
常用命令
cat demo.txt #用來顯示簡短的文本內(nèi)容
cat > demo.txt #輸入文本內(nèi)容,ctrl+d結(jié)束之后內(nèi)容就到了demo.txt
#管道線 ,標準輸入可以作為標準輸出
command1 | command2 #格式
ls -l /usr/bin | less #ls -l /usr/bin 可以作為標準輸出,該輸出作為less的標準輸入
ls /bin /usr/bin | sort | less #也可以作為過濾器進行使用
uniq #忽略重復(fù)行
wc #打印行,字和字節(jié)數(shù)
grep #輸出匹配行
head/tail - 輸出文件開頭部分/結(jié)尾部分,默認十行
head -n 5 ls-output.txt
tail -n 5 ls-output.txt
tee #從 Stdin 讀取數(shù)據(jù),并同時輸出到 Stdout 和文件
ls /usr/bin | tee ls.txt | grep zip #將ls /usr/bin結(jié)果輸出到tee ls.txt文件中,并和grep zip建立管道
第八章:從 shell 眼中看世界
這個章節(jié)內(nèi)容主要說的是展開,理解就好,但是文字很難表述清楚
echo * #展開當前目錄下的所有文件
echo $USER #展開這個值 vagrant
echo $((expression)) #計算表達式的公司 echo $((1+1))
echo Number_{1..2} #花括號展開Number_1,Number_2
轉(zhuǎn)義字符 “/”,對于特殊符號,可以進行轉(zhuǎn)義
第九章:鍵盤高級操作技巧
常見命令
clear #清屏
tab #進行補全
第十章:權(quán)限
輸入 ls -l 會顯示如下內(nèi)容:
-rwxrwxrwx
其中第一個符號表示文件類型,其中
- #普通文件
d #目錄
l #鏈接
c #字符設(shè)備,比如終端機
b #塊設(shè)備,比如硬盤
另外9個字符,3個為1組,分別屬于文件擁有者(用戶屬于一個用戶組)、用戶組用戶,其他用戶,其中
0 000 ---
1 001 --x
2 010 -w-
3 011 -wx
4 100 r--
5 101 r-x
6 110 rw-
7 111 rwx
其中r表示可讀,w表示可寫,x表示可執(zhí)行。
chmod 777 demo.rb #給文件所有者,用戶組,其他用戶rwx權(quán)限
#還有一種符號權(quán)限,詳見書中解釋
設(shè)置新生成文件的默認權(quán)限umask
#以ubuntu為例
umask #0002
#設(shè)置默認權(quán)限為0000
umask 0000
#umask一般是三位,osx是三位,ubuntu是四位,第一位可以不用管,書中詳細進行了敘述
000 分別對應(yīng) rw-rw-rw-
#如果設(shè)置為002,則2數(shù)字對應(yīng)的位置被設(shè)置成取消權(quán)限位
002 分別對應(yīng) rw-rw-r--
常用命令:
su #以其他用戶身份登錄
#已vagrant ubuntu14.04為例,下面方法可以切換到root用戶
su
輸入密碼:vagrant
#在root用戶下面建立其他用戶
useradd -m -s /bin/bash deploy(用戶名)
其中:-s /bin/bash 指的是用bash進行登錄,-m可以直接在/home下面建立deploy文件夾
passwd depoy #修改密碼
su depoy #切換到depoly用戶
adduser deploy sudo #添加deploy到sudo組
gpasswd -d deploy sudo #從sudo組中刪除deploy用戶
#或者直接在root用戶下面給deploy添加sudo操作
adduser deploy --ingroup sudo
#疑問,在deploy沒有分配組的時候,可以隨意創(chuàng)建文件,但是有組之后就不行了,必須使用sudo
備注:新增加的用戶默認是不在sudo組內(nèi)的,如果要使用sudominlg
groupadd group1 #在root權(quán)限下添加用戶組
groupdel group1 #刪除用戶組
adduser deploy group1 #將用戶deploy添加到用戶組中
chown user1 demo.txt #更改文件所有者
#查看用戶組以及相關(guān)用戶信息
cat /etc/group
第十一章:進程
常用命令
備注:每個進程都有pid值和id值,這個端口號無關(guān)。
#顯示與終端相關(guān)的進程信息
ps #即使process的縮寫,能夠羅列出進程的pid值
ps x #顯示系統(tǒng)運行狀態(tài)的信息
ps aux #顯示每個用戶的進程信息
#動態(tài)顯示當前的進程信息
top #備注ps只能顯示當前的進程信息,而top會動態(tài)顯示當前進程信息信息
top | grep redis #top顯示的進程往往很多,可以進行過濾
#顯示從終端啟動的任務(wù)
jobs
#從終端啟動,但是將任務(wù)放在后臺執(zhí)行,添加&即可
redis-server & #啟動任務(wù),但是任務(wù)放在后臺
bg %1 #將任務(wù)放在后臺執(zhí)行,%1可以通過jobs查詢
fg %1 #將任務(wù)放在前臺執(zhí)行,%1可以通過jobs查詢
#殺死進程
kill -9 pid #其中的pid值是進程的pid值
第十二章:shell環(huán)境
shell在環(huán)境中存儲了兩種數(shù)據(jù),一種是環(huán)境變量,另外一種是shell變量
printenv #顯示環(huán)境變量
set #顯示環(huán)境變量和shell變量
建立shell環(huán)境
啟動 bash 程序,并且會讀取一系列稱為啟動文件的配置腳本, 這些文件定義了默認的可供所有用戶共享的 shell 環(huán)境,也分兩種情況,分別是是登錄 shell 會話,另一個是非登錄 shell 會話。
登錄shell會話,包括兩種情況,一種是按照用戶名和密碼shell登錄,另外一種是通過執(zhí)行“ bash --login”形式讓shell成為登錄會話,下面的代碼沒有包括進去.bashrc,shell在登錄情況下真實的執(zhí)行次序是[Execution sequence for .bash_profile, .bashrc, .bash_login, .profile and .bash_logout’]
#以ubuntu為例偽碼
execute /etc/profile
IF ~/.bash_profile exists THEN
execute ~/.bash_profile
ELSE
IF ~/.bash_login exist THEN
execute ~/.bash_login
ELSE
IF ~/.profile exist THEN
execute ~/.profile
END IF
END IF
END IF
#當用戶退出時
IF ~/.bash_logout exists THEN
execute ~/.bash_logout
END IF
非登錄shell會話
#以ubuntu為例
execute /etc/bash.bashrc
IF ~/.bashrc exists THEN
execute ~/.bashrc
END IF
總結(jié)上面的代碼:
全局配置(對所有用戶都有效)
/etc/profile
/etc/bash.bashrc
當前用戶配置(僅對當前登錄用戶有效)
~/.bashrc
~/.bash_profile#讀取這個文件的時候,里面會讀取.bashrc文件
~/.bash_login
~/.profile
一個啟動文件 .bash_profile及相應(yīng)解釋
#如果存在這個文件,執(zhí)行該文件
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
#添加$HOME/bin這個路徑到path中,$HOME
PATH=$PATH:$HOME/bin
#告訴 shell 讓這個 shell 的子進程可以使用 PATH 變量的內(nèi)容
export PATH
修改后的文件不會立即生效,關(guān)閉shell終端,重啟會生效,或者終端下執(zhí)行下面的命令
source .bashrc
第十三章 : vi 簡介
堅持的原則是:用到的時候再查
常用又記不住的快捷鍵
$ #到行的末尾
/ #光標移動到第一行,可以進行全文檢索
:%s/Line/line/g #進行替換
第十五章 : 軟件包管理
軟件包管理是指系統(tǒng)中一種安裝和維護軟件的方法.
ubuntu 軟件安裝方式:
sudo apt-get update #更新源
sudo apt-get install git
sudo apt-get remove git
第十六章 : 存儲媒介
內(nèi)容略
第十七章 : 網(wǎng)絡(luò)系統(tǒng)
第二十章 : 正則表達式
一般形式,查找文件名中包含子字符串“zip”的所有文件
ls /usr/bin | grep zip
grep 程序以這樣的方式來接受選項和參數(shù)
grep [options] regex [file...]
grep zip demo*.rb #顯示文件以及包含的相應(yīng)字符
grep -l zip demo*.rb #打印包含匹配項的文件名,而不是文本行本身
grep -L zip demo*.rb #打印不包含匹配項的文件名
元字符
^ $ . [ ] { } - ? * + ( ) | \
其他字符是普通字符,比如上面提到的zip,表示自身,可以用反斜杠加元字符表示元字符自身,一般表示命令的時候,需要加上雙引號,防止展開。
#中間的regex如果涉及元字符,必須用引號表示
grep -h '.zip' dirlist*.txt
#對于.zip需要注意的是需要匹配四個字符,而不是三個,zip是不匹配的
錨點
grep -h '^zip' dirlist*.txt #zip開頭
grep -h 'zip$' dirlist*.txt #zip結(jié)尾
grep -h '^zip$' dirlist*.txt #zip單獨一行
‘^$’ #會匹配空行
中括號表達式
grep -h '[bg]zip' dirlist*.txt #匹配b或者g中的任意一個
否定
grep -h '[^bg]zip' dirlist*.txt #匹配不是b或者g中的任意一個,不匹配zip,而且“^”在[]第一個字符有效
限定符
? - 匹配零個或一個元素
* - 匹配零個或多個元素
+ - 匹配一個或多個元素
{ } - 匹配特定個數(shù)的元素
第二十二章 : 格式化輸出
常用命令
nl – 添加行號 例如:nl demo.rb
fold – 限制文件列寬 例如:fold -w 12
fmt – 一個簡單的文本格式轉(zhuǎn)換器 例如(格式成50個字符寬):fmt -w 50 fmt-info.txt
第二十三章 : 打印
內(nèi)容略
第二十四章 : 編譯程序
基本命令:
#分析程序建立環(huán)境,會建立makefile文件
./configure
#構(gòu)建程序
make
#安裝程序
make install
第二十五章 : 編寫第一個 Shell 腳本
第一個腳本內(nèi)容如下:
#!/bin/bash
# This is our first script.
echo 'Hello World!'
注意下面的幾點:
1、這個文件必須是可執(zhí)行的,所以需要sudo chomod 755 file
至于說文件可執(zhí)行和文件被ruby解釋器執(zhí)行是兩碼事,比如建立如下文件:
#demo.rb
puts "this is the demo"
#終端執(zhí)行demo.rb
ruby demo.rb #this is the demo,獲得相應(yīng)的結(jié)果
上面的例子是ruby 解釋執(zhí)行demo.rb文件,而不是說這個文件是可執(zhí)行文件,如果是可執(zhí)行文件應(yīng)該是進行如下代碼所示
#demo.rb
#!/usr/bin/env ruby
puts "this is the demo"
終端執(zhí)行文件,必須明確路徑
./demo.rb #this is the demo
2、shebang的解釋
"#!"說明的是: 這個 shebang 被用來告訴操作系統(tǒng)將執(zhí)行此腳本所用的解釋器的名字。每個 shell 腳本都應(yīng)該把這一文本行 作為它的第一行。
比如:
#!/bin/bash
#!/usr/bin/env ruby
對上面兩個名字的解釋,一般寫shebang的解釋器都是些絕對路徑,比如#!/bin/bash,這是bash解釋器的絕對路徑,但是有時候不知道解釋器安裝在哪里,比如說ruby解釋器,所以可以參考第二種方法,#!/usr/bin/env ruby這種方法會從PATH中尋找ruby解釋器的位置。
3、解釋執(zhí)行的必須明確路徑
在上面的文件中執(zhí)行demo.rb文件的方法是如下:
./demo.rb #其中“./”表示的是當前的文件夾,結(jié)果為 this is the demo
demo.rb
#但是如果直接執(zhí)行demo.rb,會出現(xiàn)現(xiàn)在結(jié)果 bash: hello_world: command not found
如果只是執(zhí)行demo.rb文件,那么會從PATH中尋找可執(zhí)行程序,發(fā)現(xiàn)并沒有找到,得到上面的結(jié)果。解決的方式是在.bashrc文件中輸入如下代碼:
export PATH=~/workshop/file:"$PATH"
然后執(zhí)行下面的文件,使.bashrc生效
source .bashrc
. .bashrc #source 和“.”同樣的意義
第二十六章 : 啟動一個項目
變量的定義:
1、變量名可由字母數(shù)字字符(字母和數(shù)字)和下劃線字符組成。
2、變量名的第一個字符必須是一個字母或一個下劃線。
3、變量名中不允許出現(xiàn)空格和標點符號。
常量和變量的區(qū)別:
1、shell不區(qū)別常量和變量
2、默認大寫表示常量,小寫表示變量,再次引用時使用$符號即可。
常量和變量定義舉例:
CURRENT_TIME=$(date +"%x %r %Z")
a=z
b="a string" # Embedded spaces must be within quotes.
c="a string and $b" # Other expansions such as variables can be
# expanded into the assignment.
d=$(ls -l foo.txt) # Results of a command.
e=$((5 * 7)) # Arithmetic expansion.
f="\t\ta string\n" # Escape sequences such as tabs and newlines.
#常量名也可以被{}包圍著
filename="myfile"
mv $filename ${filename}1
#上面實現(xiàn)了變量命名,如果是寫mv $filename $filename1,后者沒有被定義過,為空值,會出錯
使用here document
cat << _EOF_
this is the demo
_EOF_
here documents 中的單引號和雙引號會失去它們在 shell 中的特殊含義
foo="some text"
cat << _EOF_
$foo #顯示結(jié)果為:some text
"$foo" #顯示結(jié)果為:"some text"
'$foo' #顯示結(jié)果為:'some text'
\$foo #顯示結(jié)果為:$foo
_EOF_
cmd << text從命令行讀取輸入,直到一個與text相同的行結(jié)束。除非使用引號把輸入括起來,此模式將對輸入內(nèi)容進行shell變量替換。如果使用<<- ,則會忽略接下來輸入行首的tab,結(jié)束行也可以是一堆tab再加上一個與text相同的內(nèi)容。
第二十七章 : 自頂向下設(shè)計
注意:return作用是從函數(shù)中返回,而exit作用是結(jié)束程序
shell函數(shù)格式:
#第一種形式
function name {
commands
#return的作用是從函數(shù)中返回
return
}
#第二種形式
name () {
commands
return
}
腳本中 shell 函數(shù)定義必須出現(xiàn)在函數(shù)調(diào)用之前,引用形式如下:
#!/bin/bash
report_uptime () { return}
cat << _EOF_
$(report_uptime)
_EOF_
局部變量,只在函數(shù)的局部范圍內(nèi)有效
funct_1 () {
#必須使用如下的local格式聲明局部變量
local foo
#局部變量賦值
foo=1
}
第二十八章 : 流程控制:if 分支結(jié)構(gòu)
參考格式:
#!/bin/bash
#第一個等號是賦值
x=5
#第二個等號是比較;if對應(yīng)用fi封閉;使用[]并且加分號“;”表示結(jié)束
if [ $x = 5 ]; then
echo "x equals 5."
else
echo "x does not equal 5."
fi
退出狀態(tài)
#執(zhí)行命令的時候,會給系統(tǒng)發(fā)送一個值,這個值就是退出狀態(tài),在0-255之間,0表示成功,其他值表失敗
[me@linuxbox ~]$ ls -d /usr/bin
/usr/bin
[me@linuxbox ~]$ echo $? #0
[me@linuxbox ~]$ ls -d /bin/usr
ls: cannot access /bin/usr: No such file or directory
[me@linuxbox ~]$ echo $? #2
#true表示成功執(zhí)行,false表示失敗
[me@linuxbox~]$ true
[me@linuxbox~]$ echo $? #0
[me@linuxbox~]$ false
[me@linuxbox~]$ echo $? #1
#如果 if 之后跟隨一系列命令,則將計算列表中的最后一個命令
[me@linuxbox ~]$ if false; true; then echo "It's true."; fi
It's true.
[me@linuxbox ~]$ if true; false; then echo "It's true."; fi
[me@linuxbox ~]$ $?
3
if后面的格式
#即是上面兩種也都是等價的,test expression和[expression]是等價的。
#之前的例子為
if [ $x=5 ];
#等價的例子為
if test $x= 5;
這里的 expression 是一個表達式,其執(zhí)行結(jié)果是 true 或者是 false。當表達式為真時,這個 test 命令返回一個零 退出狀態(tài),當表達式為假時,test 命令退出狀態(tài)為1
"[ ]"的加強版"[[ ]]"
#"[[ ]]"是高級形式,相比于前者增加下面兩種表達式
string1 =~ regex #例子如下
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
“==”操作符支持類型匹配
$FILE == foo.*
“(( )) ”
被用來執(zhí)行算術(shù)真測試。如果算術(shù)計算的結(jié)果是非零值,則一個算術(shù)真測試值為真。
[me@linuxbox ~]$ if ((1)); then echo "It is true."; fi
It is true.
[me@linuxbox ~]$ if ((0)); then echo "It is true."; fi
[me@linuxbox ~]$
[]中的內(nèi)容需要進行轉(zhuǎn)義
因為 test 使用的所有的表達式和操作符都被 shell 看作是命令參數(shù)(不像 [[ ]] 和 (( ))), 對于 bash 有特殊含義的字符,比如說 <,>,(,和 ),必須引起來或者是轉(zhuǎn)義
[ ! \( $INT -ge $MIN_VAL -a $INT -le $MAX_VAL \) ]
邏輯表達式的幾種表達方式
操作符 測試 [[ ]] and (( ))
AND -a &&
OR -o ||
NOT ! !
分支的說明:
command1 && command2
#先執(zhí)行 command1,如果并且只有如果 command1 執(zhí)行成功后, 才會執(zhí)行 command2。
command1 || command2
對于 || 操作符,先執(zhí)行 command1,如果并且只有如果 command1 執(zhí)行失敗后, 才會執(zhí)行 command2
第二十九章 : 讀取鍵盤輸入
here字符串
here string可以看成是here document的一種定制形式. 除了COMMAND <<<$WORD, 就什么都沒有了, $WORD將被擴展并且被送入COMMAND的stdin中。
最后
變量:
$PATH
$HOME:當前用戶的主目錄,另外一種表示法是“~”