---
# System prepended metadata

title: Command Line & Shell Script
tags: [程式導師, 課程筆記, Command Line]

---

# Command Line & Shell Script

###### tags: `程式導師` `Command Line` `課程筆記`

## 常用指令

- `pwd` 想知道現在的檔案位置 
- `ls` 想知道目前資料夾內有哪些東西
- `cd` 在資料夾內穿梭
    - `cd` 回到最高層的資料夾
    - `cd ..` 回到上層資料夾
    - `cd ~` 等同 `cd Users/laiyenju`
- `man` 忘記指令，就輸入 
- `touch <檔案名稱>` 建立新檔案，若 touch 既有檔案，會更新既有檔案的上次修改時間。
- `mkdir` 建立新資料夾
- `rm <檔案名稱>` 刪除檔案
- `rmdir <檔案名稱>` 、`rm -r <檔案名稱>` 刪除資料夾
- `mv <檔案名稱> <目的地資料夾>` 移動檔案
- `mv <檔案名稱> <新的檔案名稱>` 更改檔案名稱
- `cp <檔案名稱> <複製出來後的檔案名稱>` 複製檔案
- `cp -r <資料夾名稱> <複製出來後的資料夾名稱>` 複製資料夾名稱
- `cat <檔案名稱>` 直接在 terminal 內瀏覽檔案內容
- `less <檔案名稱>` 當檔案內容很多時可使用，就能滾動瀏覽檔案內容

## 小技巧／觀念

- `cd` 時，使用 tab 可以不需要輸入完整檔案名稱，系統會自動補完檔案名稱。
- 指令有內建也能自行安裝，像`wget` 就是自行安裝的指令
- `>` `<` 導向指令（redirection）
- `|` 組合指令（pipe）

| 導向指令 | 效果 |
| ------ | ------ |
| `ls -al > list_result` | 將資料夾內的檔案列表輸出成為 list_result 檔案。 |
| `echo "123" > 123.txt` | 將 123.txt 內容變成 123 |
| 接著輸入 `echo "456" > 123.txt` | 覆寫 123.txt 的內容，只會有 456 |
| 接著輸入 `echo "456" >> 123.txt` | 會在 123.txt 原本內容之後，放入 456，不會覆寫。|

| 組合指令 | 效果 |
| ------ | ---- |
| `cat 123.txt | grep 4` | 在檔案中找出 4 這個字，並輸出搜尋結果 |
| `cat 123.txt | grep 4 > result` | 輸出 123.txt 檔案內容，並找出 4 這個字，將結果放入 result 檔案內 |

## Vim

可以直接進入檔案進行編輯，也能當作文字編輯器使用。

- `vim <檔案名稱>` 用 vim 開啟並編輯檔案內容
- 分為普通模式、insert 模式，進入頁面預設是普通模式，按下 `i` 才會切換到 insert 模式，按下 `esc` 切回普通模式。
    - 普通模式：刪除、複製、貼上功能
    - insert 模式：打字
- `:q` 離開 vim
- `:wq` 存檔後離開 vim

## 進階指令

- `grep` 抓取關鍵字
`grep <關鍵字> <要搜尋關鍵字的檔案>` 就能查找在檔案內的關鍵字。
- `wget` 下載檔案
`wget <圖片網址>` 會下載該網頁圖片
- `curl` 送出 request，可以用來測試 API


## Shell Script 程式化腳本

為何要學 shell script?
- 通用（任督二脈）
- 快速

`/etc/shells` 檔案可知道能用的 shell 有多少
bash = Bourne Again SHell

[CVS、RCS、VCS、SCM 名詞定義](http://smlie-blog.blogspot.com/2013/11/git-cvsrcsvcsscm.html)
[Tech Talk: Linus Torvalds on git](https://youtu.be/4XpnKHJAok8?t=486)

BitKeeper

版本管理工具的重要要素：

- distributed
- performance
- guarantee the outcome the same as SCM


### Bash shell

tab 鍵的功能
- 命令補齊
- 檔案補齊

zsh 相容所有 bash 指令

執行 shell.sh 的方式有很多，使用 mac 的話，可以直接以 `bash shell.sh` 執行。

```bash=
#!/bin/bash
# Program:
#       This program shows "Hello World!" in your screen.
# History:
# 2015/07/16	VBird	First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! \a \n"
exit 0
```

- `#!/bin/bash` 因為使用的環境是 bash，所以要宣告使用的語法是 bash 語法，告訴電腦要使用 bash shell。
- `PATH=...` 與 `LANG=...` 將環境變數設定好。
- `echo ...` 

鳥哥：使用撰寫 script 的工具最好使用 vim 而不是 vi ，因為 vim 會有額外的語法檢驗機制，能夠在第一階段撰寫時就發現語法方面的問題喔！


