1. 程式人生 > >bash程式設計讀書筆記(基礎篇I)

bash程式設計讀書筆記(基礎篇I)

前言: bash不同於其他的語言。它和unix命令緊密結合。所以,精通bash的過程,就是精通unix命令的過程。

1. && 與 ;

test -e . && echo "Yes"
解釋:&& 和 ";" 的區別是,如果前一個命令不成功,則後面的命令不能執行。而 ";" 不論前面的命令是否執行,後面的命令一定執行。也就是說,";" 和 "||" 功能相同。例如, ls asdfd ; echo "Yes" 和 ls asdfd || echo "Yes" 相同。

2. linux下的true和false命令

解釋:再shell下,居然還有true和false這樣的命令。一般在/bin 下。直接返回程式語言中的True和False值,其他什麼都不做。厲害吧!

3. for 迴圈

for fn in *; do
         echo "$fn"
    done
解釋:"*"在命令列下指代一個目錄下的所有檔案(包括子目錄)。在shell腳本里,指代當前目錄下的所有檔案和子資料夾(和python比較相似)。當然,這裡也可以使用列表,列表值之間用一個空格隔開,例如 for fn in tom dick harry; do。

4. echo "fsadfad" 自動載入換行符

解釋: 不論再命令列還是在shell指令碼下,echo 在沒有加選項的情況下都自動載入一個換行符(\n)。所以,echo "" 就相當於輸入了一個換行符。若要取消換行符,則需要加上 -n。例如, echo -n "dfasdfasdf"。同時,echo也不會直接解釋換行符,如 echo "fasdf\ndfasdf"。如果要echo能分析特殊字元(注意這裡是特殊字元),需要使用 ”-e“。如,echo -e "fasdfsdf\n\t\basdf"。

5.  ls -1

ls -1
解釋: 這裡的“1”不是“l”。 增加這個選項的目的是,在每個檔案後面用換行符代替ls輸出檔案之間的空格符。使每一行只有一個檔名。

6. 使用者輸入表示式和PS提示符

PS3="Choose (1-5):"
echo "Choose from the list below."
select name in red green blue yellow magenta
do
	break
done
echo "You chose $name."
解釋:PS3是為select提供提示符。而PS1則是shell命令列前面的提示符。如 [[email protected]
path]$。PS2是未完成表示式時候,出現的提示符,例如,使用 “ 沒有結尾引號時候,SHELL會在下一行出現一個>的提示符。

7. date

date +%N
解釋:date  [option] ...[+format]。這裡+%N是format,而且所有format前面都要加上”+“。

8. touch

touch filename
解釋:常常用touch生成一個新的檔名。使用過多以至於以為touch就是用於生成新的檔案的。其實不是,touch命令是用來修改檔案的訪問和修改時間到當前時間的,所以如果檔案已經存在,則touch不會覆蓋原有檔案,而只是修改檔案的時間到當前時間而已。
9. 獲取子字串
string="this is a substring test"
substring=${string:10:9}
解釋:substring=${string_variable_name:starting_position:length}
10. 字串替換
alpha="This is a test string in which the word \"test\" is replaced."
beta="${alpha/test/replace}"
beta="${alpha//test/replace}"
解釋:用"replace"替換”test“。如果想替換字串裡所有的”test“,就使用 第三行的表示式。

11. 列表和陣列

