[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2ch.scのread.cgiへ]
Update time : 01/12 09:15 / Filesize : 284 KB / Number-of Response : 907
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2018/09/22(土) 11:53:21.38 ID:BBiLRgnj0.net]
!extend:on:vvvvv:1000:512
!extend:on:vvvvv:1000:512
シェルスクリプトに関する総合スレッドです。

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

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

前スレ
シェルスクリプト総合 その28
mevius.5ch.net/test/read.cgi/tech/1532397676/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

99 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 10:45:59.06 ID:TLhVFQk50.net]
ファイルのメディアタイプを取得する汎用な方法ってあるかな。
自作してもいいんだけどできれば既存のものを利用したい。
file(1)コマンドの-iオプションがまず思い付いたんだけど,これは
GNU/Linux(man7.org/linux/man-pages/man1/file.1.html
FreeBSD(https://www.freebsd.org/cgi/man.cgi?query=file&sektion=1)
ではメディアタイプで出力するとあるのに対し
本家POSIX(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あたりでさ。

100 名前:デフォルトの名無しさん mailto:sage [2018/09/28(金) 13:07:01.59 ID:bPXaydqo0.net]
>>99
メディアタイプの種類自体は標準化されていたとしても、
あるファイルがどのメディアタイプかってのは決まらないでしょ?

拡張子cgiのスクリプトファイルだって、ソースコード配布サイトなら
テキストファイル扱いにしたいだろうし

101 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 13:10:10.20 ID:d3Gl2lPg0.net]
特別な意味をもたせた終了コードをなんにしようかな?って考えてるんだけど
既存で使われてる終了コードとなるべくかぶらせたくない。
どんなのがあるか知らない?

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
kaworu.jpn.org/doc/FreeBSD/jman/man3/sysexits.3.php
tldp.org/LDP/abs/html/exitcodes.html

一番最後のリンクでsysexitsの作者は64〜113をユーザー用に使うことを提案してるみたいだけど
定義済みを除けば残りは79〜113かな

102 名前:デフォルトの名無しさん [2018/09/29(土) 13:18:50.90 ID:IuTgmxg/0.net]
オツムに欠陥があるヤツでなければ
普通に別の環境変数にいれる

103 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 14:08:42.53 ID:PPHj/b7C0.net]
>>101
ていうか寧ろそのなかのどれかでいいんじゃないの?

それともその定義に収まらないエラーなの?
鼻からドラゴンが出ました!exit 80 とか。

104 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 15:12:55.62 ID:d3Gl2lPg0.net]
>>103
そう言われるかなとは思ったw

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

という呼び出しの流れで

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

「任意のプログラム」のエラーは想定外のエラーで
「俺の作ったフィルタ」のエラーは想定されたエラーで
どちらもエラーではあるんだけど「俺の作ったプログラム」で表示するメッセージが違う
それぐらいなので、かぶってしまっても大きな問題は発生しないんだけどね

105 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 17:52:02.97 ID:PPHj/b7C0.net]
>>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

106 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 17:54:32.38 ID:PPHj/b7C0.net]
ああ,なんか説明不足で投稿しちゃった。
つまりさ,一応標準で定められたエラー番号はあるものの,
各種アプリケーションが従っている訳でもなく
Debian系のaptコマンドのような超大手のアプリケーションでさえ標準を無視してるんだから,
> 定義済みを除けば残りは79〜113かな
↑こういうのは考えないほうがいいんじゃない? ってこと。

107 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:22:23.04 ID:d3Gl2lPg0.net]
>>105-106
どこかのなにかにかぶってしまうのは防ぎようがないけど
よく使われるコマンドがこんな終了コードを使っていたっていう事例を知りたいのよ

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

https://linuxjm.osdn.jp/html/e2fsprogs/man8/fsck.8.html
> 1 - ファイルシステムのエラーが修正された



108 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:23:25.37 ID:d3Gl2lPg0.net]
標準に準拠したいとかそういう話ではなく
単にぶつかりたくないだけ

109 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:24:45.45 ID:d3Gl2lPg0.net]
> exit 100を返すというトンデモ仕様[Debian 2015]なので,もうどうしようもないんじゃねw

実を言うと今100を使おうとしていたw
やはり裏の裏の裏の裏ぐらいを読まないとダメだなw

