• ベストアンサー

SHELLの変数代入について

変数名に変数を使うとエラーになるのですが、 変数名に変数を入れることは可能なのでしょうか? #!/bin/sh #関数の初期化 for i in 0 1 2 3 4 5 6 7 8 do kannsuu${i}=0 done #終わり OS:solaris10 よろしくお願いします

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

  • ベストアンサー
  • ken-etsu
  • ベストアンサー率46% (55/119)
回答No.1

> kannsuu${i}=0 を > eval "kannsuu${i}=0" とすべし。

R_nisimura
質問者

お礼

お礼が遅れてすみません。 ありがとうございます。 助かりました。

関連するQ&A

  • shellで$入り変数に値を代入する方法

    shellで、変数への代入処理で困っています。 下記サンプルソースのように代入する変数自体にfor文で使用している変数が含められるようにしたいのですが、下記の通りだと実行できません。 うまく意図通りに動かす方法はございませんでしょうか? ---------------------------------------------------------------- #!/bin/sh #変数初期化 n00=0 n01=1 n02=2 n03=3 n04=4 #メインルーチン for i in 00 01 02 03 04 ; do temp=`eval echo '$'"n"${i}` #変数値をtempに格納 n${i}=`expr ${temp}+1` #各変数の値を+1する。 n${i}の部分をどのようにすればよいか不明 done ---------------------------------------------------------------- # 望ましい結果 echo ${n00} -> 1 echo ${n01} -> 2 : ※制約事項 ・ shのみ使用可能で、ksh,csh.bashは使用不可 ・ n[0]=0,n[1]=1・・・というように配列の使用は無し

  • 【シェル】while文の変数定義について

    OS:Solaris10 sh:Bシェル お世話になります。 シェルの冒頭で定義した変数をwhile文の中で読み込ませたいです。 現状のシェルは下記の通りです。 ---- #!/bin/sh # *** 変数定義 *** AAA1=Spring BBB1=Summer AAA2=Autumn BBB2=Winter # *** メイン処理 *** i=1 while [ $i -le 2 ]; do AAA=AAA$i BBB=BBB$i echo ${AAA} echo ${BBB} i=`expr $i + 1` done ---- しかし、出力される結果は下記のようになってしまいます。 AAA1 BBB1 AAA2 BBB2 これを冒頭の「*** 変数定義 ***」で定義した値を読み込ませ、下記のような出力結果を得たいです。 Spring Summer Autumn Winter どうかご教授ください。

  • awk外で宣言した変数の参照

    kshを使用して、以下のようなシェルを作成しています。 しかしawk内で$iと$iiが参照出来てない様子です。 どのようにすれば参照できますでしょうか。 ■シェルの中身 #/usr/bin/ksh for i in `cat /tmp/hoge |awk -F : '{ print $3 }' | sort | uniq -d` do if [ $i != "" ]; then for ii in `cat /tmp/hoge` do echo $ii |awk -F ":" '{ if ( $3 -eq $i ) print $ii }' done fi done ■エラー awk: 0602-562 フィールド $() が正しくありません。 入力の行番号は 1 です。 ソースの行番号は 1 です。

  • bシェルでシェル変数に変数に代入されている値の個数

    bシェル(Bourneシェル)で、シェル変数に変数に代入されている 値の個数を知りたいのですが、できるのでしょうか。 ----- #!/bin/sh A="1 2 3 4 5" echo $A 変数Aには、半角スペース区切りで、「1 2 3 4 5」と5個の値が 代入されています。 この設定されている値の個数、5を求めたいのですが、 どうすればよいのでしょうか。 Solaris8 Bシェル です。

  • bashで変数を可変させたい

    /homeの中にあるフォルダaaa、bbb、cccのサブフォルダの容量を取得し、結果をそれぞれ、 /root/batchの中にaaa、bbb、cccというファイル名で出力。 そのファイルをcatで出力し、結果をmbox_#(#は数字)という変数に保存するバッチを作成したいと四苦八苦しながら作業を行なっております。 バッチを実行しますと、以下のようなエラーが出力されます。 ./abcde.sh: line 16: mbox_1=62: command not found ./abcde.sh: line 16: mbox_2=1: command not found ./abcde.sh: line 16: mbox_3=1: command not found mbox_#の#を可変させたいのですが、何か良い記述方法はございますでしょうか? ==以下バッチ内容== #!/bin/sh Path1=/home Path2=/root/batch n=0 for box in aaa bbb ccc do n=$[$n+1] for var in `ls $Path1/$box` do du -sm $Path1/$box/$var >> $Path2/$box done 'mbox_'$n=`cat $Path2/$box` done お手数をおかけしますが、宜しくお願い致します。

  • シェルスクリプト:while文のリダイレクトはサブシェルで実行されますか

    日頃Linuxを使用している者です。手元にSolaris環境がなく検証できないためSolaris使いの方にお伺いさせてください。 お聞かせいただきたいことは次の一点です。 Q. Solaris8,9,10 のBourneShellは従来どおり、while文でリダイレクトを使ったときは、サブシェルでまわりますか? 上記質問に至った簡単な経緯を申し上げます。 実は、Linuxの/bin/ash(BourneShell相当)スクリプトで while文でリダイレクトしたところ、ループ内の変数がwhileの外でも参照できました。本来BourneShellの場合、当ケースでのループはサブシェルで回るはずですよね。 最近のGNU BASHを始め、ASHもfor,whileのりダイレクトを使ったループもカレントシェルで動作するということでしょうか? そこで、SolarisのSHはどうなのかと思った次第です。以上宜しくお願いします。 p.s. HP-UX, AIXのSHについても情報があればありがたいです。 参考までに、Linux上の実例を記します。 ■test.ash #!/bin/ash n=0 while read line do i=`expr $i + 1` echo "$i: $line" done < $0 echo "total line= $i" ■実験してみる > ./test.ash 1: #!/bin/ash 2: 3: i=0 4: while read line 5: do 6: i=`expr $i + 1` 7: echo "$i: $line" 8: done < $0 9: echo "total line= $i" total line= 9 ← しっかりインクリメントされた変数見れてるし。最近の仕様?

  • shell 変数について

    お世話になっております。 たびたびすみません。 shellプログラミングで質問です。 以下のようなプログラムを作成したところ、 引数に2147483648以上の数値を与えて実行すると 変数に代入される値が-マイナスとなり、 おかしくなってしまいます。 シェル変数の上限は2147483647なのでしょうか? だとしたら、これ以上の数値を代入することはできないのでしょうか。 お手数ですが、よろしくお願いいたします。 #!bin/sh firstno=$1 echo "do you make a file?(y/n)" read ans if [ $ans = "y" ]; then sed -e 's/AAA/aaa/' aaa.csv >> aaaaaa.csv firstno=`expr $firstno + 1` echo "next no is \"$firstno\"" fi

  • コマンド

    以下のシェルスクリプトをパイプ等をつかって1行のコマンドで簡潔に書きたいとき、どう書けばいいでしょうか? $ ./test.sh src dst -- test.sh ---------------- #! /bin/bash src=$1 dst=$2 for i in $(cat ./files) do  何かのコマンド $i $1 $2; done; これを1行のコマンドで書くとしたら??

  • Bourne Shell と POSIX について

    現在、会社でLinux 上でバッチプログラムを何本か作成しています。 その中で、規約に「シェルはB シェルとし、冒頭には /bin/sh と すること」というようなことが書かれていました。 これは互換性を意識してのことだと解釈し、拡張表現を使用しないことを 意識して書いていました。 具体的には、export VAR=VALUE みたいな書き方はせずに、 VAR=VALUE; export VAR みたいにするとか。 ところが、Solaris を触る機会があって、そのプログラムを 動かしてみると正しく動きませんでした。 その原因は、関数内でローカル変数を宣言するために local を 使っていたのですが、それが Solaris の /usr/bin/sh が 解釈してくれないためでした。 そこで、以下の疑問点が上がってきましたので、 可能な箇所だけでも回答をお願いできたらと思っています。 1. Solaris の /usr/bin/sh は POSIX に準拠しているのでしょうか? 2. 互換性を意識するのであれば local は使用しない方がよいという 結論だと思っています。それでは、local を使用せずにローカル変数を 使用したい場合や再帰処理を行いたい場合はどのような方法を使うのが 一般的なのでしょうか? それとも、拡張機能無しにそのようなことは できないと考えるべきなのでしょうか? 3. そもそも、POSIX でシェルに求められる必要条件とはどのようなこと があるのでしょうか?(どのようなことが規定されているか。 Google検索で見つけられなかったので、原文がWeb 公開されているので あればURL 指定でも・・・)

  • シェルスクリプト中のexpectで変数使う方法

    SolarisでshellにBashを使う環境で、リモートのルータに入り コンフィグを操作するscriptを書きたいと思っています。 1.引数に与えられたファイルから値を読み、変数$POLにセットする。 2.expectでルータにSSHし、変数$POLに入っている値を設定する。 3.上記をファイルの行数分繰り返す。 上記を実現しようと以下の様に書いたのですが expect内で変数が扱えません。 (ルータに$POLという文字列のまま送られてしまう) -- #!/usr/bin/bash HOST="192.168.0.100" for list in `cat $1` do POL=$(echo $list | cut -d , -f 1) /usr/local/bin/expect -c ' set timeout 5 spawn ssh -l cm01 $HOST expect "password:" send "hogehoge" expect "router $ " send "config firewall policy\r" expect "router (policy) $ " send "edit $POL\r" send "set firewall on\r" send "end\r" send "exit\r" ' done -- 色々と調べてみたのですが理由がわからず、お教えいただければ幸いです。

専門家に質問してみよう