
$*
私は、入力を受け取り、与えられた文字列が接頭辞と接尾辞が付いたすべての要素に拡張される最も簡単な解決策を探しています。
$*=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}
$var
x
y
${array[@]/*/x\0y}
したがって、位置引数配列の場合:
print -r -- "${@/*/x\0y}"
(ただし、あなたと同様に、${*/#/x}
位置パラメータリストが空の場合はエラーが発生します。)
扱いにくい
zsh
ksh93
\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 "$@"
修正位置$@
(または$argv
in)(ここではそうではないと仮定)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
答え2
#!/bin/bash
echo $*
FIELDS=("${@/#/x}")
FIELDS=("${FIELDS[@]/%/y}")
echo "${FIELDS[*]}"
実行時間:
$ t.sh foo bar baz
foo bar baz
xfooy xbary xbazy
答え3
リストが与えられたら$@
...印刷してください
set -- foo bar baz
printf '%s\n' "$@"
foo
bar
baz
...リスト操作の実行
set -- $(printf 'x%sy ' "$@")
printf '%s\n' "$@"
xfooy
xbary
xbazy
...文字列化されたリスト
printf '%s\n' "$*"
xfooy xbary xbazy
特別なbash機能は含まれていません。