7

bash 配列から 1 つのキーワードの最初の出現だけを削除しようとしています。

ARRAY=(foo bar and any number of keywords)
keywords=(red, rednet, rd3.0)

次のようにキーワードを削除します。ARRAY=( ${ARRAY[@]/"$keyword"/} )「red」が最初に見つかったキーワードである場合、両方のキーワードから「red」が削除され、「foo bar rednet」ではなく「foo bar net」が返されます。

編集:これは例です。うまくいけば、これでより明確になります。

for keyword in ${ARRAY[@]}; do
      if [ "$keyword" = "red" ] || [ "$keyword" = "rd3.0" ] || [ "$keyword" = "rednet" ]; then
           # HERE IS TROUBLE
           ARRAY=( ${ARRAY[@]/"$keyword"/} )
           echo "ARRAY is now ${ARRAY[@]}"
           break
      fi
 done

がrednet rd3.0 の代わりにnet rd3.0ARRAY=(red rednet rd3.0)を返す場合

unset を使用するunset ${ARRAY["$keyword"]}と、: rd3.0 が配列内にある場合、bash は不平を言います: 配列:syntax error: invalid arithmetic operator (error token is ".0") から完全に一致するものだけを設定解除または削除する安全な方法は何ですか?

4

2 に答える 2

9

次のようunsetに、配列値をで指定してコマンドを使用します。index

#!/usr/bin/env bash
ARRAY=(foo bar any red alpha number of keywords rd3.0 and)
keywords=(red, rednet, rd3.0)

index=0
for keyword in ${ARRAY[@]}; do
      if [ "$keyword" = "red" ] || [ "$keyword" = "rd3.0" ] || [ "$keyword" = "rednet" ]; then
           # HERE IS TROUBLE
           # ARRAY=( ${ARRAY[@]/"$p"/} )
           unset ARRAY[$index]
           echo "ARRAY is now: ${ARRAY[@]}"
           break
      fi
      let index++
 done
于 2013-01-10T22:09:39.950 に答える
0

まず、配列内のキーを引用符で囲む必要があります。これにより、たとえばrd3.0の問題を回避できます。

そのように:

ARRAY=("foo" "bar" "and" "any" "number" "of" "keywords")
keywords=("red", "rednet", "rd3.0")

私の意見では、配列をコピーしてから、forループを使用してキーワードをフィルタリングする必要があります。最初のフィルタリングが成功した後、forループを終了します。その後、空の配列要素なしでコピーして戻します。この短い例(段落10)を参照してください。

アレイの詳細:http://tldp.org/LDP/abs/html/arrays.html(必要なものすべて)

于 2013-01-10T20:52:44.787 に答える