Try   HackMD

What is shell script?

shell script怎麼運作

在teminal裡,我們可以透過python a.py或是g++ a.cpp -o example.out ./example.out來執行自己寫好的程式,shell script就是把這些指令,有系統的統整,並包裝成一個腳本。

EXAMPLE view.sh

#!/bin/bash cd ~ find hw1*

當你執行這隻shell script的時候,系統就等於吃到了兩個指令:
(1) 先移動到根目錄。
(2) 尋找目錄內hw1開頭的檔案
至於一開始的#!/bin/bash是確保你的語言是bash

在作業裡需要用到哪些命令

這應該是大家第一次接觸shell script最擔心的事了,如果大家的架構簡單的話,這整學期其實只會用到兩個指令: python、wget

  • python
    大家應該很熟悉了吧,但這裡說明一下,什麼叫不要把路徑寫死:
    在執行檔案的時候,如果你把讀檔案的路徑寫在程式裡面,那這支程式在更換使用者的時候就很容易發生讀不到檔案或是crash等情形。

    所以在真正使用的情形上,我們會寫成 python hw1.py ./data/input.csv ./output.csv 也就是透過使用者自己決定程式裡面的變數。

    至於後面的路徑怎麼被使用,可以使用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') 建立檔案

    稍微要注意的是,用sys.argv讀進來的值type=str 如果有其他用途,就要自己再做一次型態轉換。

  • wget
    這個指令大概要等大家變成AI訓練師之後才會使用,用途是下載預先存好的檔案,這裡推薦大家的雲端平台是dropbox,以下的舉例也都是基於dropbox。

    step1 在雲端上傳一個檔案之後,把共享打開會拿到一個連結,這個大家應該都有使用過吧

    step2 透過第一步,會拿到一個 https://www.dropbox.com/s/90i9epykj3hske9/smile.jpg?dl=0 長這樣的連結。

    step3 恭喜你,可以動手寫command了,大概的寫法會長這樣:
    wget https://www.dropbox.com/s/90i9epykj3hske9/smile.jpg?dl=1 -O example.jpg

    細心的你們一定有注意到兩個前面沒說的東西:
    (1) dropbox共享連結的結尾不一樣了,這是因為dl=0 預設是在瀏覽器中開啟,如果要強制下載的話,要使用 dl=1
    (2) -O 的falg,這個跟其他命令的用法一樣,就是以的名稱輸出。

    以上面的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

#!/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

wget https://www.dropbox.com/s/balabala_model?dl=1 -O 'CNN_model.pkl' python test.py $1 $2 CNN_model.pkl

至於這個,就不方便多說了^^