シェルの $* の各要素に文字列を追加します。

シェルの $* の各要素に文字列を追加します。

$*私は、入力を受け取り、与えられた文字列が接頭辞と接尾辞が付いたすべての要素に拡張される最も簡単な解決策を探しています。

$*=foo bar baz
<solution(x,y)>=xfooy xbary xbazy

前に追加または追加できますが、どちらも実行できません。

echo ${*/#/x}
# prints xfoo xbar xbaz
echo ${*/%/y}
# prints fooy bary bazy

これら2つのソリューションを組み合わせることはできません。これ文書パラメータ=*の場合、拡張子によって返された値はリストと呼ばれますが、これを使用することはできません。結果の値の配列を追加のコマンドに別々の引数として渡したいので、単に単一の文字列を作成するだけでは機能しません。

ベストアンサー1

${var/pattern/replacement}zshは ksh93 パラメータ拡散演算子であり、 でサポートされていますが、mkshいくつbashかのバリエーションがあります(mksh現在の配列では動作しません)。

クッシュ 93

では、 with プレフィックスと接頭辞 with with を貼り付けて、配列の各要素に対してこれを行うksh93必要があります。${var/*/x\0y}$varxy${array[@]/*/x\0y}

したがって、位置引数配列の場合:

print -r -- "${@/*/x\0y}"

(ただし、あなたと同様に、${*/#/x}位置パラメータリストが空の場合はエラーが発生します。)

扱いにくい

zshksh93\0置換文字列を一致させるためにsを呼び出すのと同等ですが、パターンで使用する$MATCH場合にのみ適用されます(これにはオプションが必要です)。(#m)extendedglob

set -o extendedglob
print -r -- "${@/(#m)*/x${MATCH}y}"

ただし、zshパラメータ拡張をネストできるため、次のこともできます。

print -r -- ${${@/#/x}/%/y}

$^arrayその配列拡張を開く演算子を使用することを好むかもしれませんが、中rcexpandparamかっこ拡張のように動作します。

print -r -- x$^@y

または、次のものを使用できます。

printf -v argv x%sy "$@"

修正位置$@(または$argvin)(ここではそうではないと仮定)zsh"$@"空のリスト)。

強く打つ

bashシェルでは、次のように中間配列を使用して2つのステップでこれを行う必要があります。@L.ScottJohnsonを表示、または$@その場で修正:

set -- "${@/#/x}"
echo -E "${@/%/y}"

(この場合、プレフィックス(xこの場合)はで始まらないと仮定します-。)

POSIXとして

ループを使用して、位置パラメータを内部で変更できます。

for i do
  set -- "$@" "x${i}y"
  shift
done
echo "$@"

(ただし、echoバックスラッシュ文字を含む、またはで始まる任意のデータを表示するために移植的に使用することはできません-。)

ノート

$*引数拡張形式(引用時にのみ有用)は、次の形式であることに注意してください。つながる位置パラメータ(デフォルトの$IFS最初の文字はSPCです)$@すべての位置パラメータを区切られたパラメータに拡張する必要があります(再引用)。$*引用符がなく(空でない位置引数に拡張しない$@限り)、ほとんど意味がありません。なぜなら、分割+グローブの影響を受けてシェル間で異なる動作をするからです。zsh

おすすめ記事