110 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:40:55.97 ID:PPHj/b7C0.net]
非0の返り値だけどコマンドは成功しているっていう例として有名なのはdiff(1)とかかな。
pubs.opengroup.org/onlinepubs/9699919799/utilities/diff.html#tag_20_34_14
>1
>  Differences were found.

111 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:46:56.62 ID:8M0IW2fy0.net]
シグナルでも使ってみたらどうだろうか。
あるいは別にパイプを用意するとか。

112 名前:デフォルトの名無しさん [2018/09/30(日) 02:44:50.58 ID:KPqVv5wd0.net]
絶対にぶつからないようにするには別の方法でエラーを伝えるようにするぐらいしか方法ないんじゃないか?
同じ値になる可能性のあるものをどちらから発生したかわからない状態で同じ所から得るなんてやはり無理があるだろう。

113 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 01:15:09.47 ID:2Ehpmx/A0.net]
こんな書き方できたのか

a=1
case $a in
( 1 ) echo ok
esac

114 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 02:02:45.71 ID:IEGoOL+v0.net]
お、おう

115 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 19:23:29.52 ID:6qOrAQgQ0.net]
お題

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

apple 1
orange 2
banana 3



ただし、外部コマンド、拡張POSIX機能、変数の使用は禁止とする
(ここでいう変数とはsetコマンドで表示されるもののことである)

116 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 21:27:13.63 ID:yoF3UpeG0.net]
>>115
argidx()
{
i=1
for argv in "$@"; do
echo "${argv}" $i
i=$((i+1))
done
}
簡単すぎ

117 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 21:45:46.37 ID:yoF3UpeG0.net]
おいこら答えてやったんだからなんとか言えよコラ
エレガントすぎて腰が抜けたか?wwwww

まあ実際,自分で言うのもなんだけどかなり最良に近い方法じゃないかしら。
・POSIX.1-2017準拠
・空白などを含む引数も直感的に指定可能("word with space")
・単純 構造が簡単
・数値の増加にexpr(1)ではなく算術式を利用している為速い



118 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 22:03:54.77 ID:kkfm+1S90.net]
変数禁止だから不正解じゃない?

119 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 22:15:20.79 ID:xDUI5Isc0.net]
>>115といい、>>117といい変なヤツしかいないやんけ

120 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 23:00:16.05 ID:xTxFBCr4a.net]
最初の一個だけならスマートだったのに
褒められたがりが

121 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 00:30:44.79 ID:ej0n10jM0.net]
煽りだよ だって明らかに学校の課題かなにかでしょ。
そんなのに真面目に付き合うほど俺は素直じゃない。

122 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 00:44:57.49 ID:m57KKa9e0.net]
苦しすぎな言い訳w

123 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 01:48:10.18 ID:ej0n10jM0.net]
まあそう思っとけw

124 名前:デフォルトの名無しさん [2018/10/03(水) 01:59:13.13 ID:jikKostS0.net]
>>115
echo は使っては駄目? 拡張されていない sh だと echo はビルトインではなく /usr/bin/echo だと思うが。

125 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:01:17.96 ID:NkO7phbc0.net]
>>118
そう。変数禁止なので不正解

>>121
変数禁止とか学校の課題ででるわけないじゃないw

126 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:03:27.25 ID:NkO7phbc0.net]
>>124
使ってOK。
俺の知る限りechoがビルトインでないものは知らない

関係ないけどechoみたいな基本的なコマンドが
シェルによって挙動が違うのはどうにか
ならなかったんだろうか

127 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:14:54.02 ID:NkO7phbc0.net]
そうか。evalとか外部コマンドは実装不可能なものを除いて
ビルトインで実装することなんて決まりはないのか

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

オレオレシェル作ってビルトインするのは問題の意図から外れるので、
現存する(誰もが容易に入手可能な)いずれかのシェルで
ビルトインされているならば使って良いものとする



128 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 02:18:56.23 ID:NkO7phbc0.net]
あと拡張POSIX機能も使用してOKにしよう。
それを実現する裏技みたいなのがあったら嫌だなと思って入れたが、
もしそれでできるなら俺も勉強になるし。

ようするにPATH環境変数を空にして、どれかのシェルで動けばOKってことだな
条件がグダグダになってしまったw

