bashで配列の個数部分を変数で指定するとエラーに

このQ&Aのポイント
  • bashで配列の個数部分を変数で指定するとエラーになってしまいます。メッセージとしては、"bash: 29205 * ${#aa[*]} / 32768 : 構文エラー: オペランドが予期されます"と表示されます。
  • 具体的には、以下の箇所でエラーが発生しています。 mes="\${$i[$(( ${RANDOM} * 3 / 32768 ))]}" \$nのように指定すると、エラーが発生するため、正しい書き方を探していますが解決できていません。
  • 変数で配列の個数部分を指定する方法がわからないため、どなたかご教授いただけると助かります。
回答を見る
  • ベストアンサー

bashで配列の個数部分を変数で指定するとエラーに

bashで配列の個数部分を変数で指定するとエラーになってしまいます。 #!/bin/bash aa[0]="a0" aa[1]="a1" aa[2]="a2" bb[0]="b0" bb[1]="b1" bb[2]="b2" bb[3]="b3" cc[0]="c0" cc[1]="c1" cc[2]="c2" cc[3]="c3" cc[4]="c4" list=(aa bb cc) for i in ${list[@]} do eval echo "$i=\${#$i[*]}" n="\${#$i[*]}" mes="\${$i[$(( ${RANDOM} * 3 / 32768 ))]}" eval echo "$mes \${$i[$(( ${RANDOM} * 3 / 32768 ))]}" done $ . list-test.sh aa=3 a1 a2 bb=4 b2 b2 cc=5 c0 c2 上記の下記箇所の「各配列の個数部分の3」をイメージ的には変数で指定したいです。 mes="\${$i[$(( ${RANDOM} * 3 / 32768 ))]}" ↓ mes="\${$i[$(( ${RANDOM} * $n / 32768 ))]}" $nのように指定すると、下記のエラーになってしまいます。 >bash: 29205 * ${#aa[*]} / 32768 : 構文エラー: オペランドが予期されます (エラーのあるトークンは "${#aa[*]} / 32768 ") ${n}や\$nや($n)など色々試してみたのですが、解決できませんでした。 恥ずかしながら、どなた様かご教授ねがえませんでしょうか

  • taku0
  • お礼率80% (160/199)

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

n="\${#$i[*]}" ではなく、 eval n="\${#$i[*]}" では? bash -x list-test.sh で実行すると、どういうコマンドが実行されているのかわかります。

taku0
質問者

お礼

どんなコマンドが実行されているのか、 それをを知るのは重要ですね。 デバッグのやり方を教えて頂きありがとうございます。 そして、あわせて問題解決につながる助言も頂きありがとうございます。

