0

この関数f()は非常に単純なはずですが、不可解な方法で機能します。

f() {
  a=(cyan red green blue orange violet)
  shopt -s extglob
  echo 1: -${a[@]/!($1)}-
  echo 2: -${a[@]/!($1)/}-
  echo 3: -${a[@]/!("$1")/}-
  echo 4: -"${a[@]/!($1)/}"-
  echo 5: -${a[@]/!($1)/x}-
}
echo ORANGE
f orange # ends in e like blue
echo YELLOW
f yellow

出力は次のとおりです(空白/スペースにも注意してください):

ORANGE
1: - e -
2: - e -
3: - e -
4: -    e -
5: -x x x x xe x-
YELLOW
1: - -
2: - -
3: - -
4: -     -
5: -x x x x x x-

なぜ求められる言葉の最後の文字だけ?! (この場合e)orange

期待される出力はorange、単なるものではなくe

注: また、空白が1 つある場所には、空白がないことも期待できます。

4

1 に答える 1

2

問題は、パターンが固定されていないことです。たとえば、orangeの場合、一致しない最長の文字列orangeは ですorang。したがって、それは削除され、そこにのみe残ります。bash でアンカーを指定する方法がないため、自分で作成する必要があります。

#! /bin/bash
f() {
    a=(cyan red green blue orange violet '1 2')
    a=("${a[@]/#/|}")
    a=("${a[@]/%/|}")
    shopt -s extglob
    echo ["${a[@]/|!($1)|/-}"]
}
echo ORANGE
f orange # ends in e like blue
echo YELLOW
f yellow
于 2013-03-15T11:10:55.560 に答える