129 名前:デフォルトの名無しさん [2018/10/03(水) 12:27:47.15 ID:61GCF4dla.net]
if や while を外部コマンド動かさずに使うには [ がビルトインのシェルでないとダメだな。
昔の sh は [ が test コマンドへのシンボリックリンクで外部コマンドだったし。
今でもその名残で /bin または /usr/bin に [ が入ってるよな。

130 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:43:00.79 ID:NkO7phbc0.net]
別件で現在主要のシェルで何がビルトインか調べたことがあるよ

. : [ 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は調べた限りビルトインコマンドでそのまま出力する方法がない

131 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:47:38.74 ID:m57KKa9e0.net]
いいから、お題の参考答えを出しなさいw
オレオレ定義が曖昧すぎでお題になってないから、もういいでしょ

132 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:57:02.54 ID:NkO7phbc0.net]
>>131
問題訂正してやるから、もう少し頑張れやw

お題

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

apple 1
orange 2
banana 3



ただし、変数の使用は禁止とし、シェル機能とビルトインコマンドのみを用いること
(ここでいう変数とはsetコマンドで表示されるもののことである)
(使用するコマンドはいずれかのシェルのビルトインコマンドであればよいが、
この問題用に独自シェルを作成するのは禁止とする)

133 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:59:49.96 ID:m57KKa9e0.net]
なんの目的かさっぱりわからんな。自分でできてんの?っていう疑問からなんだけどなw

>変数の使用は禁止とし
>(ここでいう変数とはsetコマンドで表示されるもののことである)
環境変数のことを言っているのかと思えば違うし、これだけでも曖昧というかオレオレ定義が曖昧だろう

134 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:11:05.97 ID:NkO7phbc0.net]
>>133
setコマンド実行してみてみばわかるでしょw

setコマンドで表示される変数はシェル変数(環境変数含む)だよ
それを使うのは禁止ってこと

135 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:13:32.35 ID:NkO7phbc0.net]
今日の24時までに答えが出なければヒント出しますw

136 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:16:57.73 ID:6m7pNgyW0.net]
そのヒントとやらもグダグダなんでしょw

137 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:17:05.40 ID:m57KKa9e0.net]
変数を使わない 言語(マシン語すら) は知らんなあ。そういう縛りを設けての目的はなんなん?
やってみたできるけど、クソのようなwにしかならんから、どうか、参考の答えを出してw



138 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:19:23.20 ID:NkO7phbc0.net]
答えは明日。まあヒントみれば気づく人はすぐわかるでしょう。
コロンブスの卵だよ

139 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:20:30.02 ID:m57KKa9e0.net]
なんで常時上から目線なのかw コードで語ればいいのに
素晴らしいコードならそんなおれおれ上から目線しなくてもいいくらいなのに。なんかしらんがもったいつけてのまだ「ヒント」とかもったいつけてるしw

140 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:21:39.64 ID:m57KKa9e0.net]
なんかしらんが見つけて、俺すげーしたいだけっぽいなw

141 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:22:11.11 ID:NkO7phbc0.net]
> そういう縛りを設けての目的はなんなん?
その理由も答えと一緒に明かします

142 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:23:23.18 ID:m57KKa9e0.net]
いや、もういらんわw なんかキモすぎて付き合いきれないw

143 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:36:43.15 ID:ej0n10jM0.net]
多分だけど学校の課題だと予想
根拠は二点:
1. 問題が実利的でない。学校(それもあまり学力の高くない)にありがちな「こんなのできるかな?」系の問題である。
2. 煽ったらそれに乗っかって答えを出してくれる人が思ってるという点で質問者が精神的に幼ない。(高校生くらいか?)

144 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 14:45:22.66 ID:m57KKa9e0.net]
posh とかいつもの人でしょ
いつもの人が学校の課題をしなきゃならん人なのか知らんけどw

145 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 15:06:30.08 ID:ej0n10jM0.net]
poshなんていうシェルがあるのね。初耳だわ。

146 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 15:10:04.24 ID:NkO7phbc0.net]
>>2に書いてあるよ。俺もここ(の何スレか前)で初めて知った

147 名前:デフォルトの名無しさん [2018/10/03(水) 15:58:50.21 ID:4kFnpcnsa.net]
$# と shift を使って逆順に値を付加することは簡単にできたんだがな。



148 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 17:25:26.25 ID:NkO7phbc0.net]
>>147
俺も第一歩目はそこまでだったw
俺の本来の目的(今回の問題とは別件)は逆順でも実現できたんだけど
なんか悔しかったので、もう一歩進めたら逆にすることなく実現できた

