ゴルディロックスはコメントとしておよび人類の参照が記述し、
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 *
ます!これは、スクリプトを呼び出すユーザーの特権よりも高い特権でスクリプトを実行できる場合、大きな懸念事項です。たとえば、sudo
Webインターフェースを介して実行したり、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
参照)。