[Linux] 在 shell script 中取得所有的參數 (除了最後一個)

[Linux] 在 shell script 中取得所有的參數 (除了最後一個)

跟公司裡,常常需要把某些檔案傳到某台 Linux server 上,

而要 ssh 到這台 server 是需要使用 key 的,像是:

scp -i ~/key file.txt file2.exe root@172.22.2.20:~/

 

因為常常在打,就會覺得這上面的 scp, key, 遠端 server 的帳號與 IP 等等,

一直重覆地打很麻煩…

嗯… 能不能寫一個 shell script 來幫忙作這事呢?

我想把這 script 命名為 scp_to_server.sh,然後接受任意多個參數,

最後一個參數表示遠端伺服器的目錄,其他的參數表示本地端要被傳過去的檔案…

shell 中的 $@ 代表所有的參數,但問題是,要如何只取出前面的參數呢?

 

網路上查了一下,Bash Get All Command Line Arguments Before Last Parameter In $@ 這篇完全解答了我的疑問,

現在就照他的寫法寫一個:

TARGET_IP="172.22.2.20"
# Separate arguments
ARG_ARRAY=($@)
ARG_ARRAY_LEN=${#ARG_ARRAY[@]}
ARG_LAST=${ARG_ARRAY[$ARG_ARRAY_LEN-1]}
ARGS_EXCEPT_LAST=${ARG_ARRAY[@]:0:$ARG_ARRAY_LEN-1}
# Connect to server
echo Copying file $ARGS_EXCEPT_LAST to ${TARGET_IP}:$ARG_LAST ...
scp -i ~/key $ARGS_EXCEPT_LAST root@${TARGET_IP}:$ARG_LAST

 

簡單說明一下,$@ 是取得 script 的所有參數,($@) 則會將其轉成一個陣列 ARG_ARRAY,

${#[@]} 取得陣列的個數 ARG_ARRAY_LEN 後,

就可以利用這個數當索引值取得陣列的最後一個值 ARG_LAST,

也可以取得陣列中某段範圍的值成為一個新的陣列 ARGS_EXCEPT_LAST~

 

有了這個 script 之後,同樣要上傳檔案到遠端伺服器的話,就可以用下列指令,

不用再打落落長的 scp 和一堆參數囉:

./scp_to_server.sh file.txt file2.exe ~/

 

 

//
//

(本頁面已被瀏覽過 325 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料