149 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 21:20:26.89 ID:SM8JpmZX0.net]
ちょっと前にもこんなグダグダ無かったっけ?

150 名前:デフォルトの名無しさん [2018/10/03(水) 21:48:53.18 ID:Tma5IQlaF.net]
変数使ってはダメって、非合理的でない?
シェルの仕様否定してどーするの?
外部コマンドだって、それがUNIXの設計思想なんだからそれさえも否定するってのも理解不能

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

変数使わない、外部コマンド使用禁止、そんなアルゴリズムが何の役に立つんだろう?

151 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 22:35:14.41 ID:ej0n10jM0.net]
でも前はワッチョイやIDがなかったから もっと酷かった。
今はNGすればオッケー☆

152 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:37:38.01 ID:8ua9ZMtc0.net]
ヒント忘れてたわw

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

func apple orange banana

********の所は1行とは限りません

153 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:41:45.65 ID:8ua9ZMtc0.net]
>>150
シェルスクリプトはPOSIXの範囲では
ローカル変数がないから、変数名がかぶると困るんだよ
もちろんサブシェルを使うという手もあるが
引き出しは多いほうが良い

154 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:43:44.36 ID:8ua9ZMtc0.net]
>>151
それなw 見たくないやつが絡んでこなくなったので
過ごしやすくなった。

155 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:46:12.13 ID:8ua9ZMtc0.net]
>>150
ちなみにこれアルゴリズムじゃないよ
アルゴリズム系だと一時変数を使わずに変数を入れ替える方法とかあるけど
これはシェルの機能を使った、あぁ、なるほど系の問題

156 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:49:17.75 ID:C6pwZkBD0.net]
いきなりレス数増えたと思ったらもう木曜か

157 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 04:55:02.39 ID:/YMF27MO0.net]
>>152よ、お前のなかでは「$#」は変数じゃないのか……。
人様にクイズとやらを出す前にシェルとはなんなのかを学んだらどうだ?



158 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 05:43:44.35 ID:8ua9ZMtc0.net]
出題ぐらいちゃんと読もうぜw

> ただし、変数の使用は禁止とし、シェル機能とビルトインコマンドのみを用いること
> (ここでいう変数とはsetコマンドで表示されるもののことである)

159 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 08:51:53.43 ID:/YMF27MO0.net]
bash 4.2以降はset組み込みコマンドの中に$#が含まれるようになったんだよなぁ…
ちゃんと調べて、どうぞ。

160 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 09:17:07.53 ID:8ua9ZMtc0.net]
ないですね。ちゃんと調べてどうぞ

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 またはそれ以降 <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 名前:デフォルトの名無しさん [2018/10/04(木) 09:50:29.05 ID:8DudSISka.net]
>>160
grap のパターンはそれでいいのか?

162 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 10:01:44.50 ID:8ua9ZMtc0.net]
>>161
良いに決まってるだろ
正規表現に自信がないなら自分で調べたら?
質問してるってことは、動かしてないんだろうし。

163 名前:デフォルトの名無しさん [2018/10/04(木) 10:47:30.53 ID:8DudSISka.net]
ああ。そうか。最初の$は要らないからそれでいいのか。

164 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 14:55:58.09 ID:7ib5/eAS0.net]
grap コマンドか、なんか強うそうなイメージ

165 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 16:22:52.78 ID:/YMF27MO0.net]
なんかもう誰かが作ってそうだよね。
まるでyaから始まる4文字のソフトウェアが被りまくってるように。

166 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 16:55:15.20 ID:8ua9ZMtc0.net]
犯人はya

167 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:00:19.77 ID:8ua9ZMtc0.net]
正解者もいないようなのででは解答
このコードがどういうときに有用かは>>153で書いたとおり
set は使わなくても別にもう一つ関数を作れば同じことができるが
関数を作らずとも引数の再設定という方法がある。意外と便利だよ

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

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

func apple orange banana



168 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:11:54.69 ID:n5lIiyiD0.net]
そんなクソなコードを意気揚々としてあげてるけどさ、なんか変数被るからというもっともらしい言い訳してたけど、なるべく変数使わないように書くわけだ、これから。ほーっw。そんなのクソだな、個人的にw

