• ベストアンサー
  • すぐに回答を!

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

いつもありがとうございます。 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: そのようなファイルやディレクトリはありません 恐れ入りますが正しいスクリプトをご教授くださいますようお願いします。

共感・応援の気持ちを伝えよう!

  • Linux系OS
  • 回答数3
  • 閲覧数109
  • ありがとう数0

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

  • ベストアンサー
  • 回答No.1
  • kmee
  • ベストアンサー率55% (1857/3366)

「for」 詳細な使いかたはbashのマニュアルを見てください。 > done < ${NIC} リダイレクトの意味、わかってますか? 例えば cat < 192.168.0.1 てやったらどうなると思ってますか? 余談: ここにあるシェルスクリプト関係の質問と見てると、やたらと while read ~ が使われているんですよね。 なんでなんでしょう?

共感・感謝の気持ちを伝えよう!

その他の回答 (2)

  • 回答No.3

一つの要因を発見しました。 http://program571.blog91.fc2.com/blog-entry-178.html このような くそ サイトのサンプルを誤って解釈しているのが主な原因ですね。 >NIC= >192.168.0.1 >127.0.0.1 本当にこのようにセットされているなら変数の値に改行マークがあることになる。 http://www.geocities.co.jp/geo_sunisland/input_output.html ここに書かれているような基本的な事を理解するまえに前述のサンプルを変えると、今回の事件になるようだ。 1行読みこむコマンド。 ちゃんと man などを使ってリファレンス読み、動作を理解しましょう。No2で書いたように、echoのオプションで改行を無視すればいいわけです。 http://www.geocities.co.jp/geo_sunisland/index.html なお、このURLのサイトが、それほどいいわけではないが、基本的な部分をしっかり説明している。本来、Linuxのコマンドバージョン(シェル)を理解し、それぞれのディストリビューションのリファレンスサイトを検証してください。それぞれに多少違う。 シェルなどはUNIXべーすなので、それぞれのLinuxでコマンドやシェルが追加されているだけです(Cで作られている事が多い)。 変数の値の組み換えは、 printf (or echo) $var | sed xxxxxxxx | printf $var | nawk などいくつもやり方がある。paste, tr も便利なツール。 オプションをしっかり勉強しよう。

共感・感謝の気持ちを伝えよう!

  • 回答No.2

>ここにあるシェルスクリプト関係の質問と見てると そうなんです。あやしいでしょう。かなり意図的なものを感じます。 このサイトの関係者、特に投稿数を増やすプロジェクト関係(毎年、似た質問が繰りかえされている)、 特定の学生が、研究している(きっとだめな学生でしょう)、 特定のあほ社会人が、仕事の暇で投稿している(志望は開発だが事務職についている)、 の類でしょう。 ちなみに予測では、標準入出力の自動入力、書き込みをやりたいのか、それを理解していないのかです。 たぶん EOF を理解していないと思います。 でそれを変数値の文字列切り出しや、データーの加工をしたいなんて、裏テクを引き出したいのでしょう。 通常知ってのとおり、sed , nawk, tr, paste, printf, echo, grep, find, for を駆使して使えば、ほぼできないことは、何もないですよね それを標準入出力のコマンドで行う事自体無知か、挑戦者なんでしょう。 たとえば、echo のオプションによってLF LNを無視したり生かしたりしますよね(printfも同じ)。それで、1行であったり複数行であったりと。 その辺の基本コマンドをならうと意味不明なコードはなくなると思うのだが。

共感・感謝の気持ちを伝えよう!

