`${!path//:/$'\n'}` $PATH を表示し、ディレクトリを改行で区切るためにパラメータ拡張を実行するには?

`${!path//:/$'\n'}` $PATH を表示し、ディレクトリを改行で区切るためにパラメータ拡張を実行するには?

${!path//:/$'\n'}次のシェル機能がどのように機能するか理解できません。

withの代わりにman bash使用することを見て検討しましたが、この場合拡張子は?また、スラッシュを1つではなく2つ使用するのはなぜですか?${parameter/pattern/string}:\n${!path//

pathprint () {
   if (($# == 0)); then
      set -- PATH
   fi
   for path; do
      echo "$path"
      echo "${!path//:/$'\n'}"
   done
}

最後に、以下の「単純化」が機能しないのはなぜですか?

pathprint () {
      echo "PATH"
      echo "${!PATH//:/$'\n'}"
   done
}

この場合、パラメータ拡張の前に拡張し、現在の値の名前を持つパラメータ$PATHがないと文句を言います。bash$PATH

答え1

for path; doNot指定されていますin。これは、位置引数を繰り返すことを意味します。何も指定せずに関数を呼び出すと、$#は0になり、$ 1は文字列に設定されますPATH

${!path}という変数の内容に展開されます$path。これは、関数への引数がパスではなく、印刷するパスを含む変数の名前であることを意味します。

//代わりに置換を使用すると、/パターン内のすべての項目が置き換えられます。単一のスラッシュは、最初に表示されるスラッシュのみを置き換えます。

関連情報