• 締切済み

シェルスクリプト中で、ヒアドキュメントで書いた内容を配列に格納したい

SQL文を実行するシェルスクリプトを作っています。 HAIRETSUにSQLファイル名を格納して、forループで実行させているのですが、現在は下記のようにSQLファイル名を横に並べて書いています。 ------------------------------------------- #!/bin/bash HAIRETSU=( test1.sql test2.sql ) for YOUSO in "${HAIRETSU[@]}" ; do psql testdb1 -f $YOUSO done -------------------------------------------- SQLファイルの数は実際にはもっと多いので、一行につき1ファイルだけ名前を書くようにしたいのです。ヒアドキュメントを使って後述のような方法も試みたのですが、この方法ですと配列が作成されません。 配列を別の処理でも使用したいので、ヒアドキュメントの内容を何とか配列に格納したいのですが、よい方法はないでしょうか? -------------------------------------------- for LINE in `cat << EOF test1.sql test2.sql EOF` do psql testdb1 -f $LINE done

みんなの回答

  • hogejo
  • ベストアンサー率42% (11/26)
回答No.1

#HAIRETSU=( test1.sql test2.sql ) HAIRETSU=( `cat << EOF test1.sql test2.sql EOF ` ) ( )の中をヒアドキュメントに置き換えるだけでいけるのでは??

参考URL:
http://www.k5.dion.ne.jp/~eudyptes/shellscript.html
eri_otto
質問者

お礼

