###### tags: `程式基礎` `Command Line`
# [week 1] Command Line 入門 & 基本指令
> 本篇為 [[CMD101] Command Line 超新手入門](https://lidemy.com/p/cmd101-command-line)和 [[CS101] 初心者的計概與 coding 火球術](https://lidemy.com/p/cs101-coding) 這兩門課程的學習筆記。
```
學習目標:
說得出程式如何執行
理解寫程式的本質只是一行行的指令
了解前端與後端的區別
能說出從發出一個 request 到接收 response 中間發生的事
了解不同載具的差異在哪(Desktop、Mobile、Web)
了瞭解基本的 command line 指令
```
---
## 關於寫程式這件事
就是對電腦下指令(程式碼),讓電腦執行我們想要的動作(解決問題)。
## 條列式的重要性
試著用「程式化思考」將解法以標準化的格式呈現。
> 範例:「給你一串文字,問你裡面有沒有 p」
```
1. 假設 n 是 1,length 是字串長度,
A 設成 -1 代表找到的位置,p 是要找到的字 //字串不會有負數,若小於零代表找不到
2. 看第 n 個字是不是 p,是的話 A=n //把 A 設成 n 的值,若 n=3,即在第 3 個數找到 p
3. 把 n+1,如果 n+1 大於 length 的話,就跳到第 5 步 //條件機制
4. 跳回第 2 步 //迴圈的概念
5. 如果 A < 0,代表沒出現過;否則 A 就是答案
```
---
## Command Line 是什麼?
- 操控電腦的方法大致上分兩種類型:
1. **GUI(Graphical User Interface,圖形化介面)**:一般習慣使用的電腦操作介面,透過設計出的「圖形」來下指令。
2. **CLI(Command Line Interface,命令列介面)**:透過「純文字」來達成指定動作。
- 兩種都可以用來和電腦溝通;但有些伺服器可能沒有 GUI (例如 database),這種情況就只能使用 CLI 來進行操作。
## 環境設置
- 要執行 Command Line 指令,必須先根據作業系統安裝 Command Line Tool:
1. Windows:[git-bash](https://gitforwindows.org/)(推薦)、[Cmder](https://blog.miniasp.com/post/2015/09/27/Useful-tool-Cmder)
2. Mac:[iTerm2](http://huli.logdown.com/posts/402147-iterm2-zsh-better-environment)
- 或是使用 [JSLinux](https://bellard.org/jslinux/) ([以 JavaScript 寫成的 Linux 模擬器](https://zh.wikipedia.org/wiki/Jslinux))來統一環境,即可在瀏覽器介面進行測試。
## 基本指令介紹
> 所謂的「指令」其實也是由程式寫成,我們藉由輸入指令來執行程式。
#### `pwd`(Print Working Directory):印出目前所在位置
#### `ls`(List):印出當前位置檔案清單
- `ls-l`:長格式(long),顯示有關檔案的詳細資訊
- `ls-a`:列出所有檔案(包括隱藏檔)
#### `cd`(Change Directory) 切換目前資料夾
- `cd ..`:回到上一層資料夾
- `cd ~`:回到 home 目錄(我的文件)
- `cd /`:回到根目錄
- 絕對路徑:「一定由根目錄 / 寫起」
`cd /Users/share/data`
- 相對路徑:「不是由 / 寫起」
`cd test`
- 範例:「若要從 /downloads/test/data 到 /downloads/test/media 底下時」
可以寫 `cd ../media`:先回到上一層,再進入 media 資料夾
也可寫 `cd ~/downloads/test/media`:直接用絕對路徑進入

> 小技巧:直接把圖形介面的資料夾拖到 CLI 裡,就會自動輸入那個資料夾的絕對路徑。可節省打字時間。
#### `clear`:清空螢幕
#### `touch`:碰一下
- 作用 1:touch 現有的檔案,會修改檔案時間成當前時間
- 作用 2:若檔案不存在,則會新增檔案
#### `mkdir`:MaKe DIRectory 新增資料夾
#### `rm`:ReMove 刪除檔案(註:有關刪除指令需慎用)
#### `rmdir`:刪除資料夾
- 也可用 `rm -r` 指令來刪除檔案或資料夾
#### `cp`:CoPy 複製
- 範例 1. `cp data data_2`:複製出一個 data_2 檔案
- 範例 2. `cp -r deep deep2`:複製出一個 deep2 資料夾
#### `mv`:MoVe 移動檔案 or 更改檔名
- 作用 1:當找到該資料夾時,檔案會**移到資料夾裡**
- 範例:`mv data folder`:將 data 檔案移到 folder 資料夾裡
- 作用 2:當找不到該資料夾,則會**更改檔案名稱**
- 範例:`mv data test`:將 data 檔案名稱更改為 test
#### `vim`:進入文字編輯器
> 本來想說沒問題,結果還真的卡很久無法回到上層介面 Orz
需按下 [ESC] 按鍵回到一般指令模式,才能下 `:wq` 指令存檔(write)並離開 (quit)。
#### 參考 vim 介紹:
可分為普通模式跟編輯模式:
- 按鍵 i:進入編輯模式
- 按鍵 Esc:進入普通模式
- `:q` 退出
- `:wq` 存檔(write)後退出(quit)
- `:q!` 不存檔直接退出
參考資料:
1. [vi 與 vim 的指令整理](http://www.vixual.net/blog/archives/234)、
2. [鳥哥的Linux 私房菜-- 第九章、vim 程式編輯器](http://linux.vbird.org/linux_basic/0310vi.php)
## 更多常用指令
#### `date`:印出當前日期
#### `top`(Table Of Processes):印出所有Process,可持續偵測程序運作的狀態(按 q 鍵離開)
#### `cat`(CATenate):查看檔案內容
#### `less`:分頁式印出檔案
#### `grep`:抓取特定關鍵字
#### `echo`:印出字串
#### `|`(pipe):把前面的輸入「變成」後面的輸出
- 範例:`cat file.txt | grep hi `:從印出的 file.txt 內容中,抓取字串 hi 並輸出
#### `>`(redirect):將輸入或輸出重新導向
- 範例 1:`date > time.txt`:將 `date` 輸出到 `time.txt`
再輸入 `cat time.txt`,會顯示出 `Sun May 31 20:29:57 UTC 2020`
- 範例 2:`echo "123" > 123.txt`:印出 123 到 123.txt
1. 若輸入 `echo "456" > 123.txt`:顯示 456,檔案會被全部覆蓋
2. 若輸入 `echo "456" >> 123.txt`:顯示 123456,兩個 `>` 會新增內容在最後
#### `wget`:下載檔案
- 範例:輸入 `wget https://www.google.com.tw/`,即可下載 Google 首頁的網頁原始碼(index.html)
#### `curl`:送出 request,可用來測試 API
---
### 補充:檔案格式
+ 內容是一回事,如何解讀是另一回事
+ 在電腦裡的任何檔案,其實都是以純文字組成,可用不同格式進行解析
+ 可以透過設定副檔名(如:文件.pdf、圖片.jpg)幫助電腦辨別格式
參考資料:
1. [[第一週] Command Line - Terminal、基本指令介紹](https://yakimhsu.com/project/project_w1_CommandLine.html)
2. [Linux Command 命令列指令與基本操作入門教學](https://blog.techbridge.cc/2017/12/23/linux-commnd-line-tutorial/)
3. [介紹好用工具:Cmder ( 具有 Linux 溫度的 Windows 命令提示字元工具 )](https://blog.miniasp.com/post/2015/09/27/Useful-tool-Cmder)
4. [[心得] iTerm2 + zsh,打造更好的工作環境](http://huli.logdown.com/posts/402147-iterm2-zsh-better-environment)