牛、豚、鶏、どれか一つ食べられなくなるとしたら?

for line in `cat $1`
do
eval col1[$count]="`echo ${line} |cut -d, -f 1 `"
eval col2[$count]="`echo ${line} |cut -d, -f 2`"
eval col3[$count]="`echo ${line} |cut -d, -f 3`"
eval col4[$count]="`echo ${line} |cut -d, -f 4`"
eval col5[$count]="`echo ${line} |cut -d, -f 5`i"
eval col6[$count]="`echo ${line} |cut -d, -f 6`"
eval col7[$count]="`echo ${line} |cut -d, -f 7`"
eval col8[$count]="`echo ${line} |cut -d, -f 8`"
eval col9[$count]="`echo ${line} |cut -d, -f 9`"
eval col10[$count]="`echo ${line} |sed -e 's/\r//'| cut -d, -f 10`i"
count=`expr $count + 1`
done

上記のようにbashで、変数に文字列を格納しています。
()が付いている場合、うまく格納できないようで下記のようなエラーが出ます。
./create_cate.sh: eval: 行 32: 予期しないトークン `(' 周辺に構文エラーがあります
./create_cate.sh: eval: 行 32: `col1[3]=DP鋼シリーズ(ツバ付)'

どのように対応すればよろしいでしょうか。
また、文字列にスペースが入っているものもあります。
コチラについてもうまく格納できないようです。

どなたかご教授お願いできませんでしょうか。
よろしくお願い致します。

A 回答 (2件)

スペースが入った文字列が処理できない理由は、下記で line に格納される文字列が、スペースで区切った1つ目だからです。



for line in `cat $1`


下記のように、1つ目、2つ目、3つ目を i j k に分けて格納するのが、本来の使い方です。

for i j k in `cat $1`


for 文を使った解決方法があるのか私は知りませんが、while 文に変更したら解決します。

while read line
do

done < $1
    • good
    • 0
この回答へのお礼

catのフィールドセパレータを変更する事で対応できました。
大ヒントありがとうございました!

お礼日時:2019/11/21 17:46

そもそも、eval は必要ないと思います。



eval を消せば動きます。

eval を消さないなら、下記のように " で囲めば動きます。

eval "col1[$count]=\"`echo ${line} |cut -d, -f 1`\""
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

eval "col1[$count]=\"`echo ${line} |cut -d, -f 1`\""で()を含む文字列を格納する事ができました。

もしよろしければご教授ください。

スペースが入った文字列を格納しようとするとスペース以降がうまく可能出来ないようです。

例えば、${line}が下記のような場合、、、
2017102005195400000002542,2017102005195400000002541,Wooden Buffetware,,1,1,1,1,ct00855,N,


+ for line in `cat $1`
++ echo 2017102005195400000002542,2017102005195400000002541,Wooden

となり、途中で切れてしまいます。

お礼日時:2019/11/21 17:00

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


おすすめ情報