web-dev-qa-db-ja.com

シェルスクリプトでシフトを使用する目的は何ですか?

私はこのスクリプトに出くわしました:

#! /bin/bash                                                                                                                                                                                           

if (( $# < 3 )); then
  echo "$0 old_string new_string file [file...]"
  exit 0
else
  ostr="$1"; shift
  nstr="$1"; shift  
fi

echo "Replacing \"$ostr\" with \"$nstr\""
for file in $@; do
  if [ -f $file ]; then
    echo "Working with: $file"
    eval "sed 's/"$ostr"/"$nstr"/g' $file" > $file.tmp 
    mv $file.tmp $file
  fi  
done

shiftを使用する行の意味は何ですか?スクリプトは少なくとも引数を指定して使用する必要があると思いますので...?

134
Patryk

shiftbash組み込みで、引数リストの先頭から引数を削除します。スクリプトに提供された3つの引数が$1$2$3で使用できる場合、shiftを呼び出すと、$2が新しい$1になります。 shift 2は2つシフトし、新しい$1を古い$3にします。詳細については、こちらをご覧ください:

159

最も簡単な説明はこれです。次のコマンドを検討してください。

/bin/command.sh SET location Cebu
/bin/command.sh SET location Cebu, Philippines 6014 

shiftを使用しないと、ロケーションの完全な値を抽出できません。この値は任意に長くなる可能性があるためです。 2回シフトすると、次のような引数SETおよびlocationが削除されます。

x="$@"
echo "location = $x"

$@をじっと見つめてください。つまり、スペースとコンマがあっても、完全な場所を変数xに保存できます。したがって、要約すると、shiftを呼び出し、後で変数$@から残っている値を取得します。

[〜#〜] update [〜#〜]shiftの概念と有用性を示す非常に短いスニペットを以下に追加します。これがないと、抽出が非常に困難になりますフィールドを正しく。

#!/bin/sh
#

[ $# -eq 0 ] && return 0

a=$1
shift
b=$@
echo $a
[ -n "$b" ] && echo $b

説明shiftの後、変数bには、スペースなどに関係なく、渡される残りのものが含まれます。[ -n "$b" ] && echo $bは、コンテンツがある場合にのみbを出力する保護です。

3
typelogic

shiftコマンドライン引数をFIFOキューとして扱います。呼び出されるたびにpopleft要素になります。

array = [a, b, c]
shift equivalent to
array.popleft
[b, c]
$1, $2,$3 can be interpreted as index of the array.
$# is the length of array
2
Calculus