2017-11-20 6 views
0

この部分でこのスクリプトが行っていることを正確に把握しようとしています。Bash f //表記法?

for f in $FILES 
do 
    ORIGINAL_FILE=${f//$FILE_PATH/} 

これは、後に差分文で使用されます。

DIFFER=`diff $f $REPOS_PATH/$ORIGINAL_FILE` 

正確にダブルスラッシュ(//)とは何ですか?それは 'f'が上記の変数か他の何かですか?

答えて

3

${…}は、parameter expansionです。変数名の後の句読点によって決定される多くのパラメータ拡張のバリエーションがあります。 ${f//$FILE_PATH/}は、$FILE_PATHに一致するすべての部分文字列(つまりパターンは変数FILE_PATHの値です)が空の文字列に置き換えられたfの値です。

スクリプト内でその後に来るものを考えると、それは下手に書かれています:はっきり$FILE_PATHfの値の先頭になると予想されており、交換が

ORIGINAL_FILE=${f#"$FILE_PATH"} 

また、そのスクリプトは、いくつかのダブルが欠落しているべきです引用符は、it will break with paths containing spaces and other special charactersです。

+0

いいえ、これは '$ {f/$ FILE_PATH /}' – ddbug

+3

@ddbugではありません。最初のマッチは '$ {f/$ FILE_PATH /}'ではありません。変数名の後に2つのスラッシュを付けると、すべてのオカレンスが置き換えられます。 – Gilles

+1

スクリプトは二重引用符を欠いていないので、ファイル名のスペース区切りリストに展開するために壊れやすい '$ FILES'に頼っているほどです。 – chepner

関連する問題