bashで変数を可変させたい

このQ&Aのポイント
  • 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_#の#を可変させたいのですが、良い記述方法はありますか?
  • ご質問は、bashを使用して変数を可変させる方法についてです。具体的には、/homeディレクトリ内のaaa、bbb、cccのサブディレクトリの容量を取得し、ファイルとして出力し、catコマンドを使用してその内容を表示し、変数mbox_#に保存するバッチスクリプトを作成したいとのことです。バッチを実行すると、mbox_#の#の部分が可変しないため、エラーが発生してしまうようです。#の部分を可変させる方法を教えていただきたいとのことです。
回答を見る
  • ベストアンサー

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 お手数をおかけしますが、宜しくお願い致します。

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

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

> #!/bin/sh とあって、質問にはbashとあります。どちらなのですか? shがbashの別名なケースもありますが、そうでないケースもありますので。 declare mbox_$n="`cat $Path2/$box`" declareで変数だと明記する。 空白で区切られて別の引数になるので、ダブルクォートでまとめる。 bashならば、それよりは配列として mbox[$n]="`cat $Path2/$box`" の方がすっきりすると思います。 ところで、これって必要なのでしょうか? ファイル $Path2/$box に保存するなら、ファイルのままの方がいろんなコマンドで操作できます ファイルが必要ないなら declare mbox_$n="mbox_$n `du -sm $Path1/$box/$var`" と直接加えていけばいいです。 そもそも、 > for var in `ls $Path1/$box` > do > du -sm $Path1/$box/$var >> $Path2/$box > done は for var in $Path1/$box/* でいいし、そもそもforを使わず du -sm $Path1/$box/$var/* >> $Path2/$box で済みます。 # $Path2/$boxへは追加書き込みなのですか? ファイルがいらないなら declare mbox_$n="`du -sm $Path1/$box/$var/*`"

murakenjapan
質問者

お礼

ご回答ありがとうございます。 色々とご指摘ありがとうございます。 仰る通り、簡単に記述できるところを無駄にまわりくどく記述していました。 ファイルに出力する必要は無く、直接変数に代入できればそれがベストです。 以下のように記述を変更し、問題なく動作することを確認しました。 #!/bin/sh Path1=/home n=0 for box in aaa bbb ccc do n=$[$n+1] mbox[$n]="`du -sm $Path1/$box/*`" done とても勉強になりました! ありがとうございました。

その他の回答 (3)

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.3

evalを使ってみて下さい # 以下おまけ syntax確認用に、問題箇所の要点だけ抽出したコードで動作確認する事をお勧めします。 http://ideone.com/h7y07 ANo1さんが仰られているように、配列の利用も可能だと思います。 空白文字で失敗するのは、配列自体ではなく全体のコードでクォーテーションに抜けが多いためではないでしょうか 一度、全文でクォーテーションの見直しをお勧めします。 空白文字やメタ文字が入った際の動作に注意して下さい http://ideone.com/cwRYl

murakenjapan
質問者

お礼

ご回答ありがとうございます。 evalも使用してみたのですが、イメージした通り動作しませんでした。 しかし、http://ideone.com/h7y07 でイメージどおり動作しなかった原因が分かりました。 自分は下のように記述したためでした。 eval "mbox_$n"=`cat $Path2/$box` mbox_$nが変数として認識できていないから、mbox_$nのみをevalの対象とすれば良いと考えてしまいました。 とても参考になりました! ありがとうございました。

  • pakuti
  • ベストアンサー率50% (317/631)
回答No.2

素直にエラーが出ている行を確認しましょう 'mbox_'$n=`cat $Path2/$box` シングルクォートを外せば、エラーは出なくなるはずです 詳細は、man bash 辺りで確認してください

murakenjapan
質問者

補足

ご回答ありがとうございます。 mbox_$n=`cat $Path2/$box` に設定変更を行いましたが、変わらずエラーが表示されます(エラー内容は変わりません)。 ./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 何か対応方法は無いものでしょうか?

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

ん~, 配列じゃダメなんだろうか....

murakenjapan
質問者

補足

ご回答ありがとうございます。 配列も試したのですが、空白が含まれるため、意図しない場所で別れてしまいます。 配列に空白を含めることは可能なのでしょうか? 宜しくお願い致します。

