Shell-Script
採用可變數量參數的 zsh 腳本
我剛剛(遲來)發現我可以 ssh -t 從一台機器到另一台機器並在那裡執行命令。
然後我想到我應該能夠想出一個腳本,通過執行類似的操作來跟踪機器上的日誌文件(來自一對)
ssh -t $1 ssh -t $2 tailf /pathtofile/$3/log.log
事實上,如果我手動輸入 1,2 和 3,效果就很好。
我的問題是我可能需要 1,2 或 3 台主機來完成這項工作。
我將如何在 zsh 中執行此操作?我已經進行了一些探勘,看起來 shift 可能是我的朋友,但我有點迷茫。
由於我不是真正的
zsh
使用者,因此我將編寫一個sh
解決方案(zsh
也應該能夠執行它)。一般的要點是為每個命令行選項(除了最後一個選項)創建一個包含一位的列表
ssh -t hostname
,然後將該列表作為命令執行。#!/bin/sh argn=$# i=0 for arg do shift i=$(( i + 1 )) if [ "$i" -lt "$argn" ]; then set -- "$@" ssh -t "$arg" else set -- "$@" "/pathtofile/$arg/log.log" fi done command "$@"
執行這個
sh script.sh alpha beta gamma zeta
它會創建列表
ssh -t alpha ssh -t beta ssh -t gamma /pathtofile/zeta/log.log
腳本中的最後一個命令會將其作為命令執行。
該列表是內置的
$@
,位置參數列表,在腳本的開頭包含腳本的命令行參數。循環跟踪該原始列表的最後一個元素何時遇到並對其進行特殊處理。該
set
命令在如上使用時將附加到列表中,shift
並將刪除列表的第一個元素(我們目前正在處理的元素)。我相信這可以通過特定的
zsh
語法變得更短、更優雅。