• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:bashで変数を可変させたい)

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_#の#の部分が可変しないため、エラーが発生してしまうようです。#の部分を可変させる方法を教えていただきたいとのことです。

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

  • ベストアンサー
  • 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