Shell-Script

採用可變數量參數的 zsh 腳本

  • September 5, 2018

我剛剛(遲來)發現我可以 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語法變得更短、更優雅。

引用自:https://unix.stackexchange.com/questions/467011