関連するQ&A

  • 変数$importfileに第1引数($1)のファイルPATHを表示したい

    下記のスクリプトを書きましたが ./aa.sh: line 6: =/tmp: command not found と言われるのはなぜですか? 変数$importfileに第1引数($1)のファイルPATHを表示したいです。 1 #/bin/bash 2 3 echo $# 4 if [ $# -eq 1 ] 5 then 6 $importfile=$1 7 echo "$importfile" 8 else 9 echo "argv file notfound" 10 exit; 11 fi 12 実行結果 ./aa.sh /tmp 1 ./aa.sh: line 6: =/tmp: command not found

  • Intel C++ Compiler(Linux版)をインストールできない。

    Intel C++ Compiler 9.0 (Linux版)をインストールすることができません。 install.shを実行して、ライセンスファイルを指定したあとインストールが始まるとすぐに、 ./.././install_cc.sh: line 1272: ERROR: unable to find command "ls" !: command not found ./.././install_cc.sh: line 1276: Please add the location to the above commands to your PATH and re-run the script.: command not found ./.././install_cc.sh: line 1277: Please press Enter to continue...: command not found というエラーが出てしまいます。 lsコマンドが見つからないと書いてあるようですが、コンソールでlsコマンドは使えますし、PATHに/binも入っています。 どうしたらインストールすることができるのでしょうか? よろしくお願いします。

  • MySQLデータベース自動バックアップ

    CentOS5でMySQLをインストールし、MySQLの全てのデータベースを サーバ内の他のディレクトリにバックアップするためのスクリプトを作成しています。 http://centossrv.com/mysql-backup.shtml このページを見ながらその通りにしているのですが、スクリプトを実行した時に、 ./mysql-backup.sh: line 9: rm: command not found ./mysql-backup.sh: line 10: mkdir: command not found ./mysql-backup.sh: line 12: ls: command not found ./mysql-backup.sh: line 12: grep: command not found というエラーが出て実行ができません。 どのように対処すれば良いでしょうか。

  • PATH変数の設定方法?

    opensolarisを自宅PCに導入して、シェルスルリプトの勉強をしております。 実行時、【 ./aaa.sh 】と、コマンド実行ならうまくいくのですが、 【 aaa.sh 】 では、 「bash: aaa.sh: command not found」 と、エラーになってしまいます。 PATH設定の問題と考えているのですが、設定方法をご教授頂けないでしょうか?

  • selectでデータの中身を見れない

    デスクトップ上にあるCSVファイルのデータをpostgresqlに\copyで取り込んだのですが、取り込んだデータをselectで見ることができません。 「sh: more: command not found」と表示されてしまいます。 そもそもsh:とmore:の意味をネットでも調べたのですが、よく分かりませんでした。command not foundはパスが通っていないらしいと言うのは分かりました。 どうすればcsvで取り込んだデータを見ることができるのか、どなたか教えていただけないでしょうか。

  • iSquintでAppleScriptエラー

    端末の調子が悪かったのでOSを入れ直してみたら 先ほどまで使えていたiSquintが使えなくなってしまいました。 エラー内容は、“sh:line 1:defaults:command not found”です。 なにかが削除されたようですが、 どうすればいいのですか?

  • Bashシェルスクリプトの書き方

    Bashシェルスクリプトの書き方 ↓のx.shはどこが間違っているのでしょうか? $ cat x.sh #!/bin/bash function x() { local dir if $1; then dir=$1 else dir="." fi `find $dir -type d` } ↓こうなります $ source x.sh $ x dir dir: command not found bash: .: ./dir: はディレクトリです

  • bash: tee: command not found

    玄箱の本(P155)を読みながら進めていったのですが、以下のエラーがでて 原因が分からず先に進めません>< どうすればよろしいのでしょうか?教えてください。。。 root@KURO-BOX:/mnt/share/src/GNU/coreutils-5.2.1# make 2>&1 | tee make.log bash: tee: command not found

  • ログイン時にエラーメッセージが出ます。

    redhatlinux(2.4.18-14)で、telnetでログイン時に以下のようなメッセージが出るようになってしまいました。 ************************* -bash: id: command not found -bash: [: =: unary operator expected -bash: id: command not found -bash: dircolors: command not found -bash: id: command not found -bash: id: command not found -bash: id: command not found -bash: [: too many arguments ************************* そもそも、昨日boot中に誤って電源を落としたことが影響しているような気がします。が、なぜかパスが通っていないため、manページも見られませんし、viも使えない状況です。こういう場合どうすればよいのでしょうか? 初歩的な質問かと思いますが、よろしくお願いします。

  • PHPのフレームワーク

    FuelPHPについて質問です。 http://press.nekoget.com/fuelphp_doc/installation/instructions.html 上記ページに記載のFuelPHPのインストール方法 【$ curl get.fuelphp.com/oil | sh】 というコマンドをvps上で叩いたのですがうまく行きません。 実際に、コマンドをうってみると % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 244 100 244 0 0 320 0 --:--:-- --:--:-- --:--:-- 1564 sh: line 6: sudo: command not found sh: line 7: sudo: command not found と上記のような警告がでます。 もちろんインストールはできていません。 なにかしらのバイナリがインストールされていないのかどうか・・・。 このような現象に遭遇したかたで解決されたかたご教授ください。 よろしくおねがいします。

    • ベストアンサー
    • PHP