シェル組み込みコマンド「shift」の実際の使い方は何ですか?

シェル組み込みコマンド「shift」の実際の使い方は何ですか?

シェルスクリプト/usr/bin/ssh-copy-idopenssh-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 2shiftオプションパラメータを削除してください。その後、各オプションが処理された後に処理される次の引数は常にです$1。この方法ははるかに簡単です。

if [ "$1" = "-i" ]; then
  shift 2
fi
target_host_name=$1

おすすめ記事