なんでそういうお題をそんな俺偉いじゃなくてできないのかな。よほどそれを出すのに時間かかったとか??

169 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:12:23.41 ID:8ua9ZMtc0.net]
はい。想定通りのレスだね。
言い訳だけは一人前w

170 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:13:26.14 ID:n5lIiyiD0.net]
いや、ふつうわかるだろう。まあ、かなり頑張って出したんだね、やっぱりw

171 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:14:13.91 ID:8ua9ZMtc0.net]
じゃあもう一問。そんなに言うなら次は答えてね

172 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:15:02.61 ID:n5lIiyiD0.net]
だから、なんでそんな上から目線なのよ
んなのに付き合うと思ってるの?あんた自体が上から目線でモノ言われたらすぐ反発するくせにww

173 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:18:43.51 ID:n5lIiyiD0.net]
いや、上から目線じゃなくても反論されたらかwww

174 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:20:37.56 ID:8ua9ZMtc0.net]
>>172
お前はこのおっさんと同じ種類の人間だろうな
相手が下だと思って接してるやつ。
まずお前が上から目線を止めたら?

https://togetter.com/li/1175445
おっさんがタメ語で聞いてきたからタメ語で返したらショックを受けてた。敬意が返ってくると思ってる日本のおっさんって不思議。

175 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:24:38.91 ID:n5lIiyiD0.net]
いや、お前に合わせているだけだな。さすが常時上から目線なんかしらんが常時上に立ちたいの人は言うことが違うなw

176 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:27:29.69 ID:8ua9ZMtc0.net]
上にたってるつもりはないんですが、上に見えちゃうんですかね?w

悪い奴らが「正義の味方のつもりかよwww」って
笑ってるようなシーンがあるけど、あれも悪い奴らに
正義に見えてるからそう言うんでしょうねぇ

177 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:28:28.79 ID:n5lIiyiD0.net]
忘れているのか常時上に立っているつもりで気がつけないwのか知らんが、ID:8ua9ZMtc0 の上から目線なレスに対しての俺のレスでしかないよ
なので、その得意げの>>174はそっくりそのままあんたにお返しいたします



178 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:29:44.58 ID:n5lIiyiD0.net]
あーあ、病気なのか社会性がないのか話にならんな。まあ、いつもの無理やりなごまかしモードかな?w

179 名前:デフォルトの名無しさん [2018/10/04(木) 20:33:31.45 ID:vhCji18k0.net]
目くそ鼻くそに上も下もないわwwww

180 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:34:30.94 ID:n5lIiyiD0.net]
やかましいわっw

181 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 20:50:21.03 ID:8ua9ZMtc0.net]
これはある意味有名だから簡単だと思う

お題

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

seq 5
1
2
3
4
5



ただし、シェルビルトイン関数のみを使い、変数の使用は禁止とする
(ここでいう変数とはsetコマンドで表示されるもののことである)

182 名前:デフォルトの名無しさん [2018/10/04(木) 20:52:49.73 ID:vhCji18k0.net]
>>181
調子にのるな鼻くそ

183 名前:デフォルトの名無しさん [2018/10/04(木) 21:39:22.36 ID:sVn7z6Qaa.net]
>>167
それ最初のposix縛りがあったら解けなくないか?
$(( ))で計算させてるし。

184 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:11:17.39 ID:4+O8yrpt0.net]
こいつ構わん方がいいゼ、俺スゲーしたいだけだから

185 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:14:04.78 ID:GYhkNq19a.net]
レス番飛び過ぎにも程があるだろ
まぁいつもの長文だらだら流して悦に浸ってるんだろうが

186 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:32:35.30 ID:n5lIiyiD0.net]
>>183
pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html

2004の時点であるらしい。++と--は任意。sizeof()なんてあるのかよっ

187 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 23:46:42.45 ID:/YMF27MO0.net]
>>181
これは興味から訊くんだけど,
「(POSIXの範囲では)変数の局所化ができないので
変数をなるべく使わないべき」
という主張は理解できるし,俺自身もそう思う。
しかしシェルビルトイン関数しか使わず,例えば
sed(1)やawk(1)など目的に合った有用なコマンドを用いない理由はなんだ?
ただの趣味?



188 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 01:23:25.22 ID:x9IT1j0q0.net]
>>181
$(( )) での計算をしていいなら簡単だよ。

