"$consC"
スペースと's を含む二重引用符で囲まれた文字列で*
は、次のようになります。
* **** *****
各 のインデックスを取得するにはどうすればよい*
ですか?
総当たり、無知、およびbash
(4.x または 3.x — ただし、/bin/sh
orとして呼び出された場合は除く — レンガの壁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 でテストされましたが、自作のbash
4.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