• 締切済み

シェル変数の有効範囲に関して質問させて下さい。

シェル変数の有効範囲に関して質問させて下さい。 while文にて代入した変数を、その後も使用したいと考えております。 以下、試してみた内容です。 ---------------------- # cat /WORK/test_clice sda sda1 sda2 sda3 sda4 sda5 sda6 sda7 sda8 sdb # declare -a clice # declare -i count # cat /WORK/test_clice | while read LINE; do count=`expr $count + 1`; clice[${count}]=${LINE}; echo ${clice[${count}]} ; done sda sda1 sda2 sda3 sda4 sda5 sda6 sda7 sda8 sdb # echo ${clice[1]} # ---------------------- 有効範囲の為、引き継がれていないのかな?と考えております。 試しに、「set」や「export」を使用してみたのですが、旨く行きませんでした。 ※使い方が悪い? 基本的な内容となり恐縮ではございますが、知恵をお借りできませんでしょうか。 よろしくお願い致します。

  • un-G
  • お礼率42% (3/7)

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

パイプを使っているので while がサブシェル内で実行されているんでしょう. read の -a オプションが使えるかもしれないし使えないかもしれない.

un-G
質問者

補足

ご解答ありがとうございます。 その後「-a」オプションを使用して、試してみましたが、旨く行きませんでした。 また、シェルに関しても色々はサイトを探してみましたが、良い情報は得られませんでした。 お忙しい中、対応いただきありがとうございました。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

シェルは何ですか?bash?csh?ksh?

un-G
質問者

補足

SaKaKashi 様 > シェルは何ですか?bash?csh?ksh? 失礼致しました。Bシェルなので、「bash」となります。

