0

"$consC"スペースと's を含む二重引用符で囲まれた文字列で*は、次のようになります。

                                            * **** *****       

各 のインデックスを取得するにはどうすればよい*ですか?

4

1 に答える 1

1

総当たり、無知、およびbash(4.x または 3.x — ただし、/bin/shorとして呼び出された場合は除く — レンガの壁shにぶつけて頭が痛いsh) を使用して、次のことを試すことができます。

$ for i in $(seq 0 ${#consC}); do [ "${consC:$i:1}" = "*" ] && echo "$i [${consC:$i:1}]"; done
44 [*]
46 [*]
47 [*]
48 [*]
49 [*]
51 [*]
52 [*]
53 [*]
54 [*]
55 [*]
$

あなたはそれを改善することができます: $(seq 0 $((${#consC}-1)) )、これは配列の終わりをオーバーシュートしませんが、さらに簡潔に不可解です — Perl はあなたの心を食い尽くします!

もっと良い方法があると思います。

(明らかに、 を正確にどのように設定したかによってconsC、出力でわずかに異なる数値が得られる場合があります。)

注: これは Mac OS X 10.8.4 でテストされましたが、自作のbash4.2 が利用可能です (bashほとんどの場合 3.2.48 を使用しているため、頭痛の種です)。を使用できずbash、 しかない場合は、次のものに置き換える必要がshあります。"${consC:$i:1}""$(expr "$consC" : '^.\{'"$i"'\}\(.\)')"

$ for i in $(seq 0 ${#consC}); do [ "$(expr "$consC" : '^.\{'"$i"'\}\(.\)')" = '*' ] && echo $i; done
44
46
47
48
49
51
52
53
54
55
$

または、[[演算子と 2 つ少ない二重引用符を使用します。

$ for i in $(seq 0 ${#consC}); do [[ $(expr "$consC" : '^.\{'"$i"'\}\(.\)') = '*' ]] && echo $i; done
44
46
47
48
49
51
52
53
54
55
$

[...さまざまな理由から、先史時代にまでさかのぼり、私のシェルは、/bin/sh実行するために取り外せたと思っていたにもかかわらず、取り残されていました/bin/bash...私は今、その問題を修正しました! /bin/bash結局のところ、私は実行しています...そして、 3.2.48exprで問題なく動作する元のバージョンはありません。bash

于 2013-08-27T02:40:16.093 に答える