私はこのスクリプトに出くわしました:
#! /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
を使用する行の意味は何ですか?スクリプトは少なくとも引数を指定して使用する必要があると思いますので...?
shift
はbash
組み込みで、引数リストの先頭から引数を削除します。スクリプトに提供された3つの引数が$1
、$2
、$3
で使用できる場合、shift
を呼び出すと、$2
が新しい$1
になります。 shift 2
は2つシフトし、新しい$1
を古い$3
にします。詳細については、こちらをご覧ください:
最も簡単な説明はこれです。次のコマンドを検討してください。
/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を出力する保護です。
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