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

■ このスレッドは過去ログ倉庫に格納されています
2018/09/22(土) 11:53:21.38ID:BBiLRgnj0
!extend:on:vvvvv:1000:512
!extend:on:vvvvv:1000:512
シェルスクリプトに関する総合スレッドです。

スレ立て時は以下の文を先頭行に加えて下さい。
後のつけ忘れ防止の為に複数行重ねて追加推奨
!extend:on:vvvvv:1000:512

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

前スレ
シェルスクリプト総合 その28
http://mevius.5ch.net/test/read.cgi/tech/1532397676/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/09/27(木) 11:06:37.78ID:RGPgoULv0
正論を書くとあらし認定されるんですね
93デフォルトの名無しさん (オッペケ Sr4b-+FqY)
垢版 |
2018/09/27(木) 12:20:46.63ID:99b9Jx0Mr
大体失礼なのはこの手の答えたがりw
94デフォルトの名無しさん (アウアウカー Saab-XaUO)
垢版 |
2018/09/27(木) 13:17:03.86ID:U92lHhY6a
>>70
それ set じゃなくて最後に echo i=$i だけで良いのでは?
2018/09/27(木) 14:01:53.41ID:wRik+4En0
>>94
だから汎用的な解だってばw
変数が複数あっても対応できるし
変数の中にエスケープが必要な文字があっても対応できる

あ、これに関して良いアイデアが浮かんできた。気がするw
2018/09/27(木) 14:05:58.33ID:wRik+4En0
こういう問題について考えていると、bashの拡張ってよく考えられてるなって思うよ
ちゃんと足りなくて必要な機能を追加してくれてる

https://qiita.com/t_nakayama0714/items/80b4c94de43643f4be51#prefix-%E5%A4%89%E6%95%B0%E5%90%8D%E4%B8%80%E8%A6%A7
2018/09/27(木) 17:43:23.75ID:GWQb325r0
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#compact
こういうのとかもすっげえ便利だよね。
$ VAR=val; echo ${VAR@A}
VAR='val'
でも新しい機能なのか,日本語版のマニュアルに掲載されてない。