あ・・・これで出来ました。 ↓これを試行錯誤で見つけたんだから、ご回答頂いた内容も分かっても良さそうなものなのに・・・申し訳ありません。 ---------------------------- for LINE in `cat << EOF test1.sql test2.sql EOF` ----------------------------- ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • シェルスクリプトでのmysqlコマンド実行

    いつもお世話になっております。 MYSQLで、データベースの一覧を出力し それを上から順にテーブル作成をしたいと考えています。 source コマンドで、ファイルを読み込んで実行したいのですが、 2つ目のfor文に上手く変数を渡せません。 'source $var_ファイル_$i.sql'` ↑これに変数が上手く渡りません。 そのままの値になってしまいます。 どうにか渡す方法はないでしょうか。 #!bin/bash var=`hostname -a` for i in `mysql -u root -p -e 'show databases'` do for (( cnt = 0; cnt < 11; cnt++ )) do echo $var echo $i `mysql -u root -p $i -e 'source $var_ファイル_$i.sql'` 1>> $var_ファイル_$i.log 2>&1 echo "$cnt 回目の処理" done done exit 0

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

    #!/usr/bin/bash SOURCEBASE="`echo \"$1\" | sed 's/\.[^.]*$//'`" DOCLEAN='no' # 「-c」オプションで削除するファイルの拡張子一覧 CLEANEXTS='aux log toc lof lot bbl blg idx ind ilg' show_help() {   cat <<EOF autolatex [options] latex-source[.tex]  -c  Clean temporary files before typesetting EOF   exit 1 } do_clean() {   for ext in $CLEANEXTS; do    if [ -f ${SOURCEBASE}.${ext} ] ; then      echo "hoge1"      echo ${SOURCEBASE}.${ext}      rm ${SOURCEBASE}.${ext}    fi   done } if [ $# -eq 0 ] ; then  show_help  exit 1 fi while getopts c: flag; do   case ${flag} in   c) DOCLEAN='yes';;   \?) exit 1;;   esac done do_clean #if [ ${DOCLEAN} = 'yes' ] ;then # # echo "hoge2" # do_clean #fi やりたいこととしては*.auxや*.logファイルを-cのオプションをつけた時に削除されることです. とりあえず手始めに取り合えず動くかの確認をしました $ bash test.sh hoge.tex hoge1 hoge.aux hoge1 hoge.log 次にコメントアウトしている部分を取り除いて(さらにその上にあるdo_cleanもコメントアウトします) #do_clean if [ ${DOCLEAN} = 'yes' ] ;then  echo "hoge2"  do_clean fi $ bash test.sh -c hoge.tex hoge2 同様に実行しました.結果は上のようになりif分はtrueで認識されているのですが,その次のdo_cleanでecho部分でのhoge1が表示されません. if分で分岐させている時は関数を別の呼び方で呼ばないといけないのでしょうか? さらに, do_clean if [ ${DOCLEAN} = 'yes' ] ;then  echo "hoge2"  # do_clean fi このようにしても結果は変わりませんでした. (オプションでなにか気をつけなければならない?) オプションをつけたときだけ該当するファイルを削除したいです,ご教授ねがいます><(なお空白はすべて全角空白になっています)

  • 多次元配列への格納

    よろしくお願いします。 多次元配列に値を格納したいのですが、これまでは、 $test = array ( 'father' => array ('hiroshi', 'toshi'), 'mother' => array ('hanako', 'yoshiko'), ); のように予め書かれてあるデータを使ってきましたが、この度やりたいのはある一つの通常の配列を20ずつ多次元配列に自動的に格納するスクリプトを作りたいと思っています。 $test = array ('hiroshi','toshi','masao',.....);と続く配列を、 $test = array ( 0 => array ('hiroshi',......(20個)), 1 => array (.......), ); と20ぐらいに区切って多次元配列にしたいです。 $test[0]に直接pushしたらWarning: array_push() [function.array-push]: First argument should be an array in..と叱られてしまいました。 どなたかわかる方がいましたらおしえてください。

    • ベストアンサー
    • PHP
  • ファイルからデータを読み込んで、配列に格納する方法

    データファイル grep.dat があり、その中は 12345 67890 ABCDE (EOF) となっています。   このファイルの中身を読み込んで、配列 P[0]の 中に("12345","67890","ABCDE") に格納したい のですが、どのように記述すればよいでしょうか。

    • ベストアンサー
    • Perl
  • シェルスクリプトの演算について

    下記のような内容で、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` }'` 等を試しましたがうまくいきません。 どのようにすればよいでしょうか。 よろしくお願い致します。

  • 【シェルスクリプト】 for文で単語分割させたくない

    シェルスクリプトのfor文で単語分割させないで、一行ずつ処理させるにはどうすればよいのでしょうか。 ---------- $ ca file test1 test1 test2 test2 test3 test3 ---------- #!/bin/bash for i in `cat file` do echo $i done ---------- 「test1 test1」、「test2 test2」、「test3 test3」といった具合に、行単位で処理したいです。 しかし結果は test1 test1 test2 test2 test3 test3 と単語分割されてしまいます。 空白を含んでいる場合に行単位で処理するにはどうすればよいのでしょうか。

  • シェルスクリプトがちゃんと動かない

    よろしくおねがいします。 fileフォルダに 1.txt 2.txt 3.txt というファイルがあり、ここから1.txtを別フォルダに移動します。 (ここまでは問題ありません) その後fileフォルダには 2.txt 3.txt というファイルが残るのですが、このファイル名を自動的に 1.txt 2.txt と連番でリネームしたく #!/bin/sh declare -i i=1 for file in *.txt do mv $file $i.txt i=i+1 done をhoge.shとして準備しました。 Mac OS X(Darwin)では思い通りに実行されるのですが、Webサーバ(FreeBSD 6.1-RELEASE-p21)にアップし %sh hoge.sh とすると declare: not found となり、ファイルの方も .txt i+1.txt の2ファイルになってしまいます。 あまり知識も無く勉強しながらなのですが、きちんと連番で書き換えられるようにするにはどうすればよろしいでしょうか? 根本的に間違ってる事などあるかと思いますがよろしくおねがいします。

  • 文字列を格納する配列を、動的なメモリ確保で処理したい

    文字数が一定でない文字列の一覧を、配列に格納したいと思っています。 "AAA" "BBBBB" "CC" このような文字列を配列に格納するのに普通にやるなら char test[3][24]; for(i=0;i<3;i++){ strcpy(test[i],file[i]); } (便宜上、file[0]には、"AAA",file[1]には"BBBBB"が格納されてるとします) こうやると、test[3][24]の24バイトとか余計に確保した分が無駄になるので、 必要な文字列の長さだけ配列を確保したいと考えています。 で、 char *test[3]; for(i=0;i<3;i++){ //sizeには、各文字列のサイズが格納してあります。ここではその部分省略しますが test[i]= (char*)malloc(size); strcpy(test[i],file[i]); } とやれば (イメージで) test[0]= "AAA" test[1]= "BBBBB" test[2]= "CC" となると思ったのですが、うまく処理されませんでした。 このような処理をさせたい場合根本的に違うのでしょうか。 わかりにくい説明ですが、どなたかご存知の方よろしくお願いします

  • シェルスクリプトの質問です

    シェルスクリプトの質問です 質問が連続してしまい、もうしわけございません。 1番目から13番目までの引数を表示させようと思い for i in `1 13` do eval echo '$'$i done をかいたのですが、10番目からは不正確になってしまいます。どうしてでしょうか? どなたかご教授お願いいたします。

  • BShell 動的配列のループ処理について

    動的に変数名を作成した配列について、ループ処理を行う場合、どうしたらいいでしょうか 以下のような処理を書いたのですが、駄目でした。 a=0 while [ ${a} -ne 10 ] do     eval $(printf TEST%02d $a)=(aaa bbb ccc) #TEST00 - TEST10の配列が作られる。     # TEST00 - TEST10の配列の中身にたいして処理を行いたい。。。     for (( I=0; I < ${#`eval $(printf TEST%02d $a)[@]`}; ++I )) # エラー     do         // ここで処理したい・・・     done done いいアイディアがありましたらご教授よろしくお願いいたします。

このQ&Aのポイント
  • Pxs5080で発生するエラーコード031004の対処方法について解説します。
  • エプソン社製品Pxs5080で表示されるエラーコード031004について詳しく紹介します。
  • エプソンのプリンタPxs5080で発生するエラーコード031004の解決方法を解説します。
回答を見る

専門家に質問してみよう