シェルスクリプト総合 その29

レス数が1000を超えています。これ以上書き込みはできません。
2018/09/21(金) 23:34:47.98ID:/eJt2TVD
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ:
シェルスクリプト総合 その28
http://mevius.5ch.net/test/read.cgi/tech/1532397676/
2019/07/02(火) 03:55:40.28ID:Atdu9zIi
たったこれだけの違いで大騒ぎ(笑)
2019/07/02(火) 03:58:00.36ID:uO4UDEG+
お前がいうなw
2019/07/02(火) 04:01:44.98ID:Atdu9zIi
>>974
今後の人生、サブシェルの中に移住すればいいだけだろ

cat dummy.txt | {
 i=0
 while IFS= read -r line; do
  i=$((i+1))
 done
 echo "$i"
}
2019/07/02(火) 04:05:15.58ID:uO4UDEG+
そのcatレベルで必要なんじゃね、普通は
そんな狭いパターンが主なのか?お前の人生は。俺の人生でそのパターンは少なさそう
そういうんじゃないよ普遍的wなのでだよ
2019/07/02(火) 04:05:54.52ID:Atdu9zIi
>>978
イミフ。例を出せ例を
2019/07/02(火) 04:12:40.39ID:Atdu9zIi
パターンを思いつかないのかレスが返ってこないので補足しておくと、
サブシェルになる場合というパターンだったから>>977のように書いたが
ファイルから読み取る場合は、そもそもサブシェルにしなくていい

i=0
while IFS= read -r line; do
 i=$((i+1))
done < dummy.txt
echo "$i"

さて、>>978はどんなパターンを想定してるんだろうかw
2019/07/02(火) 04:21:16.83ID:uO4UDEG+
なにか前処理
hoge=0
cat | while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done

if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi

とか。ループ中に例外的なのを検出した後にトップレベルで整理するとか。あとは、whileの後にもパイプで続けてその後でとか。局所的なので使うことはないな

気が短いなw
2019/07/02(火) 04:29:33.75ID:Atdu9zIi
こうすればいいだけw

なにか前処理
cat | {
 hoge=0

 while IFS= read -r line; do
  [ なにか ] && hoge=1
  ほかにいろいろ
 done

 if [ hoge = 0 ]; then
  前処理の調整
 else
  前処理の調整
 fi
}
2019/07/02(火) 04:33:37.38ID:uO4UDEG+
ほんとうにそれでいいと思うのか?w
なんか無理してんなと思うけど、POSIXに拘る人はそう書くのねと理解はした、お応えありがとう
2019/07/02(火) 04:35:32.93ID:Atdu9zIi
>>983
正しく動くし何も問題ない。

お前こそ、何も言い返せないのに
無理してレスしなくていいぞw
2019/07/02(火) 04:37:28.40ID:uO4UDEG+
いやあ、ああいうのが普通な人には何も言い返せないよ。てか「言い返す」って。喧嘩かなんかなのか?w
2019/07/02(火) 04:41:11.93ID:Atdu9zIi
喧嘩じゃなくて、お前の意見を言えって。

正しく動くだろ?
なにか問題が有るのか?
2019/07/02(火) 04:45:47.25ID:Atdu9zIi
シェルスクリプト初心者です。 { } の使い方がわかりません
とかいうなら、関数にでもすればいい

foo() {
 なにか前処理

 hoge=0

 while IFS= read -r line; do
  [ なにか ] && hoge=1
  ほかにいろいろ
 done

 if [ hoge = 0 ]; then
  前処理の調整
 else
  前処理の調整
 fi
}

cat | foo

お前の苦手な { } が無くてすんだぞw
サブシェルうんぬんの前に、関数の中で使う変数は、関数の中にとどめておけよ。
わかりやすいコーディングというのはこういうものだ
2019/07/02(火) 04:47:32.87ID:uO4UDEG+
そのサブシェルの中で後は全部やるんでしょ?必要な部分を。それで問題無いと思うなら、それでいいんじゃないの
「なんか無理してんな」ってのがわからないんだったらそれはそれでいいよ。元ネタと同じく、好みの問題。好みがわからないでしょ
2019/07/02(火) 04:50:12.51ID:Atdu9zIi
だから問題ないし、お前を含めて誰も問題があると言ってない。

お前さ、なんで自分で問題点を指摘できないのに
さも問題があるかのように装ってるわけ?
ばれないとでも思った?
2019/07/02(火) 04:50:38.17ID:uO4UDEG+
なにか頑張ってるな。そんな話じゃないよ
知識自慢臭しかもうしませんよ?そんなの自慢げというか馬鹿にしたいだけなのか知らんけど
2019/07/02(火) 04:53:12.30ID:Atdu9zIi
そんな話じゃないよ → じゃあどんな話なのか → 答えずに逃げる(笑)
2019/07/02(火) 04:53:48.95ID:uO4UDEG+
問題がある問題がないの話じゃないよ。好みだよ好み
そう次々あれこれ考えなくてもw bash(など)の拡張使えばスッキリだろうにという
2019/07/02(火) 04:54:45.55ID:Atdu9zIi
>>987のどこがスッキリとしてないというのか?
お前ならbashでどう書き直す?w
2019/07/02(火) 04:57:00.91ID:uO4UDEG+
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done < <(cat)

if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi

そもそもやりたいことがレベルが変わらずにそのままでスッキリだなwあとあとでなにか追加もとかもね
2019/07/02(火) 04:58:47.96ID:Atdu9zIi
>>994
それ、俺が書いたfoo関数の中身を書いただけじゃねーかw

hoge=0
while IFS= read -r line; do
 [ なにか ] && hoge=1
 ほかにいろいろ
done

if [ hoge = 0 ]; then
 前処理の調整
else
 前処理の調整
fi

これで動くよ。
foo() {
 上のコード
}
cat | foo

ってやればいいだけ
2019/07/02(火) 05:01:09.48ID:Atdu9zIi
Q.これをPOSIX準拠で書きたいのですが?

hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done < <(cat)

if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi

A. まず1. 関数にしましょう

foo() {
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done < <(cat)

if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi
}

foo
2019/07/02(火) 05:01:36.77ID:uO4UDEG+
いや、だから、お題に対してだけじゃなくな。普遍的にって言ってるでしょ
それが普遍的なのか?

なんで否定されたのをそんなに拘るねん。否定してんのは俺の好みじゃないってだけだぞ?w
2019/07/02(火) 05:01:53.99ID:Atdu9zIi
2. bash依存の命令をなくしましょう。

foo() {
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done

if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi
}

cat | foo

はい。完成です(笑)
2019/07/02(火) 05:02:22.44ID:Atdu9zIi
>>997
だから < <(cat) を使う場合の普遍的な解答
2019/07/02(火) 05:02:50.90ID:Atdu9zIi
やっぱり書き方を知らんだけだったな(笑)
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 283日 5時間 28分 4秒
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況