# What is shell script?
## shell script怎麼運作
在teminal裡,我們可以透過```python a.py```或是```g++ a.cpp -o example.out``` ```./example.out```來執行自己寫好的程式,shell script就是把這些指令,有系統的統整,並包裝成一個腳本。
**EXAMPLE** ```view.sh```
```sh=
#!/bin/bash
cd ~
find hw1*
```
當你執行這隻shell script的時候,系統就等於吃到了兩個指令:
(1) 先移動到根目錄。
(2) 尋找目錄內hw1開頭的檔案
至於一開始的```#!/bin/bash```是確保你的語言是bash
## 在作業裡需要用到哪些命令
這應該是大家第一次接觸shell script最擔心的事了,如果大家的架構簡單的話,這整學期其實只會用到兩個指令: python、wget
- **python**
大家應該很熟悉了吧,但這裡說明一下,什麼叫不要把路徑寫死:
在執行檔案的時候,如果你把讀檔案的路徑寫在程式裡面,那這支程式在更換使用者的時候就很容易發生讀不到檔案或是crash等情形。<br>
所以在真正使用的情形上,我們會寫成 ```python hw1.py ./data/input.csv ./output.csv``` 也就是透過使用者自己決定程式裡面的變數。<br>
至於後面的路徑怎麼被使用,可以使用python的函式庫```sys```或是```argparse```
以上面的command為例:
```sys.argv[1] = './data/input.csv'```、```sys.argv[2] = './output.csv'```
在程式裡的話,就可以透過 ```pd.read_csv(sys.argv[1])``` 進行讀檔,
或是 ```open(sys.argv[2], 'w')``` 建立檔案<br>
稍微要注意的是,用```sys.argv```讀進來的值```type=str``` 如果有其他用途,就要自己再做一次型態轉換。
- **wget**
這個指令大概要等大家變成AI訓練師之後才會使用,用途是下載預先存好的檔案,這裡推薦大家的雲端平台是dropbox,以下的舉例也都是基於dropbox。<br>
**step1** 在雲端上傳一個檔案之後,把共享打開會拿到一個連結,這個大家應該都有使用過吧...<br>
**step2** 透過第一步,會拿到一個 [https://www.dropbox.com/s/90i9epykj3hske9/smile.jpg?dl=0](https://www.dropbox.com/s/90i9epykj3hske9/smile.jpg?dl=0 ) 長這樣的連結。<br>
**step3** 恭喜你,可以動手寫command了,大概的寫法會長這樣:
```wget https://www.dropbox.com/s/90i9epykj3hske9/smile.jpg?dl=1 -O example.jpg``` <br>
細心的你們一定有注意到兩個前面沒說的東西:
(1) dropbox共享連結的結尾不一樣了,這是因為```dl=0``` 預設是在瀏覽器中開啟,如果要強制下載的話,要使用 ```dl=1``` 。
(2) ```-O``` 的falg,這個跟其他命令的用法一樣,就是以...的名稱輸出。<br>
以上面的command為例,整句話的意思就會是,從```https://www.dropbox.com/s/90i9epykj3hske9/smile.jpg?dl=1```下載檔案,並以```example.jpg```的名字儲存。
## 怎麼動手寫shell script
知道怎麼寫路徑,知道怎麼下指令了,接著就是寫shell script了,應該有些人看不懂投影片裡```bash hw1.sh [input_file] [output_file]``` 是什麼意思
其實沒有想像中複雜。
就是執行的時候,會把兩串字串```[input_file]```、```[output_file]```餵給```hw1.sh```
那怎麼接收呢?這時候就要用```$```了,```$```代表預設變數:
```
bash hw1.sh [input_file] [output_file]
$0 $1 $2
```
在這個例子裡```$1=[input_file]``` ```$2=[output_file]``` 也就是說我們可以利用```$1``` ```$2```再把指令塞進其他command,是不是覺得似曾相似,怎麼跟python的指令有87趴像。
如果你很有耐心看到這裡,那你會發現...
我會直接把hw1的shell script怎麼寫打出來xd
**Example** ```hw1.sh```
```sh=
#!/bin/bash
python hw1_test.py $1 $2
```
至於 *hw1_test.py* 裡會出現
```test = pd.read_csv(sys.argv[1], names=index)```
```fout = open(sys.argv[2], 'w')```
當我們運行```bash hw1.sh ./data/test.csv ./output.csv```的時候,
就等於我們下了```python hw1_test.py ./data/test.csv ./output.csv```的指令
**Example** ```hw3.sh```
```sh=
wget https://www.dropbox.com/s/balabala_model?dl=1 -O 'CNN_model.pkl'
python test.py $1 $2 CNN_model.pkl
```
至於這個,就不方便多說了^^