関連するQ&A

  • 【シェルスクリプト】 ローカル変数、グローバル変数

    シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。

  • シェルスクリプト 一つのふくすう変数から値を取る方

    いつもありがとうございます。 NICという変数にはネットワークアドレスが2つ入ってます。 NIC= 192.168.0.1 127.0.0.1 下記のスクリプトで上記2つのアドレスを取ろうと思ってます。 ==========test.sh================ while read LINE; do echo $LINE done < ${NIC} =============================== しかし下記のようなエラーになります。 変数の取り出し方が悪いのだと思います。 =============================== ./test.sh: 192.168.0.1 127.0.0.1: そのようなファイルやディレクトリはありません 恐れ入りますが正しいスクリプトをご教授くださいますようお願いします。

  • シェルスクリプト: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 ← しっかりインクリメントされた変数見れてるし。最近の仕様?

  • シェルスクリプト

    while文のシェルスクリプトでエラーが出て困っています。 どうすればいいでしょうか? 回答の程宜しくお願い致します。 #!/bin/bash count=1 while[$count -le 5] do touch "y$count" ls -l "y$count" coun ='expr $count+1' done [root@Linux root]# . makefile bash: while[1 -le 5]: command not found bash: makefile: line 4: syntax error near unexpected token `do' bash: makefile: line 4: `do'

  • シェルスクリプトの変数

    Bシェルのスクリプトで入力した情報を書き出すというスクリプトで詰まってしまったので、アドバイスをお願いできますでしょうか? #!/bin/sh # COUNTER変数のリセット COUNTER=1 # 繰り返す回数を入力 read KURIKAESHI # KURIKAESHIで入力した回数入力を受け取り、出力する while [ $COUNTER -le $KURIKAESHI ];  do # 必要な情報の入力("NYUURYOKU_{COUNTER変数の数字}"の変数に入れる)   read NYUURYOKU_$COUNTER   echo "$NYUURYOKU_$COUNTER" ←※ココ   COUNTER=`expr $COUNTER + 1` done 上記のようなスクリプトを書き、"$NYUURYOKU_$COUNTER"の値を出力したいのですが、何かよい方法はありますでしょうか? echo "$NYUURYOKU_$COUNTER" と記述しただけでは、$NYUURYOKU_と$COUNTERとバラバラになってしまいます。(当然っちゃ当然ですが・・・) 何かよい方法がありましたらご教授お願いいたします。

  • Bシェルで配列を使いたいのですが・・・

    下記のBシェルファイルで、あるテキストファイルの内容を1行ずつ読み込んで、その行を変数に代入し、後続にてその変数を表示するという処理を実現したいのですが、うまくいきません。 どのようにすればうまく行くのかまた、何故うまくいかなかったのかをご教授頂ければと思っております。 宜しくお願い致します。 <Bシェルファイル> #!/bin/sh exec 3<&0 < TBL.txt count=0 while read line do ex$count=$line count=`expr $count + 1` done exec 0<&3 3<&- echo ${ex[1]} exit 0 <結果> aho.sh: ex0=A コマンドが見つかりません。 aho.sh: ex1=B コマンドが見つかりません。 aho.sh: ex2=C コマンドが見つかりません。 aho.sh: 置換が正しくありません

  • シェルスクリプトの演算について

    下記のような内容で、list変数の値から抽出してtest{i}変数に入れるようにしています。 ※awkコマンドでのprintの値を for の値にしています。 for i in 0 1 2 do test${i}=`echo ${list} | awk '{ print $'${i}' }'` done この例はうまくいくのですが、 print $'${i}'の部分で${i}の値にプラス2したものを利用したく、 test${i}=`echo ${list} | awk '{ print $'${i+2}' }'` や test${i}=`echo ${list} | awk '{ print $i=`expr ${i} + 2` }'` 等を試しましたがうまくいきません。 どのようにすればよいでしょうか。 よろしくお願い致します。

  • Bシェルで不定変数名を変数として取り扱うには

    ファイル(test.txtとします)に 0755 $HOGE/herehere $FOO/bar のような形で変数を示す文字列がはいっています。 どんな変数名かは事前にわかりません。 これをシェルプログラムで、 $が付いていたら変数名と解釈して使用したいです。 どんな変数名がファイルに含まれているかがわかっているなら、 以下のようにできたのですが、 変数名が不明のときにはどうしたらファイルに含まれている変数を そのまま使用できるのでしょうか。 HOGE=`command HOGE` #HOGEを引数にcommandコマンドを呼び出した結果を$HOGEとする FOO=`command FOO` #↑test.txtの中には$HOGEや$FOOが何度も出てくるので、 #出てくるたびにcommandコマンドを使うのは避けたい。 while read LINE do  FILE=`echo $LINE|sed "s%"'$HOGE'"%$HOGE%g"` done < /test.txt

  • シェル ファイルの中身によって特定の処理

    シェルスクリプトに関する質問です。 少しシェルで言語風なものを作ってみようと思い、作成したのですが、上手くいかないので質問させて頂きました。内容は、特定の文字がファイルに記載されているか判定して、 特定の文字だったら処理をするというものです。 現在、このようなソースになっています↓ #!/bin/sh - #ファイルを設定(仮) file_name="dummy.sh" #行数を変数へ格納 line=$(wc -l ${file_name}) #行数をlog.txtへ書き込む echo ${line} > log.txt #行数以外にファイル名があるので削除 sed -i "s/$file_name//g" log.txt #行数を格納 Line=$(cat log.txt) i=0 #全ての行を変数へ格納 #ここが問題 配列に変数が使えない!? while [ $i = ${Line} ] do array[$i]=$(sed -n "${i}p" ${file_name}) expr `${i} + 1` done # 格納した変数をチェックして、 # 指定された文字(hello)が書かれていればhelloと表示させる b=0 while [ $b = ${main_file} ] do if [ array[$b] = "hello" ] then echo "hello" fi expr `$b + 1` done ここで、配列を利用し、変数への代入が出来ませんでした。 ただ、エラーは表示されません。。。 環境はUbuntu10.10です。 何もいじっていないので、たぶん大丈夫だと思うんですが・・・ 何か解決策はありませんか? また、コレよりいい方法などがあればぜひ教えてください。

  • シェルでのループ

    プログラム完全初心者です。 whileを使って10~0までを表示するプログラムを作っているのですが 実行すると、何もコマンドがかえってきません。 文法が間違っているのでしょうか?? #!/bin/sh TOTAL=10 while [$TOTAL -lt 0] do TOTAL=`expr $TOTAL - 1` echo $TOTAL done