アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のBシェルファイルで、あるテキストファイルの内容を1行ずつ読み込んで、その行を変数に代入し、後続にてその変数を表示するという処理を実現したいのですが、うまくいきません。
どのようにすればうまく行くのかまた、何故うまくいかなかったのかをご教授頂ければと思っております。

宜しくお願い致します。

<Bシェルファイル>
#!/bin/sh

exec 3<&0 < TBL.txt
count=0
while read line
do
ex$count=$line
count=`expr $count + 1`
done
exec 0<&3 3<&-

echo ${ex[1]}

exit 0

<結果>
aho.sh: ex0=A コマンドが見つかりません。
aho.sh: ex1=B コマンドが見つかりません。
aho.sh: ex2=C コマンドが見つかりません。

aho.sh: 置換が正しくありません

A 回答 (2件)

bashであれば#1の方が書かれたように配列が使えますが、純粋なBシェルでは配列は使えません。



exec 3<&0 < TBL.txt
count=0
while read line
do
eval ex$count=\$line
count=`expr $count + 1`
done
exec 0<&3 3<&-
echo $ex1
のようにします。

最後のechoのところで、添字が変数のときは、
eval echo \$ex$count
のようにします。

何故上手く行かないのかは、シェルが変数置換したり、* を展開したり、' や " や \ 等の特殊文字を処理したり、組み込みコマンドの判断をしたりには一定の順序があるということです。
ex$count=$line はイコールの左辺がシェル変数の形式をしていない($がある)ため、シェル変数への代入と見なされません。この判断は $ による変数置換の前に終わってしまいます。変数置換後に外部コマンド呼び出しの構文と解釈されます。変数置換後には代入コマンドかどうかの判断は行われません。

eval はそれらの解釈をもう一度やり直すコマンドです。
eval ex$count=\$line の場合、$countの置換 と、\$ を $ に置換したあとの、ex0=$line をもう一度最初から解釈しなおすので、代入コマンドとなります。
    • good
    • 0
この回答へのお礼

大変役に立ちました。ありがとうございました。

お礼日時:2005/08/30 10:28

よくわかんないけど、表題の件からして、こんな感じ?



x.txt
1111111111
2222222222
3333333333

これを、配列に代入して表示するんでしょ?

bash$ IFS="
> "
bash$ DATA=(`cat x.txt`)
bash$ echo ${DATA[0]}

1111111111

こんな感じで、出そうなもんだけど、いかが?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!