(まあ俺はPOSIXに準拠したほうがいいと思ってるので,こういう機能は
それこそ一時的な使い捨てスクリプトにしか使わんけど)
98デフォルトの名無しさん (ワッチョイ bf9f-MYrK)
垢版 |
2018/09/28(金) 02:21:47.32ID:5yuIehG00
>>97
それCentOS7に入ってるbashではエラーになる。
新しい機能だな。
2018/09/28(金) 10:45:59.06ID:TLhVFQk50
ファイルのメディアタイプを取得する汎用な方法ってあるかな。
自作してもいいんだけどできれば既存のものを利用したい。
file(1)コマンドの-iオプションがまず思い付いたんだけど,これは
GNU/Linux(http://man7.org/linux/man-pages/man1/file.1.html
FreeBSD(https://www.freebsd.org/cgi/man.cgi?query=file&;sektion=1)
ではメディアタイプで出力するとあるのに対し
本家POSIX(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/file.html
Solaris(https://docs.oracle.com/cd/E26502_01/html/E29030/file-1.html
AIX(https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/com.ibm.aix.cmds2/file.htm
なんかでは特になんの指定もなし……。
メディアタイプなんてド標準なんだから,しっかり規定しておいてほしかったなぁ。
POSIX 2017あたりでさ。
2018/09/28(金) 13:07:01.59ID:bPXaydqo0
>>99
メディアタイプの種類自体は標準化されていたとしても、
あるファイルがどのメディアタイプかってのは決まらないでしょ?

拡張子cgiのスクリプトファイルだって、ソースコード配布サイトなら
テキストファイル扱いにしたいだろうし
2018/09/29(土) 13:10:10.20ID:d3Gl2lPg0
特別な意味をもたせた終了コードをなんにしようかな?って考えてるんだけど
既存で使われてる終了コードとなるべくかぶらせたくない。
どんなのがあるか知らない?

1, 2, 126, 127, 255(bashの予約)
0〜63(fsckで使用)
64〜78(sysexits ユーザー用のうち定義済みのもの)
128〜192(シグナルコードの範囲?)

参考

https://ja.wikipedia.org/wiki/%E7%B5%82%E4%BA%86%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9
https://linuxjm.osdn.jp/html/LDP_man-pages/man7/signal.7.html
https://linuxjm.osdn.jp/html/e2fsprogs/man8/fsck.8.html
http://kaworu.jpn.org/doc/FreeBSD/jman/man3/sysexits.3.php
http://tldp.org/LDP/abs/html/exitcodes.html

一番最後のリンクでsysexitsの作者は64〜113をユーザー用に使うことを提案してるみたいだけど
定義済みを除けば残りは79〜113かな
102デフォルトの名無しさん (ワッチョイ 5780-q1nr)
垢版 |
2018/09/29(土) 13:18:50.90ID:IuTgmxg/0
オツムに欠陥があるヤツでなければ
普通に別の環境変数にいれる
2018/09/29(土) 14:08:42.53ID:PPHj/b7C0
>>101
ていうか寧ろそのなかのどれかでいいんじゃないの?

それともその定義に収まらないエラーなの?
鼻からドラゴンが出ました!exit 80 とか。
2018/09/29(土) 15:12:55.62ID:d3Gl2lPg0
>>103
そう言われるかなとは思ったw

「俺の作ったプログラム」 ==> 「俺の作ったフィルタ」 ==> 「任意のプログラム」

という呼び出しの流れで

「俺の作ったプログラム」 で「任意のプログラム」 の終了コードを知りたいが、
「俺の作ったフィルタ」 独自の終了コードだけは特別扱いしたいということ

「任意のプログラム」のエラーは想定外のエラーで
「俺の作ったフィルタ」のエラーは想定されたエラーで
どちらもエラーではあるんだけど「俺の作ったプログラム」で表示するメッセージが違う
それぐらいなので、かぶってしまっても大きな問題は発生しないんだけどね
2018/09/29(土) 17:52:02.97ID:PPHj/b7C0
>>104
なるほど。
たしかにそういう目的ならば,終了コードが混ざる≠フはよくないな。
しかし例えばapt(1)は非root権限でシステム操作しようとすると
exit 100を返すというトンデモ仕様[Debian 2015]なので,もうどうしようもないんじゃねw
せっかくsysexitに権限異常を示す77があるのにどうして100番を使ってしまったのか……。

[Debian 2015]: https://manpages.debian.org/stretch/apt/apt.8.ja.html#%E8%A8%BA%E6%96%AD%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8
2018/09/29(土) 17:54:32.38ID:PPHj/b7C0
ああ,なんか説明不足で投稿しちゃった。
つまりさ,一応標準で定められたエラー番号はあるものの,
各種アプリケーションが従っている訳でもなく
Debian系のaptコマンドのような超大手のアプリケーションでさえ標準を無視してるんだから,
> 定義済みを除けば残りは79〜113かな
↑こういうのは考えないほうがいいんじゃない? ってこと。
2018/09/29(土) 18:22:23.04ID:d3Gl2lPg0
>>105-106
どこかのなにかにかぶってしまうのは防ぎようがないけど
よく使われるコマンドがこんな終了コードを使っていたっていう事例を知りたいのよ

fsckとかどう見てもエラーじゃねーだろコレっていうのが
エラーあつかいになってて以前はハマったことあるしw

https://linuxjm.osdn.jp/html/e2fsprogs/man8/fsck.8.html
> 1 - ファイルシステムのエラーが修正された
2018/09/29(土) 18:23:25.37ID:d3Gl2lPg0
標準に準拠したいとかそういう話ではなく
単にぶつかりたくないだけ
2018/09/29(土) 18:24:45.45ID:d3Gl2lPg0
> exit 100を返すというトンデモ仕様[Debian 2015]なので,もうどうしようもないんじゃねw

実を言うと今100を使おうとしていたw
やはり裏の裏の裏の裏ぐらいを読まないとダメだなw
2018/09/29(土) 18:40:55.97ID:PPHj/b7C0
非0の返り値だけどコマンドは成功しているっていう例として有名なのはdiff(1)とかかな。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/diff.html#tag_20_34_14
>1
>  Differences were found.
2018/09/29(土) 18:46:56.62ID:8M0IW2fy0
シグナルでも使ってみたらどうだろうか。
あるいは別にパイプを用意するとか。
112デフォルトの名無しさん (ワッチョイ bf9f-MYrK)
垢版 |
2018/09/30(日) 02:44:50.58ID:KPqVv5wd0
絶対にぶつからないようにするには別の方法でエラーを伝えるようにするぐらいしか方法ないんじゃないか?
同じ値になる可能性のあるものをどちらから発生したかわからない状態で同じ所から得るなんてやはり無理があるだろう。
2018/10/01(月) 01:15:09.47ID:2Ehpmx/A0
こんな書き方できたのか

a=1
case $a in
( 1 ) echo ok
esac
2018/10/01(月) 02:02:45.71ID:IEGoOL+v0
お、おう
2018/10/02(火) 19:23:29.52ID:6qOrAQgQ0
お題

ある関数に対して、apple orange banana ... とN個(Nは任意の個数)の引数を渡した時、
以下のような、引数とその引数のインデックス番号を出力する関数を作成せよ
(単語に対して数値が対応しているわけではない)

apple 1
orange 2
banana 3



ただし、外部コマンド、拡張POSIX機能、変数の使用は禁止とする
(ここでいう変数とはsetコマンドで表示されるもののことである)
2018/10/02(火) 21:27:13.63ID:yoF3UpeG0
>>115
argidx()
{
i=1
for argv in "$@"; do
echo "${argv}" $i
i=$((i+1))
done
}
簡単すぎ
2018/10/02(火) 21:45:46.37ID:yoF3UpeG0
おいこら答えてやったんだからなんとか言えよコラ
エレガントすぎて腰が抜けたか?wwwww

まあ実際,自分で言うのもなんだけどかなり最良に近い方法じゃないかしら。
・POSIX.1-2017準拠
・空白などを含む引数も直感的に指定可能("word with space")
・単純 構造が簡単
・数値の増加にexpr(1)ではなく算術式を利用している為速い
2018/10/02(火) 22:03:54.77ID:kkfm+1S90
変数禁止だから不正解じゃない?
2018/10/02(火) 22:15:20.79ID:xDUI5Isc0
>>115といい、>>117といい変なヤツしかいないやんけ
2018/10/02(火) 23:00:16.05ID:xTxFBCr4a
最初の一個だけならスマートだったのに
褒められたがりが
2018/10/03(水) 00:30:44.79ID:ej0n10jM0
煽りだよ だって明らかに学校の課題かなにかでしょ。
そんなのに真面目に付き合うほど俺は素直じゃない。
2018/10/03(水) 00:44:57.49ID:m57KKa9e0
苦しすぎな言い訳w
2018/10/03(水) 01:48:10.18ID:ej0n10jM0
まあそう思っとけw
124デフォルトの名無しさん (ワッチョイ bf9f-aemA)
垢版 |
2018/10/03(水) 01:59:13.13ID:jikKostS0
>>115
echo は使っては駄目? 拡張されていない sh だと echo はビルトインではなく /usr/bin/echo だと思うが。
2018/10/03(水) 02:01:17.96ID:NkO7phbc0
>>118
そう。変数禁止なので不正解

>>121
変数禁止とか学校の課題ででるわけないじゃないw
2018/10/03(水) 02:03:27.25ID:NkO7phbc0
>>124
使ってOK。
俺の知る限りechoがビルトインでないものは知らない

関係ないけどechoみたいな基本的なコマンドが
シェルによって挙動が違うのはどうにか
ならなかったんだろうか
2018/10/03(水) 02:14:54.02ID:NkO7phbc0
そうか。evalとか外部コマンドは実装不可能なものを除いて
ビルトインで実装することなんて決まりはないのか

では外部コマンドの定義を「現存するシェルでビルトインで実装されたことがないもの」にしよう

オレオレシェル作ってビルトインするのは問題の意図から外れるので、
現存する(誰もが容易に入手可能な)いずれかのシェルで
ビルトインされているならば使って良いものとする
2018/10/03(水) 02:18:56.23ID:NkO7phbc0
あと拡張POSIX機能も使用してOKにしよう。
それを実現する裏技みたいなのがあったら嫌だなと思って入れたが、
もしそれでできるなら俺も勉強になるし。

ようするにPATH環境変数を空にして、どれかのシェルで動けばOKってことだな
条件がグダグダになってしまったw
129デフォルトの名無しさん (アウアウカー Saab-XaUO)
垢版 |
2018/10/03(水) 12:27:47.15ID:61GCF4dla
if や while を外部コマンド動かさずに使うには [ がビルトインのシェルでないとダメだな。
昔の sh は [ が test コマンドへのシンボリックリンクで外部コマンドだったし。
今でもその名残で /bin または /usr/bin に [ が入ってるよな。
2018/10/03(水) 13:43:00.79ID:NkO7phbc0
別件で現在主要のシェルで何がビルトインか調べたことがあるよ

. : [ break cd command continue echo eval exec exit export false kill pwd
read readonly return set shift test times trap true umask unset wait

これらは全てのシェルで使えると言っていいだろう

poshはログインシェルとしては使わないもの扱いなのか
alias bg fg type ulimitが削除されている。(typeないとか地味につらい)
busyboxはgetoptsがないみたい

意外だったのはprintfがビルトインでないシェルがmkshとposhの2つもあったこと。
しかも両方共echoでエスケープシーケンスを解釈してくれるから文字をそのまま出力できない。
mkshの方はset -o posixでエスケープシーケンスを無効にできるしビルトインのprintで代用できるんだが
poshは調べた限りビルトインコマンドでそのまま出力する方法がない
2018/10/03(水) 13:47:38.74ID:m57KKa9e0
いいから、お題の参考答えを出しなさいw
オレオレ定義が曖昧すぎでお題になってないから、もういいでしょ
2018/10/03(水) 13:57:02.54ID:NkO7phbc0
>>131
問題訂正してやるから、もう少し頑張れやw

お題

ある関数に対して、apple orange banana ... とN個(Nは任意の個数)の引数を渡した時、
以下のような、引数とその引数のインデックス番号を出力する関数を作成せよ
(単語に対して数値が対応しているわけではない)

apple 1
orange 2
banana 3



ただし、変数の使用は禁止とし、シェル機能とビルトインコマンドのみを用いること
(ここでいう変数とはsetコマンドで表示されるもののことである)
(使用するコマンドはいずれかのシェルのビルトインコマンドであればよいが、
この問題用に独自シェルを作成するのは禁止とする)
2018/10/03(水) 13:59:49.96ID:m57KKa9e0
なんの目的かさっぱりわからんな。自分でできてんの?っていう疑問からなんだけどなw

>変数の使用は禁止とし
>(ここでいう変数とはsetコマンドで表示されるもののことである)
環境変数のことを言っているのかと思えば違うし、これだけでも曖昧というかオレオレ定義が曖昧だろう
2018/10/03(水) 14:11:05.97ID:NkO7phbc0
>>133
setコマンド実行してみてみばわかるでしょw

setコマンドで表示される変数はシェル変数(環境変数含む)だよ
それを使うのは禁止ってこと
2018/10/03(水) 14:13:32.35ID:NkO7phbc0
今日の24時までに答えが出なければヒント出しますw
2018/10/03(水) 14:16:57.73ID:6m7pNgyW0
そのヒントとやらもグダグダなんでしょw
2018/10/03(水) 14:17:05.40ID:m57KKa9e0
変数を使わない 言語(マシン語すら) は知らんなあ。そういう縛りを設けての目的はなんなん?
やってみたできるけど、クソのようなwにしかならんから、どうか、参考の答えを出してw
2018/10/03(水) 14:19:23.20ID:NkO7phbc0
答えは明日。まあヒントみれば気づく人はすぐわかるでしょう。
コロンブスの卵だよ
2018/10/03(水) 14:20:30.02ID:m57KKa9e0
なんで常時上から目線なのかw コードで語ればいいのに
素晴らしいコードならそんなおれおれ上から目線しなくてもいいくらいなのに。なんかしらんがもったいつけてのまだ「ヒント」とかもったいつけてるしw
2018/10/03(水) 14:21:39.64ID:m57KKa9e0
なんかしらんが見つけて、俺すげーしたいだけっぽいなw
2018/10/03(水) 14:22:11.11ID:NkO7phbc0
> そういう縛りを設けての目的はなんなん?
その理由も答えと一緒に明かします
2018/10/03(水) 14:23:23.18ID:m57KKa9e0
いや、もういらんわw なんかキモすぎて付き合いきれないw
2018/10/03(水) 14:36:43.15ID:ej0n10jM0
多分だけど学校の課題だと予想
根拠は二点:
1. 問題が実利的でない。学校(それもあまり学力の高くない)にありがちな「こんなのできるかな?」系の問題である。
2. 煽ったらそれに乗っかって答えを出してくれる人が思ってるという点で質問者が精神的に幼ない。(高校生くらいか?)
2018/10/03(水) 14:45:22.66ID:m57KKa9e0
posh とかいつもの人でしょ
いつもの人が学校の課題をしなきゃならん人なのか知らんけどw
2018/10/03(水) 15:06:30.08ID:ej0n10jM0
poshなんていうシェルがあるのね。初耳だわ。
2018/10/03(水) 15:10:04.24ID:NkO7phbc0
>>2に書いてあるよ。俺もここ(の何スレか前)で初めて知った
147デフォルトの名無しさん (アウアウカー Saab-XaUO)
垢版 |
2018/10/03(水) 15:58:50.21ID:4kFnpcnsa
$# と shift を使って逆順に値を付加することは簡単にできたんだがな。
2018/10/03(水) 17:25:26.25ID:NkO7phbc0
>>147
俺も第一歩目はそこまでだったw
俺の本来の目的(今回の問題とは別件)は逆順でも実現できたんだけど
なんか悔しかったので、もう一歩進めたら逆にすることなく実現できた
2018/10/03(水) 21:20:26.89ID:SM8JpmZX0
ちょっと前にもこんなグダグダ無かったっけ?
150デフォルトの名無しさん (アウウィフ FFdb-LSDD)
垢版 |
2018/10/03(水) 21:48:53.18ID:Tma5IQlaF
変数使ってはダメって、非合理的でない?
シェルの仕様否定してどーするの?
外部コマンドだって、それがUNIXの設計思想なんだからそれさえも否定するってのも理解不能

ならば、OSそのものを仮想的なものを仮定して
その上で動かすとでもしないと
大昔の情報処理技術者試験用に作られたアセンブラみたいな感じでさ

変数使わない、外部コマンド使用禁止、そんなアルゴリズムが何の役に立つんだろう?
2018/10/03(水) 22:35:14.41ID:ej0n10jM0
でも前はワッチョイやIDがなかったから もっと酷かった。
今はNGすればオッケー☆
2018/10/04(木) 00:37:38.01ID:8ua9ZMtc0
ヒント忘れてたわw

func() {
 *********
 while [ $# -gt 1 ]; do
  *********
  shift
 done
}

func apple orange banana

********の所は1行とは限りません
2018/10/04(木) 00:41:45.65ID:8ua9ZMtc0
>>150
シェルスクリプトはPOSIXの範囲では
ローカル変数がないから、変数名がかぶると困るんだよ
もちろんサブシェルを使うという手もあるが
引き出しは多いほうが良い
2018/10/04(木) 00:43:44.36ID:8ua9ZMtc0
>>151
それなw 見たくないやつが絡んでこなくなったので
過ごしやすくなった。
2018/10/04(木) 00:46:12.13ID:8ua9ZMtc0
>>150
ちなみにこれアルゴリズムじゃないよ
アルゴリズム系だと一時変数を使わずに変数を入れ替える方法とかあるけど
これはシェルの機能を使った、あぁ、なるほど系の問題
2018/10/04(木) 00:49:17.75ID:C6pwZkBD0
いきなりレス数増えたと思ったらもう木曜か
2018/10/04(木) 04:55:02.39ID:/YMF27MO0
>>152よ、お前のなかでは「$#」は変数じゃないのか……。
人様にクイズとやらを出す前にシェルとはなんなのかを学んだらどうだ?
2018/10/04(木) 05:43:44.35ID:8ua9ZMtc0
出題ぐらいちゃんと読もうぜw

> ただし、変数の使用は禁止とし、シェル機能とビルトインコマンドのみを用いること
> (ここでいう変数とはsetコマンドで表示されるもののことである)
2018/10/04(木) 08:51:53.43ID:/YMF27MO0
bash 4.2以降はset組み込みコマンドの中に$#が含まれるようになったんだよなぁ…
ちゃんと調べて、どうぞ。
2018/10/04(木) 09:17:07.53ID:8ua9ZMtc0
ないですね。ちゃんと調べてどうぞ

foo() { set | grep '#='; }; foo



$ bash --version
GNU bash, バージョン 4.4.19(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>;

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
161デフォルトの名無しさん (アウアウカー Sa0a-iYeS)
垢版 |
2018/10/04(木) 09:50:29.05ID:8DudSISka
>>160
grap のパターンはそれでいいのか?
2018/10/04(木) 10:01:44.50ID:8ua9ZMtc0
>>161
良いに決まってるだろ
正規表現に自信がないなら自分で調べたら?
質問してるってことは、動かしてないんだろうし。
163デフォルトの名無しさん (アウアウカー Sa0a-iYeS)
垢版 |
2018/10/04(木) 10:47:30.53ID:8DudSISka
ああ。そうか。最初の$は要らないからそれでいいのか。
2018/10/04(木) 14:55:58.09ID:7ib5/eAS0
grap コマンドか、なんか強うそうなイメージ
2018/10/04(木) 16:22:52.78ID:/YMF27MO0
なんかもう誰かが作ってそうだよね。
まるでyaから始まる4文字のソフトウェアが被りまくってるように。
2018/10/04(木) 16:55:15.20ID:8ua9ZMtc0
犯人はya
2018/10/04(木) 20:00:19.77ID:8ua9ZMtc0
正解者もいないようなのででは解答
このコードがどういうときに有用かは>>153で書いたとおり
set は使わなくても別にもう一つ関数を作れば同じことができるが
関数を作らずとも引数の再設定という方法がある。意外と便利だよ

func() {
set -- "$@" $(($#+2))

while [ $# -gt 1 ]; do
eval "echo \"$1 \$((\$$#-$#))\""
shift
done
}

func apple orange banana
2018/10/04(木) 20:11:54.69ID:n5lIiyiD0
そんなクソなコードを意気揚々としてあげてるけどさ、なんか変数被るからというもっともらしい言い訳してたけど、なるべく変数使わないように書くわけだ、これから。ほーっw。そんなのクソだな、個人的にw

なんでそういうお題をそんな俺偉いじゃなくてできないのかな。よほどそれを出すのに時間かかったとか??
2018/10/04(木) 20:12:23.41ID:8ua9ZMtc0
はい。想定通りのレスだね。
言い訳だけは一人前w
2018/10/04(木) 20:13:26.14ID:n5lIiyiD0
いや、ふつうわかるだろう。まあ、かなり頑張って出したんだね、やっぱりw
2018/10/04(木) 20:14:13.91ID:8ua9ZMtc0
じゃあもう一問。そんなに言うなら次は答えてね
2018/10/04(木) 20:15:02.61ID:n5lIiyiD0
だから、なんでそんな上から目線なのよ
んなのに付き合うと思ってるの?あんた自体が上から目線でモノ言われたらすぐ反発するくせにww
2018/10/04(木) 20:18:43.51ID:n5lIiyiD0
いや、上から目線じゃなくても反論されたらかwww
2018/10/04(木) 20:20:37.56ID:8ua9ZMtc0
>>172
お前はこのおっさんと同じ種類の人間だろうな
相手が下だと思って接してるやつ。
まずお前が上から目線を止めたら?

https://togetter.com/li/1175445
おっさんがタメ語で聞いてきたからタメ語で返したらショックを受けてた。敬意が返ってくると思ってる日本のおっさんって不思議。
2018/10/04(木) 20:24:38.91ID:n5lIiyiD0
いや、お前に合わせているだけだな。さすが常時上から目線なんかしらんが常時上に立ちたいの人は言うことが違うなw
2018/10/04(木) 20:27:29.69ID:8ua9ZMtc0
上にたってるつもりはないんですが、上に見えちゃうんですかね?w

悪い奴らが「正義の味方のつもりかよwww」って
笑ってるようなシーンがあるけど、あれも悪い奴らに
正義に見えてるからそう言うんでしょうねぇ
2018/10/04(木) 20:28:28.79ID:n5lIiyiD0
忘れているのか常時上に立っているつもりで気がつけないwのか知らんが、ID:8ua9ZMtc0 の上から目線なレスに対しての俺のレスでしかないよ
なので、その得意げの>>174はそっくりそのままあんたにお返しいたします
2018/10/04(木) 20:29:44.58ID:n5lIiyiD0
あーあ、病気なのか社会性がないのか話にならんな。まあ、いつもの無理やりなごまかしモードかな?w
179デフォルトの名無しさん (ワッチョイ 9c03-GavF)
垢版 |
2018/10/04(木) 20:33:31.45ID:vhCji18k0
目くそ鼻くそに上も下もないわwwww
2018/10/04(木) 20:34:30.94ID:n5lIiyiD0
やかましいわっw
2018/10/04(木) 20:50:21.03ID:8ua9ZMtc0
これはある意味有名だから簡単だと思う

お題

ある関数に対して1以上の整数Nを引数にして呼び出した時、
1からNまでを出力する関数を作成せよ(要するにseqコマンドの簡易版)

seq 5
1
2
3
4
5



ただし、シェルビルトイン関数のみを使い、変数の使用は禁止とする
(ここでいう変数とはsetコマンドで表示されるもののことである)
182デフォルトの名無しさん (ワッチョイ 9c03-GavF)
垢版 |
2018/10/04(木) 20:52:49.73ID:vhCji18k0
>>181
調子にのるな鼻くそ
183デフォルトの名無しさん (アウアウカー Sa0a-iYeS)
垢版 |
2018/10/04(木) 21:39:22.36ID:sVn7z6Qaa
>>167
それ最初のposix縛りがあったら解けなくないか?
$(( ))で計算させてるし。
2018/10/04(木) 23:11:17.39ID:4+O8yrpt0
こいつ構わん方がいいゼ、俺スゲーしたいだけだから
2018/10/04(木) 23:14:04.78ID:GYhkNq19a
レス番飛び過ぎにも程があるだろ
まぁいつもの長文だらだら流して悦に浸ってるんだろうが
2018/10/04(木) 23:32:35.30ID:n5lIiyiD0
>>183
http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html

2004の時点であるらしい。++と--は任意。sizeof()なんてあるのかよっ
2018/10/04(木) 23:46:42.45ID:/YMF27MO0
>>181
これは興味から訊くんだけど,
「(POSIXの範囲では)変数の局所化ができないので
変数をなるべく使わないべき」
という主張は理解できるし,俺自身もそう思う。
しかしシェルビルトイン関数しか使わず,例えば
sed(1)やawk(1)など目的に合った有用なコマンドを用いない理由はなんだ?
ただの趣味?
2018/10/05(金) 01:23:25.22ID:x9IT1j0q0
>>181
$(( )) での計算をしていいなら簡単だよ。

#!/bin/bash

f() {
if [[ $1 -gt 0 ]]; then
f $(( $1 - 1 ))
echo $1
fi
}

f $1
2018/10/05(金) 01:24:51.76ID:x9IT1j0q0
>>186
そうだったのか。
2018/10/05(金) 02:53:44.46ID:bSHFQ9XI0
>>187
現実的なポータビリティと速度のため

POSIXの範囲でやれば、シェルが異なっても動くことが期待できる
だけど現実的にはすべての環境がPOSIXに準拠してるわけではない
特にbusyboxは組み込み向けに必要最小限の機能に減らせるから
sedやawkすらない環境というのもあり得るだろう

そしてもう一つforkは遅い。WSL上だと目に見えて遅い
以下のコードをWSLで実行すると約25秒かかる。fork一回あたり2.5ミリ秒
Linuxだと約2秒。fork1回あたり2ミリ秒。10倍以上の差がある
i=0
while [ $i -lt 10000 ]; do
( :; )
i=$((i+1))
done

この()を外すとWSL上で0.05秒にまで減る。コマンド実行のオーバーヘッドに
埋もれてしまってよくわからないので、10,000から1,000,000から増やすと約1.7秒
つまり一回あたり0.0017ミリ秒。この値はLinuxでも変わらない

外部コマンドの実行でもforkが行われるから
Linux・・・0.0017ミリ秒 → 2ミリ秒 (約1176倍)
WSL・・・0.0017ミリ秒 → 25ミリ秒 (約14706倍)
と大幅に速度が落ちる。シェルスクリプトが遅いと言われる原因の一つ
191デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/05(金) 02:58:21.89ID:elz6X2140
なんもわかってない低学歴知恵遅れが
はりきってしょうもないwsl使ってキャッキャッいってるわけか

なるほどなるほど

wsl使ってるのなんかニートぐらいしかいないわ
マジで
2018/10/05(金) 03:00:21.47ID:bSHFQ9XI0
>>188
やっぱり簡単だったかw
再帰を使うやり方で関数型言語ではおなじみの問題

もちろんシェルスクリプトは関数型ではないし
末尾最適化も行われないのでどうしても遅くなる
さすがにこれは変数使ったほうが良いかな思ったw

他にも問題を作れそうなネタのはいくつかあるんで
気が向いたらまた問題にしてみるよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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