1

自分のやりたい仕事を手に入れるのは難しいようです。基本的に、いくつかの引用符と \ 文字を含む文字列が割り当てられた一連の変数があります。json は python ダンプ メソッドを使用した引用符を嫌うため、引用符を削除して json doc 内に埋め込みたいと考えています。

簡単だと思いました。文字を簡単に削除する方法を決定し、変数置換用の単純な for ループを作成するだけで、うまくいきませんでした。

これが私がやりたいことです。

「MESSAGE23」という変数があり、次の「com.centrify.tokend.cac」が含まれています。引用符を削除したいのですが、これは私にとって簡単で単純なecho $opt | sed "s/\"//g". コマンドラインからこれを行うと:

$> MESSAGE23="com."apple".cacng.tokend is present"
$> MESSAGE23=`echo $MESSAGE23 | sed "s/\"//g"`
$> com.apple.cacng.tokend is present

これは機能します。適切にフォーマットされた文字列を取得します。

次に、これをループに投げ込もうとすると、すべての地獄が解き放たれます。

for i to {1..25}; do
   MESSAGE$i=`echo $MESSAGE$i | sed "s/\"//g"`
done

これは機能しません (インデックスの束をスローするか、何もスローしません)。私は、またはその他の bash 置換変数について十分に知らないだけだと確信していargますeval

しかし、基本的には、同じ問題を抱えた別の変数セットに対してこれを実行したいと考えています。そこでは、引用符と、ついでに "\" も削除します。

どんな助けでも大歓迎です。

4

2 に答える 2

3

そんなことはできません。を使用して動作させることもできevalますが、それでは心配しなければならない別のレベルの引用が導入されます。配列を使用できない理由はありますか?

MESSAGE=("this is MESSAGE[0]" "this is MESSAGE[1]")
MESSAGE[2]="I can add more, too!"
for (( i=0; i<${#MESSAGE[@]}; ++i )); do
   echo "${MESSAGE[i]}"
done

それ以外の場合は、次のようなものが必要です。

 eval 'echo "$MESSAGE'"$i"'"'

そこから悪化するだけです。

于 2013-03-28T00:19:04.597 に答える
1

まず、いくつかの予備的な問題MESSAGE23="com."apple".cacng.tokend is present" があります。変数値に二重引用符を埋め込まず、代わりにMESSAGE23="com.\"apple\".cacng.tokend is present"orを使用します。第二に、変な構文解析を防ぐためにMESSAGE23='com."apple".cacng.tokend is present'、ほとんどの場合、変数展開 (例: ) を二重引用符で囲む必要があります。echo "$MESSAGE23"

ここで、本当の問題: シェルは代入の左側での変数置換を許可していません (つまり、機能しMESSAGE$i=somethingません)。幸いなことに、これはdeclareステートメントで許可されているため、代わりにそれを使用できます。また、 が$MESSAGE$i置換されると、 の値の$MESSAGE後にの値が続き$iます。これには、間接展開 (`${!metavariable}') を使用する必要があります。

for i in {1..25}; do
    varname="MESSAGE$i"
    declare $varname="$(echo "${!varname}" | tr -d '"')"
done

tr( の代わりにも使用したことに注意してください。ただしsed、それは私の個人的な好みです。)

(また、@Mark Reedの配列の提案は、この種のことを行うためのより良い方法であることに注意してください。)

于 2013-03-28T00:48:43.783 に答える