ゴルディロックスはコメントとしておよび人類の参照が記述し、
shift(位置パラメータを再割り当て$1、$2など、)それはとても$1古い値をとる$2、
$2の値をとる$3など、*
の古い値は$1破棄されます。($0変更されていません。)これを行う理由には次のものがあります。
- 10番目の引数(ある場合)に簡単にアクセスできます。
$10動作しません$1-aと連結されていると解釈されます0
(したがって、のようなものが生成される可能性がありますHello0)。の後shift、10番目の引数はになり$9ます。(ただし、最近のほとんどのシェルでは、を使用できます${10}。)
- 初心者のためのバッシュガイドが実証し、それは引数をループに使用することができます。IMNSHO、これは不器用です。
forそのためにはるかに優れています。
- サンプルスクリプトのように、いくつかの引数を除いて、すべての引数を同じ方法で簡単に処理できます。たとえば、スクリプトでは、
$1および$2はテキスト文字列であり$3、その他のすべてのパラメーターはファイル名です。
だから、ここでそれがどのように展開するかです。スクリプトが呼び出されPatryk_script、次のように呼び出されるとします
Patryk_script USSR Russia Treaty1 Atlas2 Pravda3
スクリプトは見る
$1 = USSR
$2 = Russia
$3 = Treaty1
$4 = Atlas2
$5 = Pravda3
このステートメントostr="$1"は、変数ostrをに設定しますUSSR。最初のshiftステートメントは、位置パラメーターを次のように変更します。
$1 = Russia
$2 = Treaty1
$3 = Atlas2
$4 = Pravda3
このステートメントnstr="$1"は、変数nstrをに設定しますRussia。2番目のshiftステートメントは、位置パラメーターを次のように変更します。
$1 = Treaty1
$2 = Atlas2
$3 = Pravda3
そして、forループ変化USSR($ostrへ)Russia($nstrファイル内)Treaty1、Atlas2とPravda3。
スクリプトにはいくつかの問題があります。
$ @のファイル用。行う
スクリプトが次のように呼び出された場合
Patryk_scriptソ連ロシア条約1 "世界地図2" Pravda3
見える
$ 1 =ソ連
2ドル=ロシア
3ドル=条約1
4ドル= World Atlas2
5ドル= Pravda3
ので、しかし、$@引用されていない、中にスペースがWorld Atlas2引用されず、forループが、それは4つのファイルを持っていると考えて:Treaty1、World、Atlas2、とPravda3。これは
「$ @」のファイルの場合。行う
(引数内の特殊文字を引用するため)または単に
ファイルのために
(これは長いバージョンと同等です)。
eval "sed 's /" $ ostr "/" $ nstr "/ g' $ file"
これをにする必要はありません。evalチェックされていないユーザー入力をに渡すevalことは危険です。たとえば、スクリプトが次のように呼び出された場合
Patryk_script "'; rm *;'"ロシア条約1 Atlas2 Pravda3
実行されrm *ます!これは、スクリプトを呼び出すユーザーの特権よりも高い特権でスクリプトを実行できる場合、大きな懸念事項です。たとえば、sudoWebインターフェースを介して実行したり、Webインターフェースから呼び出したりできる場合。ディレクトリ内で自分自身として使用する場合は、おそらくそれほど重要ではありません。しかし、それはに変更することができます
sed "s / $ ostr / $ nstr / g" "$ file"
これにはまだいくつかのリスクがありますが、それほど深刻ではありません。
if [ -f $file ]、> $file.tmpおよびmv $file.tmp $file
はif [ -f "$file" ]、スペース(またはその他の面白い文字)が含まれる可能性のあるファイル名を処理するために、それぞれ、およびである必要が> "$file.tmp"ありmv "$file.tmp" "$file"ます。(このeval "sed …コマンドは、スペースを含むファイル名もマングルします。)
* shiftオプションの引数を取ります。シフトするパラメーターの数を指定する正の整数です。デフォルトは1(1)です。たとえば、shift 4原因$5
になる$1、
$6になる$2、など。(初心者向けBash Guideの例は間違っていることに注意してください。)そして、あなたのスクリプトは、
ostr="$1"
nstr="$2"
shift 2
より明確であると考えられるかもしれません。
終了ノート /警告:
Windowsコマンドプロンプト(バッチファイル)言語は、UnixシェルSHIFTのshiftコマンドと基本的に同じことを行うコマンドをサポートしますが、1つの顕著な違いがあります。
- のようなコマンド
SHIFT 4はエラーであり、「SHIFTコマンドのパラメーターが無効です」というエラーメッセージが表示されます。
SHIFT /n、ここnで0〜8の整数は有効ですが、時間はシフトしません。それは、一度シフトで始まるN 番目の引数。したがって 、(5番目の引数)がになるなど、引数0から3だけが残ります。n SHIFT /4%5%4,
%6%5
pushdおよびをpopd参照)。