array=(red green blue yellow magenta)
len=${#array[*]}
echo "The array has $len members. They are:"
i=0
while [ $i -lt $len ]; do
	echo "$i: ${array[$i]}"
	let i++
done
list="cricket frog cat dog"
poem="I wanna be a x\n\
A x is what I'd love to be\n\
If I became a x\n\
How happy I would be.\n"
for critter in $list; do
	echo -e ${poem//x/$critter}
done
          
解釋:在bash腳本里,array和list的賦值是有區別的。詳見程式碼。

12. bash自帶的正則表示式

x='123-22-3432'
if [[ $x =~ [0-9]{3}-[0-9]{2}-[0-9]{4} ]]
then
	echo "right"
else
	echo "Wrong"
fi 
$ echo {a..z}
for n in {0..5}
do
	echo $n
done
解釋:自bash version3之後,bash可以使用正則表示式了。注意空格,賦值沒有空格,比較運算式左右兩邊都需要有空格。正則表示式需要用”[[“。而且不能使用perl中的正則表示式\w、\d和\s。

13. ~/.bash_history

解釋:這個檔案是存放前次登入shell(bash)之後執行的命令。而當前執行的命令被被儲存在記憶體中,直到退出shell以後,才會儲存到.bash_history裡。預設是1000條。
14. alias

alias lm='ls -la'
解釋:alias命令設定別名。但是隻在當前的bash下。關閉當前bash後,別名就會消失。
15. type
type cd
type ll
type -t ll
type -a ll
解釋:type命令是檢視命令是否是bash內建命令或者外部命令,或者是否是別名。

16. 變數和路徑的關係。

解釋:在腳本里,最好在開頭把所有路徑都寫到變數裡。這樣,如果路徑發生變化後,不需要長篇地修改腳本里的路徑地址。

17. 賦值、取值、重置和輸出

myname=John
myname=John\ \'s\ brother
myname="John 's brother"
myname="$name"yes
myname=${name}yes
PATH=$PATH:/home/asdfd/bin
PATH="$PATH":/home/asdfd/bin
PATH=${PATH}:/home/asdfd/bin
echo $myname
export myname
unset myname

解釋:在命令列下,所付的值不需要引號,除非含有空格和不能使用在命令列的特殊字元(或者用跳脫元字)。在腳本里也同樣。所有變數都用 echo 取值,用unset清空變數。在 echo 後的變數需要加 $,在unset和export之後的變數不用 $。

18. 輸出核心的版本號

cd /lib/modules/`uname -r`/kernel

解釋:反單引號內的 uname -r 輸出當前所使用核心的版本號。這是一個非常實用的命令。會在多處使用到。

19. $(commands) 和 `commands`

version=`uname -r`
version=$(uname -r)
解釋:這兩個表達都是一樣的。但是後者比較容易區分。建議使用後者。但是,$( ) 和 ${ } 是完全不同的。不能混淆了。前者內嵌命令,後者內嵌變數。

20. 在linux下搜尋文件。find、ls、locate

ls -R /usr/share | grep -i firefox.png
find /usr/share -iname firefox.png
locate firefox.png

解釋:使用第一個,還需要grep做輔助查詢。使用第二個則比較明朗,而且find也可以使用基礎正則表示式。locate功能非常強大,也同樣可以使用基礎正則表示式。locate -r。

21. linux環境變數。檢視命令用env、export、set。

解釋:比較奧常見的環境變數有HOME、PATH、SHELL、HISTSIZE、MAIL、LANG、RANDOM、UID、USER、USERNAME、PWD、HOSTNAME、SSH_AUTH_SOCK、HOSTTYPE、OSTYPE、MACHTYPE。系統內定的變數(不論是否為環境變數)都需要大寫。

22. PS1

解釋:

\d :可顯示出『星期 月 日』的日期格式,如:"Mon Feb 2"
\H :完整的主機名稱。舉例來說,鳥哥的練習機為『www.vbird.tsai』
\h :僅取主機名稱在第一個小數點之前的名字,如鳥哥主機則為『www』後面省略
\t :顯示時間,為 24 小時格式的『HH:MM:SS』
\T :顯示時間,為 12 小時格式的『HH:MM:SS』
\A :顯示時間,為 24 小時格式的『HH:MM』
\@ :顯示時間,為 12 小時格式的『am/pm』樣式
\u :目前使用者的帳號名稱,如『root』;
\v :BASH 的版本資訊,如鳥哥的測試主機版本為 3.2.25(1),僅取『3.2』顯示
\w :完整的工作目錄名稱,由根目錄寫起的目錄名稱。但家目錄會以 ~ 取代;
\W :利用 basename 函式取得工作目錄名稱,所以僅會列出最後一個目錄名。
\# :下達的第幾個指令。
\$ :提示字元,如果是 root 時,提示字元為 # ,否則就是 $ 囉~

23. 父程式與子程式,自定義變數和環境變數。export 可以把自定義變數程式設計環境變數讓子程式也可以使用。

username=John
export username
export

解釋:子程式能繼承父程式的環境變數,但是不能繼承父程式的自定義變數。所以需要export宣告一下,設定好後,使用export 檢視。export 後面的變數不需要加 $符號。

資料:

相關推薦

bash程式設計讀書筆記基礎I

前言: bash不同於其他的語言。它和unix命令緊密結合。所以,精通bash的過程,就是精通unix命令的過程。 1. && 與 ; test -e . && echo "Yes"解釋:&& 和 ";" 的區別是,如果前一個

《C程式設計習慣》讀書筆記1-6章

最近在看兩本國人寫的書:C程式設計習慣、Linux C程式設計。越看越發現如獲至寶。有時真覺得,看國外的書,都能將晦澀概念深入淺出解釋通透,而國內的書,能切合國人的習慣來解釋和應用知識。以前只青睞國外的書,這兩本國內的電子書本來只想簡單瀏覽一遍鞏固基礎,現在越看越想做讀書筆記,因為實在是很多看似

python高階程式設計讀書筆記

python高階程式設計讀書筆記(一) python 高階程式設計讀書筆記,記錄一下基礎和高階用法 python2和python3相容處理 使用sys模組使程式python2和python3相容 import sysver=sys.version_info#(ma

Java併發程式設計讀書筆記

  前幾天整理電腦檔案的時候,突然發現了之前還在kindle儲存了關於併發程式設計的書,剛好自己在這方面挺薄弱的,故整理一波讀書筆記,繼續加強學習。   1.上下文切換 1.1 時間片分配演算法 時間片是CPU分配給各個執行緒的時間,CPU通過不停地切換執行緒執行,使各個執行緒彷彿是”同

質量免費--讀書筆記

推薦序:韋恩.考斯特 克勞士比非常想讓人們知道:質量的定義是符合要求,而不是好;質量的系統是預防,而不是校驗和救火;工作的標準是零缺陷,而不是差不多就好;質量的衡量要用金錢和代價,而不是各種基於妥協的指標。 叢書總序:楊鋼 解讀經典,既是一種榮譽,也是一種責任。 克勞

javascript高階程式設計讀書筆記1第 1章 JavaScript 簡介

第 1章 JavaScript 簡介 1.1 JavaScript 簡史 1.2 JavaScript 實現 一個完整的 JavaScript 實現應該由下列三 個不同的部分組成(見圖 1-1)。  核心(ECMAScript)  文件物件模型(DOM)

JavaScript高階程式設計讀書筆記變數 作用域和記憶體

ECMAScript可能包含兩種不同的資料型別,基本資料型別指的是簡單的資料欄位,而引用型別指那些可能由多個指構成的物件。 1、基本資料型別是按值訪問的,因為可以操作儲存在變數中的實際值。 2、引用型別的是按引用訪問的,因為引用型別的值是儲存在記憶體中的物件,ECMAScript不允許直接訪問記憶體中的位

深度學習筆記基礎——線性單元和梯度下降

        在上一篇文章中,我們已經學會了編寫一個簡單的感知器,並用它來實現一個線性分類器。你應該還記得用來訓練感知器的『感知器規則』。然而,我們並沒有關心這個規則是怎麼得到的。本文通過介紹另外一種『感知器』,也就是『線性單元

深度學習筆記基礎——機器學習與深度學習簡介

  機器學習是最基礎的(當下初創公司和研究實驗室的熱點領域之一)。深度學習是非常嶄新和有影響力的前沿領域。 一、定義 1、機器學習    從樣本中學習的智慧程式。是資料驅動的。90年代初提出。強調的是給計算機程式(或者機器)輸入一些資料後,它學習這些資料,而

Git 學習筆記基礎

1. 命令初識 檢視GIT版本 git --version 在Global級別設定UserName(推薦使用) git config --global user.name ’Freud Kang‘ 在當前目錄界別設定UserName(優先順序高)git config us

PHP與MySQL程式設計讀書筆記

一、PHP基本型別及函式 1. 短標籤 sprintf??? 2. 型別自動裝換 3. 與型別相關的函式 gettype(),settype(),判斷是否為某個型別:is_name() 變數賦

Object-C高階程式設計讀書筆記5——Block的物件型別擷取

在之前的部落格中,我們探討了Block對於普通型別資料的擷取,其實現很簡單,就是在Block物件中儲存一份值拷貝。 那麼,對於OC中的物件型別(包括系統自帶型別NSArray,NSString和自定義物件型別),Block又是怎麼儲存的呢?在《OC高階程式設計》書中對於該部

Object-C高階程式設計讀書筆記3——Block的變數擷取

之前我們對於Block的定義為 “帶有自動變數值的匿名函式”。通過前面的介紹,知道了Block能夠保持傳入其中的變數的值,即使在Block外部這些傳入的值已經結束了其作用域,但是在Block被呼叫時,

Unix網路程式設計讀書筆記

這一章正式開始網路程式設計的內容,先將書中的示例編寫如下: 首先是伺服器端: #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #include &l

讀書筆記第五周之魔方的創新

有著 而是 大牛 不一定 自己的 發展 有用 pos 哪些 讀書筆記(第五周) 讀《構建之法》之魔方的創新 在不苛求比喻精準的前提下,“魔方的創新” 這篇小故事寫得確實有意思,也很能反映創新過程中一系列的問題。首先,通過幾個大致的故事節點來總結一下情節的發展,再來逐一展開拓

原創:聊Python小白如何系統自學成為Python大牛基礎

Python Python學習 Python開發 Python自學 原創:聊Python小白如何系統自學成為Python大牛(基礎篇一)上 支持原創 本文章,由頭條py柯西發表,禁止轉載,希望大家支持原創 歡迎大家點擊復制鏈接看原文https://www.toutiao.com/i654581

資料結構與演算法JavaScript描述讀書筆記js實現樹

js定義二叉查詢樹 //建立建構函式建立節點 function Node(data){ this.data = data; this.left = null; this.right = null; } function tree(){ this.root = nu

資料結構與演算法JavaScript描述讀書筆記高階排序演算法

希爾排序 在插入排序的基礎上,只不過比較的步長不一樣,插入排序比較步長一直是1(即一個一個的比較)。希爾排序的步長第一次一般設定為gap=Math.floor(arr.length/2),之後依次將步長設定為gap/2,直到步長變為1,這個時候徹底轉化成插入排 測試時間普通排序演算法1

資料結構與演算法JavaScript描述讀書筆記基本排序演算法

前提準備 //自動生成陣列的函式,n:整數個數,數字在l-r之間 function setData(n,l,r){ var dataStore = []; for(var i=0;i<n;i++){ dataStore[i] = Math.floor(

老男孩shell實戰讀書筆記1-5章節

老男孩shell教程(1-5章節) 關於檢視系統變數命令 set: 輸出所有的變數,包括全域性變數和區域性變數 env:只顯示全域性變數 declare:輸出所有的變數、函式、整數和已經匯出(export)的變數 刪除環境變數 unset 變數名 關於設定(全域性)環境變數的三種方法 expo