Skip to content

Bash Terminal簡介

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等程式,用於匹配字串

資料流重導向

資料流有三種

  1. 標準輸入 (stdin), 代碼是0, 使用 < 或 « 符號操作
  2. 標準輸出 (stdout), 代碼是1, 使用 > 或 » 符號操作
  3. 標準錯誤輸出 (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)可以參考文字處理篇

參考資料

影片介紹:
https://www.youtube.com/watch?v=oxuRxtrO2Ag