関連するQ&A

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

    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とバラバラになってしまいます。(当然っちゃ当然ですが・・・) 何かよい方法がありましたらご教授お願いいたします。

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

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

  • シェルスクリプト ファイルの読み取りとgrepのし

    test.nicdfにはネットワークアドレスとマウントポイント(df)の情報が格納されてます。 行いたいこととしては、 test.nicdfファイルから一行づつ読み取り、 ネットワークアドレスとマウントポイントの2つの情報を読取ます。 マウントポイントは複数行あるため分り易いネットワークアドレスを grepで抽出して、他の行はマウントポイントとして認識させようと思いました。 =========================== $ cat test.nicdf 210.175.250.212 /dev/mapper/VolGroup00-LogVol00 /dev/hda1 tmpfs ========================== $ test.sh #!/bin/sh while read LINE; do echo $LINE if [ ${LINE} grep "192" ] then echo "network" else echo "NEXT" fi done < test.nicdf ========================== しかし下記のエラーが発生します。 grepの書き方が悪いようです。 このエラーを解決する方法をご教授願います。 また、ネットワークアドレスとマウントポイントの2つの変数に格納する方法も あわせてご教授頂けませんでしょうか? よろしくお願いします。 ========================= $ ./test.sh 192.168.0.250 ./testnakano.sh: line 6: [: grep: binary operator expected NEXT /dev/mapper/VolGroup00-LogVol00 ./testnakano.sh: line 6: [: grep: binary operator expected NEXT /dev/hda1 ./testnakano.sh: line 6: [: grep: binary operator expected NEXT tmpfs ./testnakano.sh: line 6: [: grep: binary operator expected NEXT =========================

  • シェルスクリプト shiftとwhile

    下記の内容はスクリプトの一部を抜粋した内容です。 2箇所、理解が出来ない部分があるので、教えて頂けますでしょうか。 ------------------------------------------------ shift $(( $OPTIND -1)) if [ $# -eq 0 ]; then FileName="" elif [ $# -eq 1 ]; then if [ "\-" = "$1" ]; then FileName="" else FileName="$1" fi else echo "オプションが多い" exit fi if [ "" = "$FileName" ]; then while read line; do fcnctionA "$line" done else while read line; do fcnctionA "$line" done < "$FileName" fi ------------------------------------------------ (1) if [ "\-" = "$1" ]; then 部分が理解できないのですが、教えて頂けますでしょうか。 (2)  if [ "" = "$FileName" ]; then while read line; do fcnctionA "$line" done 基本はファイル名を指定して実行する事を前提としていると思います。 ファイル名を指定しないでスクリプトの実行をする場合は、1行ずつ標準入力で 入力すると思うのですが、このような使い方をする場合はあるのでしょうか。 下記よりも便利な点があるようでしたら、教えて頂けますでしょうか。 または、shiftと関係があるのでしょうか? if [ ! "" = "$FileName" ]; then while read line; do fcnctionA "$line" done < "$FileName" fi

  • シェルスクリプトでwhileを用いてrshを繰り返し使う場合

    Bシェルスクリプトでリモートシェル(rsh)を使う場合の質問です。 現在、以下のような状態です。 有識者の方、アドバイスをお願いします。 ・Aでは、ループされずhostAの場合のみ処理がされます。 (while文が効いていない) ・Bでは、ループされて問題なくhostA,hostB,hostCが処理されます。 (while文が効いている) なぜなのでしょうか。。。(r系コマンドの特性?) ちなみり、リモート側のサーバには.rhostsが設定してあり 問題なくコマンドが通ることは確認済みです。 スクリプトA---------------------------------------------- #!/bin/sh while read line ; do rsh $line hostname done <<END hostA hostB hostC END スクリプトA---------------------------------------------- スクリプトB---------------------------------------------- #!/bin/sh while read line ; do echo " HOST=$line" done <<END hostA hostB hostC END スクリプトB----------------------------------------------

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

  • シェルスクリプト

    2月14日頃質問のあった”UNIXのシェルスクリプトを使用してテキストファイルのある列にある特定の文字列を条件としてその行を出力するということをやりたい”を下記のように作ってみました。問題ないか逆質問の形で投稿します。(ルール違反かもしれませんが質問が締め切られているので・・・) #!/bin/bash CAT=YAHOO while read LINE do echo $LINE > tmp.txt DOG=`cut -d" " -f2 tmp.txt` if [ "$CAT" = "$DOG" ] then echo "$LINE" fi done < catalog.file

  • ファイルから文字列を読み込むシェルスクリプトの作成

    現在シェルスクリプトの勉強をしています。 ファイルから文字列を読み込み表示するだけのシェルスクリプトを 作成しているのですが、エラーが出てうまくいきません。 ./test.sh: line 10: syntax error near unexpected token `done' 以下の通りファイルを作っています。 改行コードはLF、文字コードはSJISとなっています。 どのあたりが間違っているのか教えて頂けますでしょうか。 よろしくお願いします。 test.sh --------------------- #!/bin/sh LIST=./abc.lst while read F1 echo ${F2} break done < ${LIST} } --------------------- abc.lst --------------------- AAA BBB CCC ---------------------

  • シェルスクリプト ファイルパス違いによって実行結果が違う 比較

    シェルスクリプト(bシェル)を作成しています。fileA.txtの中身を一行ずつ読み込んで、fileB.txtと比較を行うプログラム(sample.sh)です。 設定しているファイルのパスの違いによって実行が出来るものと出来ないものがあり、その原因がわかりません。 【1】自分のホームディレクトリ(MyDIR)にすべてのファイルを置いている FILEA=/home/MyDIR/TEST/fileA.txt FILEB=/home/MyDIR/TEST/fileB.txt while read line do grep -v "$line" "$FILEB" done < $FILEA  このプログラムは正常に実行できます 【2】FILEA,Bを/tmpの下に作ったTESTディレクトリの下に置いている sample.shは/home/MyDIR/TESTの下、fileA,Bは/tmp/TESTの下。 set FILEA=/tmp/TEST/fileA.txt set FILEB=/tmp/TEST/fileB.txt while read line do grep -v "$line" "$FILEB" done < $FILEA  ファイルのパスをこのように変更すると、while:構文が間違っています。というエラーが出て実行できません。whileの中に入れていないようです。スペルミスはありませんし、パスが違うだけでなぜ実行が出来なくなるのでしょうか? よろしくお願いします。

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

    シェル変数の有効範囲に関して質問させて下さい。 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」を使用してみたのですが、旨く行きませんでした。 ※使い方が悪い? 基本的な内容となり恐縮ではございますが、知恵をお借りできませんでしょうか。 よろしくお願い致します。