鸟哥的Linux私房菜学习笔记(三)
鳥哥的Linux私房菜學(xué)習(xí)筆記(三)
Vim
由于vim的快捷鍵過多,就直接貼鏈接了 知乎原文
BASH
認(rèn)識bash
bash是Linux默認(rèn)的shell,其有一下功能
- 命令編輯/修改能力(history)
- 命令與文檔補(bǔ)全能力([tab])
- 命名別名設(shè)定功能(alias)
- 工作控制、前景背景控制(job control,foreground,background)
- 程序化腳本(shell scripts)
- 萬用字元(wildcard)
可以使用type查詢指令是否為Bash Shell的內(nèi)建命令,用法如下
$ type [-tpa] name:不加任何選項與參數(shù)時,type 會顯示出 name 是外部指令還是 bash 內(nèi)建指令 -t :當(dāng)加入 -t 參數(shù)時,type 會將 name 以底下這些字眼顯示出他的意義:file :表示為外部指令;alias :表示該指令為命令別名所設(shè)定的名稱;builtin :表示該指令為 bash 內(nèi)建的指令功能; -p :如果後面接的 name 為外部指令時,才會顯示完整檔名; -a :會由 PATH 變數(shù)定義的路徑中,將所有含 name 的指令都列出來,包含 alias在bash中可以使用 反斜杠:\ 來跳過緊接著的下一個字符,以此來實現(xiàn)在命令行的多行書寫,例如
$ cp /var/spool/mail/root /etc/crontab \ > /etc/fstab /root此外還有一下快捷鍵
| ^k | 從游標(biāo)向后刪除指令串 |
| ^a | 將游標(biāo)移動到最前面 |
| ^e | 將游標(biāo)移動到最后面 |
Shell中的變量
查看某個變量
$ echo $HOME 或 $ echo ${HOME}變量的設(shè)定遵循以下規(guī)則
-
變量即變量的內(nèi)容使用 = 來連接,例如 [myname=VBird]
-
變量名稱只能是字母與數(shù)字,但開頭不能是數(shù)字
-
變量內(nèi)容含有空格時,可以使用『"』或『’』將其包裹
- 雙引號內(nèi)如含有$等,可以使其保持原有特性
- 單引號內(nèi)的特殊字符一律視為純文字
-
如果在執(zhí)行指令時還需要引用其他額外的指令,可以使用『`(指令)`』(反引號)或『$(指令)』的格式
-
為變量增加內(nèi)容時,可以使用**"變量名稱"或變量名稱"或變量名稱"或{變量名稱}**后面直接連接需要添加的內(nèi)容的方法
-
如果變量需要在子程序執(zhí)行,需要使用export將其變?yōu)槿肿兞?/p>
-
使用unset取消變量的設(shè)定
一些與變量操作有關(guān)的函數(shù)
-
env,列出所有的環(huán)境變量(系統(tǒng)的)及其內(nèi)容
-
set,列出所有變量,包含環(huán)境變量即自定義變量,其中包含一些較為常用的內(nèi)容,包括
- PS1:提示字元的設(shè)定:
- ?:變量$?代表的是上一個執(zhí)行的指令所回傳的值,當(dāng)對齊進(jìn)行echo時可以在屏幕上顯示,如果上一個指令成功執(zhí)行,則其為0;如果發(fā)生錯誤,則其為錯誤代碼
-
export
-
declare,設(shè)定變量的類型
$ declare [-aixr] variable-a :將後面名為 variable 的變數(shù)定義成為陣列 (array) 類型 -i :將後面名為 variable 的變數(shù)定義成為整數(shù)數(shù)字 (integer) 類型 -x :用法與 export 一樣,就是將後面的 variable 變成環(huán)境變數(shù); -r :將變數(shù)設(shè)定成為 readonly 類型,該變數(shù)不可被更改內(nèi)容,也不能 unset -
陣列(array)類型變量
var[index]=content -
變量內(nèi)容的刪除與取代
命令別名
-
alias,unalias,命令別名設(shè)定
$ alias lm='ls -al | more'$ unalias lm使用alias后面不加參數(shù)時,會將設(shè)置的所有有別名的內(nèi)容輸出
bash環(huán)境通用操作
-
bash預(yù)設(shè)的組合鍵
-
萬用字元與特殊符號
-
其余特殊符號
資料流重導(dǎo)向
當(dāng)不想將正確的或錯誤的資料全部輸出在命令行時,就可以使用重導(dǎo)向?qū)⑵鋵懭胫付ǖ奈募?#xff0c;資料流重導(dǎo)向可以分為以下三種(一個符號與兩個符號的區(qū)別為:一個為覆蓋寫入,兩個為累加寫入)
- 標(biāo)準(zhǔn)輸入(stdin):代號0,使用 < 或 <<
- 標(biāo)準(zhǔn)輸出(stdout):代號1,使用 > 或 >>
- 標(biāo)準(zhǔn)錯誤輸出(stderr):代號2,使用 2> 或 2>>
使用便準(zhǔn)輸出的一個例子是
$ ll / > ~/rootfile #命令行無輸出,文件被寫入指定文件如果想將stdout和stderr寫入不同的文件
$ find /home -name .bashrc > list_right 2> list_error不將輸出內(nèi)容寫入文件,但是不想在命令行上看到錯誤信息的輸出時,可以使用stderr將錯誤的信息重定向到“黑洞裝置” /dev/null 之中去
$ find /home -name .bashrc 2> /dev/null如果要將stdout和stderr寫入同一個文件夾,則可以使用
[dmtsai@study ~]$ find /home -name .bashrc &> list對于stdin,其與前兩者存在一定的差別。在使用 < 時可以在命令行上直接使用文檔的內(nèi)容
$ cat > catfile < ~/.bashrc $ ll catfile ~/.bashrc -rw-r--r--. 1 dmtsai dmtsai 231 Mar 6 06:06 /home/dmtsai/.bashrc -rw-rw-r--. 1 dmtsai dmtsai 231 Jul 9 18:58 catfile # 在這個例子中,先使用cat創(chuàng)建文件,在使用<寫入內(nèi)容,類似于cp的功能而 << 代表的時結(jié)束的字元,例如
[dmtsai@study ~]$ cat > catfile << "eof" > This is a test. > OK now stop > eof <==輸入這關(guān)鍵字,立刻就結(jié)束而不需要輸入 [ctrl]+d$ cat catfile This is a test. OK now stop <==只有這兩行,不會存在關(guān)鍵字那一行!命令執(zhí)行的判斷依據(jù):; && ||
- cmd;cmd——不考慮指令相關(guān)性的聯(lián)系下達(dá)指令
- cmd1 && cmd2——若cmd1正確執(zhí)行($?=0),才執(zhí)行cmd2
- cmd1 || cmd2——若cmd1執(zhí)行完且為錯誤,才執(zhí)行cmd2
管線命令
與前文不同的時,管線命令使用的是『 | 』這個界定符號。管線只能處理經(jīng)由前面一個指令傳來的正確信息(stdout),管線命令的處理示意圖如下
管線后面連接的必須是可以接受stdin的指令,例如less,more,head,tail。
管線的信息處理命令
-
cut——按要求切斷傳入的信息
$ cut -d'分隔字元' -f fields <==用於有特定分隔字元 $ cut -c 字元區(qū)間 <==用於排列整齊的訊息-d :後面接分隔字元。與 -f 一起使用; -f :依據(jù) -d 的分隔字元將一段訊息分割成為數(shù)段,用 -f 取出第幾段的意思; -c :以字元 (characters) 的單位取出固定字元區(qū)間;# 例子 $ echo ${PATH} | cut -d ':' -f 5 -
grep——分析輸入的信息,如果復(fù)合要求就取出
$ grep [-acinv] [--color=auto] '搜尋字串' filename-a :將 binary 檔案以 text 檔案的方式搜尋資料 -c :計算找到 '搜尋字串' 的次數(shù) -i :忽略大小寫的不同,所以大小寫視為相同 -n :順便輸出行號 -v :反向選擇,亦即顯示出沒有 '搜尋字串' 內(nèi)容的那一行! --color=auto :可以將找到的關(guān)鍵字部分加上顏色的顯示喔!
管線的排序命令
-
sort——依據(jù)不同的資料類型進(jìn)行排序,默認(rèn)使用字符進(jìn)行排序
$ sort [-fbMnrtuk] [file or stdin]-f :忽略大小寫的差異,例如 A 與 a 視為編碼相同; -b :忽略最前面的空白字元部分; -M :以月份的名字來排序,例如 JAN, DEC 等等的排序方法; -n :使用『純數(shù)字』進(jìn)行排序(預(yù)設(shè)是以文字型態(tài)來排序的); -r :反向排序; -u :就是 uniq ,相同的資料中,僅出現(xiàn)一行代表; -t :分隔符號,預(yù)設(shè)是用 [tab] 鍵來分隔; -k :以那個區(qū)間 (field) 來進(jìn)行排序的意思$ cat /etc/passwd | sort abrt:x:173:173::/etc/abrt:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin alex:x:1001:1002::/home/alex:/bin/bash$ cat /etc/passwd | sort -t ':' -k 3 root:x:<u>0<u></u>:0:root:/root:/bin/bash dmtsai:x:1000:1000:dmtsai:/home/dmtsai:/bin/bash alex:x:1001:1002::/home/alex:/bin/bash arod:x:1002:1003::/home/arod:/bin/bash -
uniq——將排序后的資料僅列出一個顯示
[dmtsai@study ~]$ uniq [-ic]-i :忽略大小寫字元的不同; -c :進(jìn)行計數(shù) -
wc——列出字?jǐn)?shù)、行數(shù)、字元數(shù)
$ wc [-lwm]-l :僅列出行; -w :僅列出多少字(英文單字); -m :多少字元;
tee 雙通道重導(dǎo)向
? 既會寫入指定的文件夾,又會在屏幕上顯示出輸出
$ tee [-a] file-a :以累加 (append) 的方式,將資料加入 file 當(dāng)中!?
字元轉(zhuǎn)換命令
-
tr——刪除或替換文字
$ tr [-ds] SET1 ...-d :刪除訊息當(dāng)中的 SET1 這個字串; -s :取代掉重複的字元!# 例子 $ last | tr '[a-z]' '[A-Z]' # 將 last 輸出的訊息中,所有的小寫變成大寫字元$ cat ~/passwd | tr -d '\r' > ~/passwd.linux -
col——將 [tab] 轉(zhuǎn)換為空格
$ col [-xb]-x :將 tab 鍵轉(zhuǎn)換成對等的空白鍵 -
join——將兩個文檔中,有相同內(nèi)容的一行合在一起
-
paste/expand懶得寫了
split 分割命令
$ split [-bl] file PREFIX-b :後面可接欲分割成的檔案大小,可加單位,例如 b, k, m 等; -l :以行數(shù)來進(jìn)行分割。 PREFIX :代表前置字元的意思,可作為分割檔案的前導(dǎo)文字。# 例子 $ cd /tmp; split -b 300k /etc/services services $ ll -k services* -rw-rw-r--. 1 dmtsai dmtsai 307200 Jul 9 22:52 servicesaa -rw-rw-r--. 1 dmtsai dmtsai 307200 Jul 9 22:52 servicesab -rw-rw-r--. 1 dmtsai dmtsai 55893 Jul 9 22:52 servicesac$ cat services* >> servicesback #將多個小文檔合成一個xargs 參數(shù)代換
其本質(zhì)是讓本身不能直接接受stdin輸入的指令可以在管線中使用
[dmtsai@study ~]$ xargs [-0epn] command-0 :不僅可以將分隔符從默認(rèn)的空格變成 NULL,還會將單引號、雙引號、反斜線等統(tǒng)統(tǒng)默認(rèn)為是普通字符;除了可以使 用-0選項外,其實還可以使用-d選項來指定任何一個符號作為分隔符 -e :這個是 EOF (end of file) 的意思。後面可以接一個字串,當(dāng) xargs 分析到這個字串時,就會停止繼續(xù)工作! -p :在執(zhí)行每個指令的 argument 時,都會詢問使用者的意思; -n :後面接次數(shù),每次 command 指令執(zhí)行時,要使用幾個參數(shù)的意思。當(dāng) xargs 後面沒有接任何的指令時,預(yù)設(shè)是以 echo 來進(jìn)行輸出喔!在管線命令當(dāng)中,常常會使用到前一個指令的 stdout 作為這次的 stdin ,某些指令需要用到文檔名稱 (例如 tar) 來進(jìn)行處理時,該 stdin 與 stdout 可以利用減號 “-” 來替代
$ mkdir /tmp/homeback $ tar -cvf - /home | tar -xvf - -C /tmp/homeback上述的例子的含義為:將 /home 里面的文檔打包,但打包的資料不是進(jìn)行記錄,而是傳送到 stdout;經(jīng)過管線后,將 tar -cvf - /home 傳送給后面的 tar -xvf -
總結(jié)
以上是生活随笔為你收集整理的鸟哥的Linux私房菜学习笔记(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: this和arguments
- 下一篇: Java 实现 植物大战僵尸 小游戏【附