GUI vs Command line
前者應給你選項,使用者導向
後者是你要自己給選項,自己知道自己要甚麼
- bash設計思想:你知道自己在做甚麼,所以不會"保護"你
File system
以"root directory” 開始的一顆tree
path 定義為root到當前目錄的路徑,分為相對與絕對
絕對就是要全部從root開始寫出來
相對則是可以使用 . (當前目錄) 、 ..(上一層目錄) 這樣去操作
比如現在在/user/test/Cur目錄 ,需要移動到上一層
絕對 cd /user/test
相對 cd ..
心得: 大多情況下相對路徑方便很多,但如果要寫成shell script,則注意相對路徑會相對於呼叫時所在目錄,而非檔案所在目錄
基本指令
unix/linux系統預設的指令,也就是已經可執行的小程式
man <指令>
開啟該指令說明書
echo xxx
可以在termianl顯示 xxx
應用:快速建立文件
echo “hello” > hello.txt
(關於 > 重導後面會講解)
ls
顯示當前目錄內的內容,預設不會顯示隱藏的目錄
-a 參數: 顯示隱藏目錄
-l 參數: 顯示清單格式
兩者可以連用 即 ls -la
pwd
顯示當前目錄
cd <dir>
移動目錄
- Note: cd - => 類似遙控器的兩台互換功能
mkdir <dir>
創建目錄
cp <file path> <path>
將file 複製到path
注意,若要複製目錄要加上 -r 參數
rm <file path>
刪除檔案,一樣目錄刪除要加-r
此外當有東西刪不掉可以用-f
但這指令非常邪惡,因為linux認為你知道你在做甚麼,所以刪除後東西就沒了
cat <file>
印出檔案內的內容,原本是作為串接用的
比如cat fileA fileB
是把fileB 接在fileA 後面
mv <file path> <path>
將file移動
也用於改名,可以mv <fileA> <fileB>
萬用字元
正規化的萬用字元非常方便,並且在資料量大時也是有必要的
* 表示後面接任意字元任意個
比如
rm * 會刪除當下所有檔案
cat *.json 則會顯示當下所有的結尾是.json的檔案
? 表示有一個任意字元
比如
??? 可以表所有3個字的檔案
[ ] 選擇
[] 表示有一個[]內的字元
比如:
[abc] 表示a或b或c
- 可表示連續 [0-9] [a-z] 表示0,1,2…9 a,b,c….z ^ 可表示反向選擇 [^abc] 表示非abc的任意字元
綜合例子:
[^a-z]* 所有開頭非大寫的檔案
*[0-9]* 所有含有數字的檔案
^ $
^ 表示開頭
$ 表示結尾
通常用於sed等程式,用於匹配字串
資料流重導向
資料流有三種
- 標準輸入 (stdin), 代碼是0, 使用 < 或 « 符號操作
- 標準輸出 (stdout), 代碼是1, 使用 > 或 » 符號操作
- 標準錯誤輸出 (stderr), 代碼是2, 使用 2> 或 2» 符號操作
通常標準輸入由鍵盤輸入,標準輸出則是印在螢幕上
重導則可以將原本要印在螢幕上的資料,寫入檔案中
比如
(./program<intput.data) > output.dat
可以將input.data 作為輸入給 program
然後將輸出結果引導到 output.dat
./program > /dev/null
(將資料丟入黑洞)
> 與 >>
前者會覆蓋原檔案
後者則會append在後面
指令判斷 與 pipline
&& 、 ||
前者是第一個指令成功,就執行第二個
後者是第一個指令失敗,就執行第二個
比如
[ -z string ] && echo “Null” || echo “Not null”
[ -z string ]會檢查string是否為空,如果為空視為執行成功,否則為失敗
| (pipe)
將前者結果傳給後者
比如
cat fileA | cut -d “,” -f 1
將fileA 印出後交得cut處理
注意,善用pipe串接不同指令,可以很有效率的利用程式
同時中間也可以混雜自己寫的程式
而善用 && || 萬用字元,可以寫出優雅跟簡潔的程式
關於文字處理(cut、sed 、tr、grep)可以參考文字處理篇