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

初めて投稿します。LINUX初心者です。
現在,下記のような処理を行うシェルを作成したいと考えておりますが、シェルをうまく読み込んでくれません。
1.あるファイル(maint_log.dat)を1行づつ読み込み
2.1列目を抜き出す
3.1行目のステータスによって分岐処理を行う

#!/bin/bsh
while read line
do
case $(awk '{print $1}' ${line})
0)
flag_status0;;
1)
flag_status1;;
2)
flag_status2;;
esca
done < maint_log.dat

cat maint_log.dat
0 180 strdevdb2_20151113.log /home/log/shell
0 180 strdevdb2_20151116.log /home/log/shell
0 180 strdevdb2_20151113.log /home/log/shell

実行するとcase $(awk '{print $1}' ${line})の箇所で「bad substitution」と
表示されてしまいます。
いろいろと調べたのですが,何が悪くて実行できないのかわららず困っています。
どうか、宜しくお願い致します。

A 回答 (2件)

ちょっと気になった.



まず
awk '{print $1}' ${line}
が何をしているのか大丈夫だろうか. この変数 ${line} にはたとえば
0 180 strdevdb2_20151113.log /home/log/shell
という文字列が入ることになるから, その状態で
awk '{print $1}' ${line}
を実行するのは
awk '{print $1}' 0 180 strdevdb2_20151113.log /home/log/shell
と同じことになる. だから
「awk 致命的:ファイル’0’を読み込むために開けません(そのようなファイルやディレクトリはありません)」と表示されてしまいました
ってことになるんじゃないかな.

あと, 最初の行は
#!/bin/bsh
で OK なのかな? 素の bシェルに $(...) なんてものはないんだけど.
    • good
    • 1
この回答へのお礼

Tacosan様
ご回答いただきありがとうございます。

先ほどTacosan様がおっしゃっているように
変数(line)にmaint_log.datの1行目を代入しても
awk '{print $1}'以下は文字列として認識しているから
処理できないということになるのかと少し前に思いつきました。

ですよね って感じです。
考えが足らずご迷惑をおかけいたしました。

さて 次はこの文字列からステータス部分(0の箇所)を
どうやってCASE文に引き渡せばいいのだろう・・・と悩み中です。

お礼日時:2015/11/16 15:32

今、電車なので試せませんが、おそらくawkコマンド一式をバッククォートで囲む必要があると思います。


`awk '{print $1}' ${line})`
    • good
    • 1
この回答へのお礼

dorapote1969様

お忙しい中,ご回答いただきましてありがとうございます。
おっしゃるとおり「バッククオート」で囲んだのですが
「awk 致命的:ファイル’0’を読み込むために開けません(そのようなファイルやディレクトリはありません)」と表示されてしまいました。

普通に
awk '{print $1}' maint_log.datを実行すると正常に表示されるのですが・・・
どこに問題があると思いますか?

お忙しい中,大変恐縮ではございますが,ご教授下さい。
よろしくおねがいいたします。

お礼日時:2015/11/16 14:24

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