#!/bin/bash

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

f $1

189 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 01:24:51.76 ID:x9IT1j0q0.net]
>>186
そうだったのか。

190 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 02:53:44.46 ID:bSHFQ9XI0.net]
>>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 名前:デフォルトの名無しさん [2018/10/05(金) 02:58:21.89 ID:elz6X2140.net]
なんもわかってない低学歴知恵遅れが
はりきってしょうもないwsl使ってキャッキャッいってるわけか

なるほどなるほど

wsl使ってるのなんかニートぐらいしかいないわ
マジで

192 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:00:21.47 ID:bSHFQ9XI0.net]
>>188
やっぱり簡単だったかw
再帰を使うやり方で関数型言語ではおなじみの問題

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

他にも問題を作れそうなネタのはいくつかあるんで
気が向いたらまた問題にしてみるよ

193 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:01:11.86 ID:bSHFQ9XI0.net]
>>191
やっぱ内容には全く触れず
叩けそうな所を叩くだけなんだなw
技術者としてつまらないね

194 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:25:46.03 ID:98l9MfY+0.net]
実用的じゃないもの書いてるうちは似非の技術者じゃの

195 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 03:52:16.47 ID:DwOdckeN0.net]
>>190
シェルスクリプトはストリーミング指向だから
そもそも制御文を多用することは避けたほうがいいのではってのは違うのかな。

196 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 08:48:03.27 ID:bSHFQ9XI0.net]
>>195
ストリーミング指向と制御文はあまり関係ないと思うよ
流れてくるものに対してなにか処理をしたいなら必ず
制御文を使うことになるし

ストリーミング指向の話をするなら、関数呼び出しし結果の標準出力を
変数にキャプチャするっていうのはストリーミング指向と反してると思う
例えば result=$(command "$data") みたいな形のことね
俺もこの書き方はなるべく避けるようになった

ストリーミング指向的には echo "$data" | command | 別のなにか
とするほうが良いだろう

ただ気づいたのがこの形だとサブシェルになってしまうから、
commandや別のなにかから、呼び出しの起点にデータを戻すことが
簡単にはできないという所。値を戻すこと自体がストリーミングの流れに反しているし
かと言ってそれが必要な場合もある。例えば処理した行数をカウントしたりとかね。

なので最近はイベントハンドラ方式を使うようになった
echo "$data" | command "別のなにか(関数名)" (または command "$data" "別のなにか")

例えばだけどこんな感じにして、commandで$dataを1行ずつ処理して
その都度、別のなにか(関数)を呼び出す。そうするとサブシェルにはならないので
ストリーミングで処理しつつ、グローバル変数経由で呼び出し元に結果を返すことができる

この時、別の何かがシェル関数の場合に、commandが外部コマンドだとシェル関数を呼び出せないので
連鎖的にcommandもシェル関数として実装。みたいなこともやってたりする

197 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 17:11:32.63 ID:bSHFQ9XI0.net]
10. 移植性のあるシェルプログラミング
web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html



198 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 21:16:49.85 ID:NK5dBb8n0.net]
>>196
なるほど。
俺は
https://www.ipsj.or.jp/dp/contents/publication/32/S0804-R1601.html
ここの3.1.1を読んで、制御文をなるべく使わない方向に開発をシフトしてみたんだよね。
まあどうしても必要な部分はあなたも云ってる通りもちろんあるけど。

199 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 08:20:34.66 ID:Sfai+wMy0.net]
>>198
別にその記事に大きく反対したいわけじゃないけど
おかしな点は指摘しておかないといけない

その手続き型コーディングがステップ数が多く処理効率が低いと書いてある所だが
その原因はストリーミング型コーディングのせいじゃない
rmコマンドの発行回数が原因だ

■手続き型コーディング(ステップ数が多く処理効率が低い)
i=3
while [ $i -le 10000 ]; do
 file="file${i}.txt"
 rm -f "$file" # 何度もrmコマンドを実行している
 i=$((i+3))
done

結果
real 0m3.232s
user 0m2.488s
sys 0m0.808s

■ストリーミング型コーディング
awk 'BEGIN{for(i=3;i<=10000;i+=3){print i;}}' |
sed 's/.*/file&.txt/' |
xargs rm -f

結果
real 0m0.040s
user 0m0.004s
sys 0m0.040s






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<284KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef