プロが教えるわが家の防犯対策術!

下記のスクリプトを書いています。
-----------------------------------------------------------------------------------------------
IFS_BACKUP=$IFS
IFS=$'\n'
count=1
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`\""
if [ $? -ne 0 ]; then
echo $count
echo ${line}
fi
eval "col4[$count]=\"`echo ${line} |cut -d, -f 4`\""
eval "col5[$count]=\"`echo ${line} |cut -d, -f 5`\""
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} |sed -e 's/\r//'| cut -d, -f 9`"
count=`expr $count + 1`
done
IFS=$IFS_BACKUP
-------------------------------------------------------------------------------------------------

何故か不明なのですが、下記の内容の行に行くと、エラーを吐いてしまいます。

"548030","2017120604512200000000483","セラミック ラムカン","1","u","999999999","","",""


エラー内容
./create_cate3.sh: 行 34: ラムカン: コマンドが見つかりません

どなたか原因解析と、解決方法ご教授お願いできないでしょうか。
よろしくお願いいたします。

A 回答 (2件)

まず、bashスクリプトのデバッグの基本。


-vx オプションを付けて実行すると、実行の詳細が出力されます。
-v は実行するコマンド
-x は変数等の展開を済ませた「本当に実行する」コマンド
になります。


eval "col3[$count]=\"`echo ${line} |cut -d, -f 3`\""
というコマンドは
col3[$count]=\"`echo ${line} |cut -d, -f 3`\"
を変数やコマンドの展開をして、その内容をコマンドと解釈して実行(評価)する、というものです。

`echo ${line} |cut -d, -f 3` の部分が、コマンド実行結果の「"セラミック ラムカン"」の展開されます。
`echo ${line} |cut -d, -f 3` の前後の \" は、そのまま ダブルクオーテーションの文字となります。
$countは、その時点での行数になります。
全部展開すると
col3[1]=""セラミック ラムカン""
という感じの文字列になります。 eval が実行するのはこの文字列です。

ここで、ダブルクオーテーションが2つ並んでいるのは、ただの空文字なので、実質
col3[1]=セラミック ラムカン
を実行します。

この書式は
変数=値 コマンド
という、「環境変数に値を設定して実行」という書式になります。
※ LANG=C ls (一時的にCロケールで lsコマンドを実行) 等という使い方をします。

col3[1]=セラミック ラムカン
は、
col3[1]に「セラミック」を設定して 「ラムカン」コマンドを実行
ということです。



https://oshiete.goo.ne.jp/qa/11377310.html
でも指摘されてますけど、なんでevalでやるのでしょうか?

evalのない
col3[$count]="`echo ${line} |cut -d, -f 3`"
で十分なのでは?


別解。
これくらいの内容なら、bash で頑張るより、awkやperl等で処理した方が確実なのでは?
Python + CSVモジュールとか。
    • good
    • 0
この回答へのお礼

お礼と返答遅くなり申し訳ございません。

かなり昔の話でUNIXを触ってた事があるので、どうにかシェルでCSVをと思っています。
(10年以上の話でほとんど覚えていないのですが転職してCSVをかなり触るので、、、、)
evalを取ると、$countの配列部分が展開してくれないので、evalを使っていました。

evalを取ると、下記のようになってしまいます。
++ cut -d, -f 2
+ col1[$count]='""1038850""

よろしくお願いいたしまうs。

お礼日時:2019/11/26 10:32

>./create_cate3.sh: 行 34: ラムカン: コマンドが見つかりません



で、そのスクリプトの34行目ってどこです?
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています