■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプト総合 その29
- 1 :デフォルトの名無しさん:2018/09/21(金) 23:34:47.98 ID:/eJt2TVD.net
- シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ:
シェルスクリプト総合 その28
http://mevius.5ch.net/test/read.cgi/tech/1532397676/
- 952 :デフォルトの名無しさん:2019/07/01(月) 22:55:29.41 ID:0UaOtlQU.net
- って、言ってるじゃんww
その直後にイミフのレスしてたんじゃん。なんなの?ww
- 953 :デフォルトの名無しさん:2019/07/01(月) 22:59:32.21 ID:2smzn43h.net
- なんで0か1かにそんなに拘るのか。
「シェルスクリプトでは可搬性のあるものは書けない」
という(間違った)認識に対して
「シェルスクリプトには可搬性を持たせられる」
と是正しただけなのにね。
そして可搬性の問題はシェルスクリプトに限らない。
どんな言語にも完全な可搬性はないし、かといって全く可搬性がない訳でもない。
それだけの話をどうしてこうも荒立てられるかね……。
- 954 :デフォルトの名無しさん:2019/07/01(月) 23:02:42.75 ID:ywGyCn2/.net
- まとめるとどこでも動くシェルスクリプトは都市伝説じゃなくて作れるってことだよね
- 955 :デフォルトの名無しさん:2019/07/01(月) 23:03:30.59 ID:0UaOtlQU.net
- ですw
- 956 :デフォルトの名無しさん:2019/07/01(月) 23:08:07.17 ID:0UaOtlQU.net
- >>955は>>953宛て
>>954
そうだよ。モノによるけどw
- 957 :デフォルトの名無しさん:2019/07/01(月) 23:20:50.03 ID:/rKj5XUf.net
- 次スレ
シェルスクリプト総合 その30
https://mevius.5ch.net/test/read.cgi/tech/1561989867/
- 958 :デフォルトの名無しさん:2019/07/01(月) 23:37:03.32 ID:4+biahsm.net
- おまえらまとめるの好きだよなw
- 959 :デフォルトの名無しさん:2019/07/01(月) 23:41:59.98 ID:KK3BgYtY.net
- POSIX (というか BSD の /bin/sh である dash?) に合わせたほうが幸せなのか
#!/bin/bash って書いて bash 限定にしたほうが幸せなのか。
個人的には後者でサクッと短時間でかつ可読性高く仕上げるのが好み。
- 960 :デフォルトの名無しさん:2019/07/01(月) 23:44:17.54 ID:GotlxjDf.net
- > というか BSD の /bin/sh である dash?
dashのdはdebian linuxのdな
> 個人的には後者でサクッと短時間でかつ可読性高く仕上げるのが好み。
それはPOSIX(dash)でもbashでも変わらん
- 961 :デフォルトの名無しさん:2019/07/02(火) 00:01:10.80 ID:p7jTc1Zw.net
- 可搬性云々は要件次第なんだよ
動作保証は Ubuntuのみで良いなら環境依存で書けばいい
- 962 :デフォルトの名無しさん:2019/07/02(火) 00:02:35.22 ID:Tm8GOmHy.net
- >>960
> dashのdはdebian linuxのdな
これは勉強不足で失礼いたしました。
>それはPOSIX(dash)でもbashでも変わらん
POSIX(dash) で [[ =~ ]] って簡潔に書ける?
for ((i=0;16>i;i++)) ; do (loop内で $i 更新あり) とかは?
- 963 :デフォルトの名無しさん:2019/07/02(火) 00:06:02.50 ID:+q6wCm94.net
- GNU拡張はGNUの方言だけどBSDにも方言くらいあるでしょ
BSDだけで盛られたコマンドってないの
- 964 :デフォルトの名無しさん:2019/07/02(火) 00:15:08.55 ID:Atdu9zIi.net
- >>962
> POSIX(dash) で [[ =~ ]] って簡潔に書ける?
多くはcaseで十分。足りなければexprを使えばいい。
> for ((i=0;16>i;i++)) ; do (loop内で $i 更新あり) とかは?
seqかwhileを使えばいい
- 965 :デフォルトの名無しさん:2019/07/02(火) 00:31:10.69 ID:rBxHnYzF.net
- >>964
exprってPOSIXだも正規表現処理できるのか。
- 966 :デフォルトの名無しさん:2019/07/02(火) 00:34:13.92 ID:uO4UDEG+.net
- 簡潔にって書いてあるだろうに
- 967 :デフォルトの名無しさん:2019/07/02(火) 00:37:15.66 ID:Tm8GOmHy.net
- >>964
loop 内更新ありだと seq はNG。
while は見た目簡潔じゃないし、インクリメント忘れる可能性もある。
- 968 :デフォルトの名無しさん:2019/07/02(火) 01:41:05.60 ID:Atdu9zIi.net
- >>966
> while は見た目簡潔じゃないし、インクリメント忘れる可能性もある。
忘れなければいいし、別に一行だろうが二行だろうが大差ない。
- 969 :デフォルトの名無しさん:2019/07/02(火) 01:43:35.24 ID:Atdu9zIi.net
- >>965
https://pubs.opengroup.org/onlinepubs/009695399/utilities/expr.html
> The ':' matching operator shall compare the string resulting from the evaluation of expr1 with
> the regular expression pattern
- 970 :デフォルトの名無しさん:2019/07/02(火) 01:44:27.35 ID:uO4UDEG+.net
- 好みって言っているのに。それはあなたの好み
好みに合うようななにかを提示するかスルーすればいいだろうに
- 971 :デフォルトの名無しさん:2019/07/02(火) 03:09:33.83 ID:rBxHnYzF.net
- >>962
[[ "$VAR" =~ '<regexp>' ]]
↓
expr "$VAR" : '<regexp>'
for ((i=0;16>i;i++)) ; do
echo $i
done
↓
i=0; while [ $i -lt 16 ]; do
echo $i
i=$((i+1)); done
こんなもんでいかがでしょ。
簡潔かつ高い可搬性を持ったシェルスクリプトになったと思う。
よければこれから書く可搬性の高いシェルスクリプトの参考にしてみて!
- 972 :デフォルトの名無しさん:2019/07/02(火) 03:45:23.93 ID:uO4UDEG+.net
- まさか、その変えた方が簡潔かつ高い可搬性を持ったという??
なんのためのbash(などの)の拡張なんだかだよ。俺には理解できない。まあ、ID:Tm8GOmHyが理解できたら特にだけど
- 973 :デフォルトの名無しさん:2019/07/02(火) 03:49:34.72 ID:uO4UDEG+.net
- ところで、while内での変数の変更とかどうしてんの?そんなにPOSIXに拘る人は
- 974 :デフォルトの名無しさん:2019/07/02(火) 03:52:13.98 ID:uO4UDEG+.net
- ああ、パイプでサブシェルになってしまう場合のwhileね。よく使うパターンの
- 975 :デフォルトの名無しさん:2019/07/02(火) 03:55:40.28 ID:Atdu9zIi.net
- たったこれだけの違いで大騒ぎ(笑)
- 976 :デフォルトの名無しさん:2019/07/02(火) 03:58:00.36 ID:uO4UDEG+.net
- お前がいうなw
- 977 :デフォルトの名無しさん:2019/07/02(火) 04:01:44.98 ID:Atdu9zIi.net
- >>974
今後の人生、サブシェルの中に移住すればいいだけだろ
cat dummy.txt | {
i=0
while IFS= read -r line; do
i=$((i+1))
done
echo "$i"
}
- 978 :デフォルトの名無しさん:2019/07/02(火) 04:05:15.58 ID:uO4UDEG+.net
- そのcatレベルで必要なんじゃね、普通は
そんな狭いパターンが主なのか?お前の人生は。俺の人生でそのパターンは少なさそう
そういうんじゃないよ普遍的wなのでだよ
- 979 :デフォルトの名無しさん:2019/07/02(火) 04:05:54.52 ID:Atdu9zIi.net
- >>978
イミフ。例を出せ例を
- 980 :デフォルトの名無しさん:2019/07/02(火) 04:12:40.39 ID:Atdu9zIi.net
- パターンを思いつかないのかレスが返ってこないので補足しておくと、
サブシェルになる場合というパターンだったから>>977のように書いたが
ファイルから読み取る場合は、そもそもサブシェルにしなくていい
i=0
while IFS= read -r line; do
i=$((i+1))
done < dummy.txt
echo "$i"
さて、>>978はどんなパターンを想定してるんだろうかw
- 981 :デフォルトの名無しさん:2019/07/02(火) 04:21:16.83 ID:uO4UDEG+.net
- なにか前処理
hoge=0
cat | while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done
if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi
とか。ループ中に例外的なのを検出した後にトップレベルで整理するとか。あとは、whileの後にもパイプで続けてその後でとか。局所的なので使うことはないな
気が短いなw
- 982 :デフォルトの名無しさん:2019/07/02(火) 04:29:33.75 ID:Atdu9zIi.net
- こうすればいいだけw
なにか前処理
cat | {
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done
if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi
}
- 983 :デフォルトの名無しさん:2019/07/02(火) 04:33:37.38 ID:uO4UDEG+.net
- ほんとうにそれでいいと思うのか?w
なんか無理してんなと思うけど、POSIXに拘る人はそう書くのねと理解はした、お応えありがとう
- 984 :デフォルトの名無しさん:2019/07/02(火) 04:35:32.93 ID:Atdu9zIi.net
- >>983
正しく動くし何も問題ない。
お前こそ、何も言い返せないのに
無理してレスしなくていいぞw
- 985 :デフォルトの名無しさん:2019/07/02(火) 04:37:28.40 ID:uO4UDEG+.net
- いやあ、ああいうのが普通な人には何も言い返せないよ。てか「言い返す」って。喧嘩かなんかなのか?w
- 986 :デフォルトの名無しさん:2019/07/02(火) 04:41:11.93 ID:Atdu9zIi.net
- 喧嘩じゃなくて、お前の意見を言えって。
正しく動くだろ?
なにか問題が有るのか?
- 987 :デフォルトの名無しさん:2019/07/02(火) 04:45:47.25 ID:Atdu9zIi.net
- シェルスクリプト初心者です。 { } の使い方がわかりません
とかいうなら、関数にでもすればいい
foo() {
なにか前処理
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done
if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi
}
cat | foo
お前の苦手な { } が無くてすんだぞw
サブシェルうんぬんの前に、関数の中で使う変数は、関数の中にとどめておけよ。
わかりやすいコーディングというのはこういうものだ
- 988 :デフォルトの名無しさん:2019/07/02(火) 04:47:32.87 ID:uO4UDEG+.net
- そのサブシェルの中で後は全部やるんでしょ?必要な部分を。それで問題無いと思うなら、それでいいんじゃないの
「なんか無理してんな」ってのがわからないんだったらそれはそれでいいよ。元ネタと同じく、好みの問題。好みがわからないでしょ
- 989 :デフォルトの名無しさん:2019/07/02(火) 04:50:12.51 ID:Atdu9zIi.net
- だから問題ないし、お前を含めて誰も問題があると言ってない。
お前さ、なんで自分で問題点を指摘できないのに
さも問題があるかのように装ってるわけ?
ばれないとでも思った?
- 990 :デフォルトの名無しさん:2019/07/02(火) 04:50:38.17 ID:uO4UDEG+.net
- なにか頑張ってるな。そんな話じゃないよ
知識自慢臭しかもうしませんよ?そんなの自慢げというか馬鹿にしたいだけなのか知らんけど
- 991 :デフォルトの名無しさん:2019/07/02(火) 04:53:12.30 ID:Atdu9zIi.net
- そんな話じゃないよ → じゃあどんな話なのか → 答えずに逃げる(笑)
- 992 :デフォルトの名無しさん:2019/07/02(火) 04:53:48.95 ID:uO4UDEG+.net
- 問題がある問題がないの話じゃないよ。好みだよ好み
そう次々あれこれ考えなくてもw bash(など)の拡張使えばスッキリだろうにという
- 993 :デフォルトの名無しさん:2019/07/02(火) 04:54:45.55 ID:Atdu9zIi.net
- >>987のどこがスッキリとしてないというのか?
お前ならbashでどう書き直す?w
- 994 :デフォルトの名無しさん:2019/07/02(火) 04:57:00.91 ID:uO4UDEG+.net
- hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done < <(cat)
if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi
そもそもやりたいことがレベルが変わらずにそのままでスッキリだなwあとあとでなにか追加もとかもね
- 995 :デフォルトの名無しさん:2019/07/02(火) 04:58:47.96 ID:Atdu9zIi.net
- >>994
それ、俺が書いたfoo関数の中身を書いただけじゃねーかw
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done
if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi
これで動くよ。
foo() {
上のコード
}
cat | foo
ってやればいいだけ
- 996 :デフォルトの名無しさん:2019/07/02(火) 05:01:09.48 ID:Atdu9zIi.net
- 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
- 997 :デフォルトの名無しさん:2019/07/02(火) 05:01:36.77 ID:uO4UDEG+.net
- いや、だから、お題に対してだけじゃなくな。普遍的にって言ってるでしょ
それが普遍的なのか?
なんで否定されたのをそんなに拘るねん。否定してんのは俺の好みじゃないってだけだぞ?w
- 998 :デフォルトの名無しさん:2019/07/02(火) 05:01:53.99 ID:Atdu9zIi.net
- 2. bash依存の命令をなくしましょう。
foo() {
hoge=0
while IFS= read -r line; do
[ なにか ] && hoge=1
ほかにいろいろ
done
if [ hoge = 0 ]; then
前処理の調整
else
前処理の調整
fi
}
cat | foo
はい。完成です(笑)
- 999 :デフォルトの名無しさん:2019/07/02(火) 05:02:22.44 ID:Atdu9zIi.net
- >>997
だから < <(cat) を使う場合の普遍的な解答
- 1000 :デフォルトの名無しさん:2019/07/02(火) 05:02:50.90 ID:Atdu9zIi.net
- やっぱり書き方を知らんだけだったな(笑)
- 1001 :2ch.net投稿限界:Over 1000 Thread
- 2ch.netからのレス数が1000に到達しました。
総レス数 1001
293 KB
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★