# 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 會有額外的語法檢驗機制,能夠在第一階段撰寫時就發現語法方面的問題喔!