X



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

レス数が1000を超えています。これ以上書き込みはできません。
0935デフォルトの名無しさん
垢版 |
2019/07/01(月) 19:21:40.57ID:0UaOtlQU
そもそも可搬性可搬性って、そんなあれやこれやの環境を管理していんのかいっていう

シェルスクリプトで書けるものなんて全然たいしたことは書けないので、環境がしょうがなく変わったらそれに対して書き換えればいいだろうとしか思わんな
シェルクスリプトは単に補助的にしか使わない、本業は別の言語(IDE、最低限でもmakeが必要な)な俺は、可搬性可搬性って???だなw
0937デフォルトの名無しさん
垢版 |
2019/07/01(月) 19:41:01.62ID:ywGyCn2/
まとめるとどこでも動くC言語なんて都市伝説ってことだよね
C言語でゲームできないもん
0939デフォルトの名無しさん
垢版 |
2019/07/01(月) 20:52:04.97ID:2smzn43h
まあ要するに、POSIXに準拠しとけばかなり可搬性の高いシェルスクリプトが書ける。
でもどんな言語でもそうであるように「完璧で」「完全な」可搬性は実現できない。

しかしまあ俺個人としてはシェルスクリプトは可搬性を高めやすい言語だと思うけどね。
ちゃんと実装から独立した文書としての規格があるし。
0940デフォルトの名無しさん
垢版 |
2019/07/01(月) 20:55:17.40ID:2smzn43h
>>919
え?動作するんじゃないの?
>>917はあくまでコマンド同士のオプション形式が違うって言ってただけで
そのコマンド自体ではシステム間で互換性があるんでは?
0941デフォルトの名無しさん
垢版 |
2019/07/01(月) 21:09:18.21ID:0UaOtlQU
>>939
あと、不完全なPOSIX規格でも、それがあればこそなにかあってもポーティングがどちからという楽すぎってのも
0942デフォルトの名無しさん
垢版 |
2019/07/01(月) 21:29:02.92ID:2smzn43h
次スレ立てるときワッチョイを有効にしたいんだけど
どうすればいいんだっけ。
0944デフォルトの名無しさん
垢版 |
2019/07/01(月) 21:39:48.33ID:ywGyCn2/
>>938
だからシェルスクリプトで、外部コマンドが違っていて動かないというのなら、
C言語で、APIが違っていて動かないよね

でも言語(シェルスクリプト or C言語)は可搬性が有るよね
言語以外の部分が異なっていたとしても。

ってことだけど?
0945デフォルトの名無しさん
垢版 |
2019/07/01(月) 21:51:05.99ID:0UaOtlQU
>>944
なにを言いたいのかさっぱり。C言語ってわかってるの?
C言語でも>>934の通りだよ。C言語でゲームできないもんもイミフだったが、そのレスではソコの説明が書いてあるのかさえ不明w
0947デフォルトの名無しさん
垢版 |
2019/07/01(月) 22:28:22.64ID:KK3BgYtY
>>944
可搬性があるんじゃなくてコンパイルが通るだけ or プリプロセッサまでが通るだけ。
同じシステムコールでも SysV と BSD で動作が違うとかあって、コンパイル通るだけで碌に動かないものも出る。
C で可搬性を求めるなら automake 使ってどこが不都合かを確認しまくるしかない。
それも不完全なので最後は地道なデバッグ。
0949デフォルトの名無しさん
垢版 |
2019/07/01(月) 22:52:54.73ID:0UaOtlQU
>>948
いきなりな問いだなwそんなこと言った覚えはないぞ?どうした?
いや、Cだって>>934の通り、可搬性のあるモノは作れる。どういう「モノ」によるかだがな
0951デフォルトの名無しさん
垢版 |
2019/07/01(月) 22:54:29.90ID:ywGyCn2/
> いや、Cだって>>934の通り、可搬性のあるモノは作れる。どういう「モノ」によるかだがな

結局

シェルスクリプトだって、可搬性のあるモノは作れる。どういう「モノ」によるかだがな

という答えかよw
0952デフォルトの名無しさん
垢版 |
2019/07/01(月) 22:55:29.41ID:0UaOtlQU
って、言ってるじゃんww
その直後にイミフのレスしてたんじゃん。なんなの?ww
0953デフォルトの名無しさん
垢版 |
2019/07/01(月) 22:59:32.21ID:2smzn43h
なんで0か1かにそんなに拘るのか。
「シェルスクリプトでは可搬性のあるものは書けない」
という(間違った)認識に対して
「シェルスクリプトには可搬性を持たせられる」
と是正しただけなのにね。

そして可搬性の問題はシェルスクリプトに限らない。
どんな言語にも完全な可搬性はないし、かといって全く可搬性がない訳でもない。
それだけの話をどうしてこうも荒立てられるかね……。
0954デフォルトの名無しさん
垢版 |
2019/07/01(月) 23:02:42.75ID:ywGyCn2/
まとめるとどこでも動くシェルスクリプトは都市伝説じゃなくて作れるってことだよね
0959デフォルトの名無しさん
垢版 |
2019/07/01(月) 23:41:59.98ID:KK3BgYtY
POSIX (というか BSD の /bin/sh である dash?) に合わせたほうが幸せなのか
#!/bin/bash って書いて bash 限定にしたほうが幸せなのか。
個人的には後者でサクッと短時間でかつ可読性高く仕上げるのが好み。
0960デフォルトの名無しさん
垢版 |
2019/07/01(月) 23:44:17.54ID:GotlxjDf
> というか BSD の /bin/sh である dash?
dashのdはdebian linuxのdな

> 個人的には後者でサクッと短時間でかつ可読性高く仕上げるのが好み。
それはPOSIX(dash)でもbashでも変わらん
0961デフォルトの名無しさん
垢版 |
2019/07/02(火) 00:01:10.80ID:p7jTc1Zw
可搬性云々は要件次第なんだよ
動作保証は Ubuntuのみで良いなら環境依存で書けばいい
0962デフォルトの名無しさん
垢版 |
2019/07/02(火) 00:02:35.22ID:Tm8GOmHy
>>960
> dashのdはdebian linuxのdな
これは勉強不足で失礼いたしました。

>それはPOSIX(dash)でもbashでも変わらん
POSIX(dash) で [[ =~ ]] って簡潔に書ける?
for ((i=0;16>i;i++)) ; do (loop内で $i 更新あり) とかは?
0963デフォルトの名無しさん
垢版 |
2019/07/02(火) 00:06:02.50ID:+q6wCm94
GNU拡張はGNUの方言だけどBSDにも方言くらいあるでしょ
BSDだけで盛られたコマンドってないの
0964デフォルトの名無しさん
垢版 |
2019/07/02(火) 00:15:08.55ID:Atdu9zIi
>>962
> POSIX(dash) で [[ =~ ]] って簡潔に書ける?
多くはcaseで十分。足りなければexprを使えばいい。

> for ((i=0;16>i;i++)) ; do (loop内で $i 更新あり) とかは?
seqかwhileを使えばいい
0967デフォルトの名無しさん
垢版 |
2019/07/02(火) 00:37:15.66ID:Tm8GOmHy
>>964
loop 内更新ありだと seq はNG。
while は見た目簡潔じゃないし、インクリメント忘れる可能性もある。
0968デフォルトの名無しさん
垢版 |
2019/07/02(火) 01:41:05.60ID:Atdu9zIi
>>966
> while は見た目簡潔じゃないし、インクリメント忘れる可能性もある。
忘れなければいいし、別に一行だろうが二行だろうが大差ない。
0970デフォルトの名無しさん
垢版 |
2019/07/02(火) 01:44:27.35ID:uO4UDEG+
好みって言っているのに。それはあなたの好み
好みに合うようななにかを提示するかスルーすればいいだろうに
0971デフォルトの名無しさん
垢版 |
2019/07/02(火) 03:09:33.83ID:rBxHnYzF
>>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

こんなもんでいかがでしょ。
簡潔かつ高い可搬性を持ったシェルスクリプトになったと思う。
よければこれから書く可搬性の高いシェルスクリプトの参考にしてみて!
0972デフォルトの名無しさん
垢版 |
2019/07/02(火) 03:45:23.93ID:uO4UDEG+
まさか、その変えた方が簡潔かつ高い可搬性を持ったという??
なんのためのbash(などの)の拡張なんだかだよ。俺には理解できない。まあ、ID:Tm8GOmHyが理解できたら特にだけど
0973デフォルトの名無しさん
垢版 |
2019/07/02(火) 03:49:34.72ID:uO4UDEG+
ところで、while内での変数の変更とかどうしてんの?そんなにPOSIXに拘る人は
0974デフォルトの名無しさん
垢版 |
2019/07/02(火) 03:52:13.98ID:uO4UDEG+
ああ、パイプでサブシェルになってしまう場合のwhileね。よく使うパターンの
0977デフォルトの名無しさん
垢版 |
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"
}
0978デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:05:15.58ID:uO4UDEG+
そのcatレベルで必要なんじゃね、普通は
そんな狭いパターンが主なのか?お前の人生は。俺の人生でそのパターンは少なさそう
そういうんじゃないよ普遍的wなのでだよ
0980デフォルトの名無しさん
垢版 |
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
0981デフォルトの名無しさん
垢版 |
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
0982デフォルトの名無しさん
垢版 |
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
}
0983デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:33:37.38ID:uO4UDEG+
ほんとうにそれでいいと思うのか?w
なんか無理してんなと思うけど、POSIXに拘る人はそう書くのねと理解はした、お応えありがとう
0984デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:35:32.93ID:Atdu9zIi
>>983
正しく動くし何も問題ない。

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

正しく動くだろ?
なにか問題が有るのか?
0987デフォルトの名無しさん
垢版 |
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
サブシェルうんぬんの前に、関数の中で使う変数は、関数の中にとどめておけよ。
わかりやすいコーディングというのはこういうものだ
0988デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:47:32.87ID:uO4UDEG+
そのサブシェルの中で後は全部やるんでしょ?必要な部分を。それで問題無いと思うなら、それでいいんじゃないの
「なんか無理してんな」ってのがわからないんだったらそれはそれでいいよ。元ネタと同じく、好みの問題。好みがわからないでしょ
0989デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:50:12.51ID:Atdu9zIi
だから問題ないし、お前を含めて誰も問題があると言ってない。

お前さ、なんで自分で問題点を指摘できないのに
さも問題があるかのように装ってるわけ?
ばれないとでも思った?
0990デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:50:38.17ID:uO4UDEG+
なにか頑張ってるな。そんな話じゃないよ
知識自慢臭しかもうしませんよ?そんなの自慢げというか馬鹿にしたいだけなのか知らんけど
0992デフォルトの名無しさん
垢版 |
2019/07/02(火) 04:53:48.95ID:uO4UDEG+
問題がある問題がないの話じゃないよ。好みだよ好み
そう次々あれこれ考えなくてもw bash(など)の拡張使えばスッキリだろうにという
0994デフォルトの名無しさん
垢版 |
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あとあとでなにか追加もとかもね
0995デフォルトの名無しさん
垢版 |
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

ってやればいいだけ
0996デフォルトの名無しさん
垢版 |
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
0997デフォルトの名無しさん
垢版 |
2019/07/02(火) 05:01:36.77ID:uO4UDEG+
いや、だから、お題に対してだけじゃなくな。普遍的にって言ってるでしょ
それが普遍的なのか?

なんで否定されたのをそんなに拘るねん。否定してんのは俺の好みじゃないってだけだぞ?w
0998デフォルトの名無しさん
垢版 |
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

はい。完成です(笑)
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 283日 5時間 28分 4秒
レス数が1000を超えています。これ以上書き込みはできません。

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