関連するQ&A

  • 3つの連想配列を交互に代入して、新しい連想配列を作りたい

    PHP Version 5.1.6を使っています。 それぞれの連想配列を先頭から順番に交互に代入したいのですが、 どのようなプログラムでできるのでしょうか? $arr1 = array(a1=>"aa1", a2=>"aa2", a3=>"aa3"); $arr2 = array(b1=>"bb1", b2=>"bb2", b3=>"bb3"); $arr3 = array(c1=>"cc1", c2=>"cc2", c3=>"cc3"); 代入後 $new_arr = array(  a1=>"aa1",  b1=>"bb1",  c1=>"cc1",  a2=>"aa2",  b2=>"bb2",  c2=>"cc2",  a3=>"aa3",  b3=>"bb3",  c3=>"cc3", );

    • ベストアンサー
    • PHP
  • 目次設定時のナビゲーションウィンドウについて

    Word2010を使っています。 目次を設定すると、左側のナビゲーションウィンドウの見出しが2重で出てきてしまいます。 目次を設定していない状態のナビゲーションウィンドウは、 1.A 1.1.AA 2.B 2.1 BB 3.C 3.1 CC となっています。 ※1.は見出し1、1.1.は見出し2としています。 目次を追加した状態のナビゲーションウィンドウは、 1.A 4 1.1.AA 5 2.B 6 2.1 BB 7 3.C 8 3.1 CC 9 1.A 1.1.AA 2.B 2.1 BB 3.C 3.1 CC と2重にリストされてしまいます。 目次を追加しても、下記のようなナビゲーションウィンドウにする設定を教えてください。 1.A 1.1.AA 2.B 2.1 BB 3.C 3.1 CC 初歩的な質問で申し訳ありませんが、宜しくお願い致します。

  • シェルスクリプトについての質問です

    シェル(bash)で $ a=aa $ b=bb $ c=cc $ d=dd $ e=$a$b_$c$d $ echo $e としたとき出力が aaccdd となりました.自分では aabb_ccddとなることを期待していたのですが,なぜこのようなことになったのでしょうか? また, aabb_ccdd と出力させるにはどの様にすればいいのでしょうか.

  • 文字列配列のほしい部分だけを抜き出して数値にする方法(PIC)

    現在PICマイコンでPCからGPSの座標データを取得し,そのデータ列から必要な部分だけ抜き出す処理をくんでいるんですがうまくいきません。 pcとマイコンの接続はrs23-2c コンパイラはccsc pic:16f877 GPSデータ↓ @051125012151N3529558E13638533G009+00021E0000N0000D0003 このデータのN以降の「3529558」とE以降の「13638533」の文字列を数値にしたい。 delay_ms(300); output_b(0b00000001);//デバック用LED点灯 delay_ms(300); gets(mes);    //ここでGPSデータをmesに代入する output_b(0b00000011); len_N=0; for(i=0;i<58;i++){  if(mes[i]=='N'){   len_N=i;   break;  } } printf("\r\n"); n=atoi(mes[len_N+1]); //ここで試しに一文字分だけ数値にする処理を行ったが処理が停止する。 printf("n:%ld",n); アドバイスお願いします

  • 正確に複製を作りたい

    以下、変数のコピーで悩んでいます。 test()関数内で、正しく引数のコピーができるようにしたいのですが どうすればよいのでしょうか? int pa[50]; int pb[30][2]; int pc = 10; test(&pa, &pb, pc); void test(const int a[], const int b[][2], int c){ int aa[100]; int bb[20][2]; int cc; cc = c; // これはわかります。 aa = a; // ? 1 memcpy(aa, a, sizeof(a)); // ? 1 // aのサイズが50とわかっている場合 for (int i=0; i < 50; i++){ aa[i] = a[i]; } // bと同じ内容をbbに入れたい場合? }

  • C言語のsscanf関数の上手な使い方2

    質問NO.60489の追加です。 C言語で、 char buf[256] = "\"aa, aa\",100,\"bb bb\",200,\"cc-cc\"; char c1[10],c2[10],c3[10]; int i1,i2; のとき、 c1 = "aa, aa" c2 = "bb bb" c3 = "cc-cc" i1=100 i2=200 に読み込みたいのですが、 sscanf(buf,"\"%[^\"]\",%d,\"%[^\"]\",%d,\"%[^\"]\"",c1,i1,c2,i2,c3); では失敗します。 sscanfのformat部分をどのように書いたらよいか分かりません。

  • sscanfの使い方について

    char *str = ./aa...a/b..bb/cc..c/d...dd.txt"; の aa...a , b..bb , cc..c , d...dd を取り出したいのですが sscanf(str,"./%s/%s/%s/%s.txt",a,b,c,d); とすると,aだけにすべての文字列が入ってしまい,他のb,c,dには何も入りません. つまり.a = "aa...a/b..bb/cc..c/d...dd.txt" となります. a,b,c,dはいずれも char a[512],b[512],c[512],d[512] となっております. 取り出すうまい方法がありましたら教えてください.

  • アクセスで同じ種類のものを横に並べたい

    お世話になります。 アクセスでデータを取り込んだデータをエクセルで吐き出す為、横に並べたいと思っています。 種類 品物 a  aa-1 a  aa-3 a  aa-5 b  bb-3 c  cc-1 c  cc-2 上記のようなデータを 種類 品物1   品物2   品物3  a  aa-1    aa-3    aa-5  b  bb-3  c  cc-1    cc-2 というようにクロス集計をしたいと思っています 品物1 品物2 品物3にあたる列見出しをどのようにしたら良いか分かりません。 種類ごとにカウントでくる関数ってありますでしょうか? よろしくお願いします。

  • 3テーブル外部結合方法について

    3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・

  • エクセルで、規則性はあるのですが、数字と文字が混在しているものを重複しないように抽出したいのですが。

    エクセルで、シート1に列A(数値)と列B(文字列)を結合したものが、 列C(列A&列B)であります。 これをシート2で列Cの文字列が重複しないように抽出したいのです が、どうしたらよいのでしょうか? シート1     列A  列B  列C 行1  項目A 項目B 項目C 行2  2   CC  2CC 行3  3   AA  3AA 行4  5   BB  5BB 行5  7   PP  7PP 行6  2   CC  2CC 行7  5   AA  5AA これをシート2で、     列C 行1  項目A 行2  2CC 行3  3AA 行4  5BB 行5  5AA 行6  7PP このように重複するものを統合した形でまとめたいのですが、 わかるかたがいれば教えてもらえないでしょうか?