可変数の引数を取るzshスクリプト

可変数の引数を取るzshスクリプト

あるコンピュータから別のコンピュータにssh -tを使用してコマンドを実行できることを発見しました。

その後、次のタスクを実行して、コンピュータのログファイルを一対で追跡するスクリプトを作成できる必要があると思いました。

ssh -t $1 ssh -t $2 tailf /pathtofile/$3/log.log

実際に1,2,3を手動で入力すると正常に動作します。

私の問題は、これを行うには1、2、または3つのホスト間を移動する必要があるかもしれません。

zshでどうすればいいですか?ちょっと掘り下げてみると変身が私の友達のようですが少し混乱します。

ベストアンサー1

私は実際のユーザーではないので、ソリューションzshを作成しますshzsh しなければならない実行も可能です)

一般的なポイントは、ssh -t hostname最後の項目を除く各コマンドラインオプションに対して1ビットのリストを作成し、そのリストをコマンドとして実行することです。

#!/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特定の構文を使用すると、このコンテンツをより短くてエレガントにすることができると確信しています。

おすすめ記事