
下記のスクリプトを書いています。
-----------------------------------------------------------------------------------------------
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件)
- 最新から表示
- 回答順に表示
No.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モジュールとか。
お礼と返答遅くなり申し訳ございません。
かなり昔の話でUNIXを触ってた事があるので、どうにかシェルでCSVをと思っています。
(10年以上の話でほとんど覚えていないのですが転職してCSVをかなり触るので、、、、)
evalを取ると、$countの配列部分が展開してくれないので、evalを使っていました。
evalを取ると、下記のようになってしまいます。
++ cut -d, -f 2
+ col1[$count]='""1038850""
よろしくお願いいたしまうs。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- PHP ランキングを表示する際の画像の大きさを固定することは可能でしょうか? <?php if ( has_ 1 2022/07/21 14:55
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- Visual Basic(VBA) vba シートコピーの不具合 1 2022/06/25 17:48
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
このQ&Aを見た人はこんなQ&Aも見ています
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Microsoft 365 の購入の誘いが...
-
WindowsからSSHでサーバーにあ...
-
MF-COBOL COBOL 違い
-
深くなった階層のファイルを上...
-
試用期限付きアプリの使用期間...
-
バッチファイルで特定のファイ...
-
アマゾン。メルアドをそのまま...
-
44歳でIT業界への転職
-
エクセルを起動するとグレーな...
-
exeファイルの実行結果をテキス...
-
三菱 Got 1000
-
Windows serverでマルチキャス...
-
なにこのQRコード?!!
-
PSEマークの販売会社名の表記に...
-
自作pcについて
-
ドルでの集金について
-
pipインストール時にプロトコル...
-
プロダクトキー
-
SHARP 複合機 BP60-C26のアドレ...
-
プリンタドライバを自動インス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Microsoft 365 の購入の誘いが...
-
MF-COBOL COBOL 違い
-
自作pcについて
-
WindowsからSSHでサーバーにあ...
-
アマゾン。メルアドをそのまま...
-
プロダクトキー
-
三菱 Got 1000
-
バッチファイルで特定のファイ...
-
Windows serverでマルチキャス...
-
Python CSVファイルについて
-
pipインストール時にプロトコル...
-
試用期限付きアプリの使用期間...
-
exeファイルの実行結果をテキス...
-
マイクロソフトから通知メール...
-
エクセルを起動するとグレーな...
-
Windowsバッチファイルでリモー...
-
デュアルディスプレイでショー...
-
no signal
-
画面設計と帳票設計の違いを教...
-
深くなった階層のファイルを上...
おすすめ情報