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