単一変数に対してパターン置換が機能しないのはなぜですか?

単一変数に対してパターン置換が機能しないのはなぜですか?

以下の議事録をご覧ください。

$ mkdir temp
$ cd temp/
$ touch file{1..5}
$ ls
file1  file2  file3  file4  file5
$ SRC=file; TGT=ram
$ for f in file* ; do mv $f ${f/$SRC/$TGT} ; done
$ ls
ram1  ram2  ram3  ram4  ram5
$ PAT=ram/file
$ for f in ram* ; do mv $f ${f/$PAT} ; done
mv: 'ram1' and 'ram1' are the same file
mv: 'ram2' and 'ram2' are the same file
mv: 'ram3' and 'ram3' are the same file
mv: 'ram4' and 'ram4' are the same file
mv: 'ram5' and 'ram5' are the same file

SRCとを別の変数として指定するとパターン置換が機能しますTGTが、単一変数として指定するとパターン置換が機能しないのはなぜですかPAT

私が理解したところによれば、置換は内側から外側に処理されるので、外部中括弧内の文字列は、またはf/$SRC/$TGTf/$PAT同じように処理され、再処理され、実際の新しいファイル名を提供する必要があります。しかし、明らかにこれはそうではありませんでした...f/file/ramf/ram/file

最新のアップデートを含むKubuntu Bionic LTSでBash 4.4.18を使用しています。

ベストアンサー1

~からバッシュマニュアル:

${parameter/pattern/string}
patternファイル名拡張と同様に、パターンを生成するために拡張されます。 [...] stringnull の場合、一致patternは削除され、/次のパターンを省略できます。

したがって、拡張後のパターンを識別して置き換えるプロセスではありません。代わりに、まずパターンを特定し、部品を交換してからそれから拡張されました。では${f/$PAT}全体が$PATパターンになり、何も置き換えられない。

おすすめ記事