シェルスクリプト/usr/bin/ssh-copy-id
(openssh-client
少なくともDebianではパッケージの一部)を確認しましたが、次のifステートメントが含まれています。
if [ "-i" = "$1" ]; then
shift
# check if we have 2 parameters left, if so the first is the new ID file
if [ -n "$2" ]; then
if expr "$1" : ".*\.pub" > /dev/null ; then
ID_FILE="$1"
else
ID_FILE="$1.pub"
fi
shift # and this should leave $1 as the target name
fi
else
コマンドのポイントは何ですかshift
?私は、shift n
シェル組み込みが引数のn
数を左から右に移動することを知っていますが、このスクリプトでそれを使用するのはなぜですか?なぜ使用しないのですか:
if [ "-i" = "$1" ]; then
if [ -n "$3" ]; then
if expr "$2" : ".*\.pub" > /dev/null ; then
ID_FILE="$2"
else
ID_FILE="$2.pub"
fi
fi
答え1
オプションを分析した-i
後に何をしますか?解析するパラメータがあります。最初のパラメーターの場合は、-i
それを処理した後に3番目のパラメーターを確認する必要があります。ssh-copy-id
見ている以前のバージョンでは-i
この唯一のオプションであり、次のパラメータはターゲットホスト名でした。渡されない場合、-i
ターゲットホスト名は最初の引数です。
if [ "$1" = "-i" ]; then
…
target_host_name=$3
else
target_host_name=$1
fi
オプションが複数ある場合は拡張されません。パラメータリストで現在の場所を追跡する必要があります。
if [ "${$position}" = "-i" ]; then
…
position=$((position+2))
fi
target_host_name=${$position}
問題は、私がここに書いているものが有効なシェル構文ではないということです。 n番目の引数を取得する単純な構成はありません。eval
ただし、これは厄介で、アンティークシェルは複数桁の引数番号を処理できません。
したがって、オプションが処理されるたびにを呼び出してリストから削除されますshift
。オプションにパラメータがある場合は、電話をかけるか再呼び出ししshift 2
てshift
オプションパラメータを削除してください。その後、各オプションが処理された後に処理される次の引数は常にです$1
。この方法ははるかに簡単です。
if [ "$1" = "-i" ]; then
…
shift 2
fi
…
target_host_name=$1