# 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 ``` 至於這個,就不方便多說了^^