[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 ~/
//
//
(本頁面已被瀏覽過 842 次)