${!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; do
Not指定されていますin
。これは、位置引数を繰り返すことを意味します。何も指定せずに関数を呼び出すと、$#は0になり、$ 1は文字列に設定されますPATH
。
${!path}
という変数の内容に展開されます$path
。これは、関数への引数がパスではなく、印刷するパスを含む変数の名前であることを意味します。
//
代わりに置換を使用すると、/
パターン内のすべての項目が置き換えられます。単一のスラッシュは、最初に表示されるスラッシュのみを置き換えます。