Shammer's Philosophy

My private adversaria

B shell で複数のファイルを配列として扱う

この@ITのサイト、


 http://www.atmarkit.co.jp/flinux/rensai/shell05/parameter.html


にいくつか方法が出ている。
直接的にやりたいことは出ていなかった。
どうにかしてこのパターンまで自分で考える必要がある。
一番簡単なのは


 ls *.c


の結果をコマンドのように渡す方法だ。これを考える。


まず、> を使ってリダイレクトする。
Cのサンプルだから、


 ls *.c > compile_targets.txt


とする。こうすると、拡張子が .c のファイル一覧を取得できる。
その後で、スクリプト内でこれを読み込む。ここで使うのが read コマンド。
このコマンドは、読み込んだファイルの1行ずつを標準出力で入力されたパラメータと
同じように処理するコマンド。読み込む際のデリミタを変更したい場合は、IFS変数を
変えてやる必要がある。これは、デフォルトではスペースとタブになっているっぽい。。。
つまり、


 >ls *.c
 sample1.c "SPACE" sample2.c "SPACE" sample3.c


という感じになっていれば、


 >./sample.sh sample1.c sample2.c sample3.c


という感じで実行されたのと同じような感じになる。
この形は・・・先のサイトにある形だ。ここまでくればあとは機械的にやるだけ。


実際に書いてみると、

 ls *.c > compile_targets.txt
 count=0
 while read line; do
  ARRAY[$count]=$line
  count=`expr $count+1`
 done < compile_targets.txt
 i=0
 DIR="../bin"
 EXTENSION=".bin"
 while(( $i < $count ))
 do
  BIN_NAME=$DIR$i$EXTENSION
  cc -o $BIN_NAME ${ARRAY[$i]}
  i=`expr $i + 1
 done
 cat compile_targets.txt

まだ生成されるバイナリファイル名の課題は残っているものの、、、
とりあえずこれでいいか。