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

■ このスレッドは過去ログ倉庫に格納されています
2018/05/03(木) 17:54:23.25
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。
 bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています
 最新の仕様はこちらへ http://pubs.opengroup.org/onlinepubs/9699919799/
 (左上の「Shell & Utilities」 から参照することができます。)
・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。
  http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
  http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
 「そういうのはperl使いましょう」と回答するのはやめましょう。
 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
 質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう
前スレ シェルスクリプト総合 その26
https://mevius.5ch.net/test/read.cgi/unix/1489979246/
2018/06/10(日) 23:24:21.02
>>446
> CSVのRFCはフィールド・レコード区切りにU+001F/Eを使えなんて一言も言ってねぇぞ

この期に及んでなんでまだCSVの話してんの?
CSVじゃないですって何度も言ってるよね?
2018/06/10(日) 23:24:54.06
>>448
いやいやいやいやwwダメだこりゃ
なんら代替案にもなってないのだけど。なんかやけに繰り返すなwやっぱり遅々として進まんな。じゃ、お元気で
2018/06/10(日) 23:26:44.47
>>449
お前さ&も一人さ、わざとめちゃくちゃなレスをして楽しんでるだけだろ?
もうそうとしか思えない
2018/06/10(日) 23:28:24.22
>>450
お前本当に馬鹿だなw

1データの中に改行コードが含まれてるなら、
(データの中に含まれる改行コードではなく)
データの区切りの方を改行コードではなく、
そのために作られた制御文字を使うって話で
代替案になってるだろ

頭硬すぎw
なんで1データを必ず改行コード区切りにしないといけないのか
シェルスクリプトは1行ずつ読み取る(のが得意)ってだけで
データの区切りまで改行コード区切りにする必要はない
つーかこの制御文字がなぜ用意されているかに気づかんの?

いやはや、ここまで言わんと理解できないのか
2018/06/10(日) 23:28:31.79
>>424
だからやり方書いてみろよ。
出来もしないくせに煽るからバカだと言われてることに気づけよいい加減w
2018/06/10(日) 23:31:18.96
なんでこんなに荒れてんのよ
2018/06/10(日) 23:31:40.43
>>452
>>422 なんですけど?
2018/06/10(日) 23:33:06.87
>>455

>>422を書いたのも俺なんですけど?w
readが改行コードでぶった切られるからって、
データ区切りとする必要はありませんよねぇ(にやにや
2018/06/10(日) 23:33:38.89
>>453
なんでそんな高圧な奴に「教えて」あげなきゃならんねんwアホか
下手くそな煽りだな
2018/06/10(日) 23:35:13.32
>>454
> なんでこんなに荒れてんのよ

俺様がたどり着いたゴールにおまいらが
どこまでたどり着けるかを試していたらこうなった
2018/06/10(日) 23:36:47.05
>>456
ん?よくわからんな。にやけぶりがw>>422はトラップすぎだなw
2018/06/10(日) 23:40:01.41
>>459
トラップでも何でもないよ。
readの-dでできると言われたとき、
それbash拡張だって指摘するのが面倒だから
先に注意してあげただけ
2018/06/10(日) 23:43:44.04
>>460
あー、そういうことか。いちおう試してみていたんだけどね。できんの?
後処理が必要ないのでそれができるのなら確かにそうだな
2018/06/10(日) 23:49:44.49
>>460,461
& 遅い君
確かにできるね。っかしいなあw
これができての、後処理が無駄という話なら全然それに異存はないな。変に絡んでいたらすまんかった
2018/06/11(月) 00:03:29.86
>>461
ん? ようやく理解したのか?
煽りフェーズが終わると途端につまらなくなるなw

普通にできるし、俺はすでに近い形のものを実装している
自分の用途に合わせて最適化してるんで、汎用的にはなってないがな
(その後に>>282を質問という形でおまいらに問題を出したのだよ)

最初はデータの方をエスケープしてたんだが目に見えて遅くなってな
エスケープの方式をシェルビルトインのprintfでアンエスケープ
できるようにもしたが大した効果はなかった。

そこで制御文字を眺めていたら、その用途ピッタリの文字を見つけたのだよ

データとしては、0x1F(US: Unit Separator)を各項目の区切り(CSVでいうカンマ相当)
0x1Eを(RS: Record Separator)を名前の通り、データ区切りとして使ってる
USの方はIFSを使うことでPOSIX準拠でforなどで処理することができる

さらに0x1D(GS: Group Separotor)を使えば階層構造があるデータを取り扱えるだろうし
0x1C(FS: File Separator)を使えば標準入力で複数のファイルを渡すようなこともできるだろう

便利だがそれに気づいたのは>>323が最初。
おまいらは最初、シェルスクリプトで扱うもんじゃないとか言っていた
>>323のあともその使い道に気づかないでいた。まだまだだなw
2018/06/11(月) 00:07:10.97
キモ偉そう
2018/06/11(月) 00:15:39.42
おまけで、一つだけ>>431に補足しておいてやろう
(もちろん>>431を書いたのも俺だけどなw)

> bash拡張は置換命令あるけど、
> POSIXシェルの場合、外部コマンドを呼び出す以外に
> 置換命令はないんだよ。知ってる?

置換命令は無いが、fork相当のことをせずにprintfも使わずに
エスケープされた文字をアンエスケープする方法はある

例えばエスケープの方式がよくある\記号を使うやり方だとして、
IFS='\' (エスケープが必要だったかも知れない)でデータをsplitして
caseで n*) なら改行を表すエスケープ文字と解釈して
一文字目のnを ${STRING#?} で削除しつつ、
改行コードを一文字目に加えるという方法だ

これはこれで遅くなるので却下したんだがなw
2018/06/11(月) 00:18:20.26
性格が歪んでるな。これ以後の質問者とかどうするとか思わないのだろうな
2018/06/11(月) 00:19:46.66
相手にするだけ時間の無駄だと思うが…
2018/06/11(月) 00:20:59.85
>>466
もう人は俺がたどり着いた答えとは別の
もっといい案が出るのではないかと思って
先入観を与えないために、あえて俺がたどり着いた答えを出さずに
質問の形でかいた。

しかし、俺がたどり着いた答えに辿り着く前に
諦める奴らばかりだった。情けないなw
2018/06/11(月) 00:21:27.45
× もう人は俺がたどり
○ もう一つは俺がたどり
2018/06/11(月) 00:22:08.47
>>467
確かに。性格が歪んでるのを自覚してないようで
2018/06/11(月) 00:26:05.87
>>470
俺tueee系の主人公は、大抵性格が歪んでるものだよw
大好物です(笑)
2018/06/11(月) 00:27:33.78
某原理主義者のニオイがする
2018/06/11(月) 00:29:42.66
>>472
アレと一緒にするのはマジで止めてくれ

発想が似ていたとしてもセンスがダサすぎる。
ショッカーとかアホかと
2018/06/11(月) 01:13:05.93
たしかにリッチー大佐は酷い人格だけど間違ったことは言ってねえし
しかも有用なツールを作ってから、ああいう毒を吐いてる。
上で喚いてるなんの解決策も出さず人を否定し馬鹿にすることしかできない人間と比較するのは失礼千万
2018/06/11(月) 01:13:17.92
誰かちょっと流れをまとめてくれ
誰が何を言いたいのかさっぱりわからん
2018/06/11(月) 01:21:58.95
>>475

現実世界で死んだ

異世界で俺tueeeやってる
2018/06/11(月) 01:22:56.01
>>474
> しかも有用なツールを作って

なんかあったっけ?
使ったこと無いな
2018/06/11(月) 01:42:28.78
見た目でわかる文字列への置き換え派ですが、いにしえのエスケープコードの流用はいいアイデアだと思いました。
2018/06/11(月) 01:43:29.77
>>463
後で使うかもだからブログに簡単にまとめとけw 荒らした罰な
2018/06/11(月) 02:22:50.42
>>479
俺は書かないよ。だけどこのスレを参考にして誰かが書くかもしれないね。
その場合、このスレを参考にしましたって書いても書かなっくてもいいよ
他の誰かがこことは別に思いついて書くかもしれないけどw
2018/06/11(月) 02:45:32.35
スレチの自覚が無いとか、本当バカ
2018/06/11(月) 02:49:17.37
シェルスクリプトの話題なのにスレチってどういうこと?
2018/06/11(月) 02:57:45.51
>>482
俺はすべて分かってた。
ヒントだけ出してやったんだからありがたくいただけ。

これがスレ違い以外の何物だと...
2018/06/11(月) 03:07:25.04
ん? シェルスクリプト総合でしょ?
質問スレじゃないし
シェルスクリプトの話題で楽しめばいいじゃん?
2018/06/11(月) 03:30:27.23
そろそろ仲直りしろよお前ら
2018/06/11(月) 03:44:51.73
確かにそれ専用の文字があるならそれを使ったほうがいいね。
some data␟other data␟42␞
some data␟other data␟42␞
↑こういうの。
既にそういうフォーマットがあってもいいと思うけどざっと検索したところでは見付からない。
なにか不都合でもあるのか、単純にU+001E/Fの知名度が低すぎるのか。
ところでPOSIX awkはRsやFSに任意の文字って指定できたっけ。GNU awkではできたんだけれど。
2018/06/11(月) 04:48:35.52
>>486
https://www.freebsd.org/cgi/man.cgi?query=awk&;sektion=1
あるし、STANDARDSはもとより本文でも拡張したよってのは無いからPOSIXとしてあるんじゃね
2018/06/11(月) 04:51:18.43
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html
こっちかこれか。あるね
2018/06/11(月) 06:07:49.77
つまらない点だから指摘していなかったが、
この話で U+ という表記はだめだぞ
U+ というのはUnicodeの話で+の後の16進数は
文字集合におけるコードポイントだ

U+001Eは符号方式がUTF-8だと0x1Eになるが、
UTF-16だと 0x00 0x1E(ビッグエンディアンの場合)
もしくは 0x1E 0x00 (リトルエンディアンの場合) となる

U+ だとUnicodeという文字集合を表すことになるが
符号方式がUTF-8だと決めつけることはできない
2018/06/11(月) 09:45:54.74
あほか
最初に本データの形式仕様から制定してもいいという条件を書かないから
みんな処理元のデータ形式は弄れない前提で答えてるんやん

説明不足なのに自分だけ神視点でお題気取りか
死ぬほど痛々しいわ
2018/06/11(月) 10:09:41.26
ようやく気づいたわ
スレを盛り上げたかったんやな
2018/06/11(月) 10:26:48.37
俺が主役が強すぎて贔屓目にみてもだな
2018/06/11(月) 10:40:14.39
日本語で
2018/06/11(月) 11:22:26.93
>>490
> 最初に本データの形式仕様から制定してもいいという条件を書かないから
> みんな処理元のデータ形式は弄れない前提で答えてるんやん

データを加工(エスケープ)していいと書いてないのに勝手に加工してるやん?

だから変えたら駄目って書いてないなら変えていいって前提で
答えてるでしょ?
2018/06/11(月) 11:29:27.18
スレは十分伸びたからもうええやろ
何と戦ってるんや
2018/06/11(月) 11:43:52.49
自作自演ではないか
2018/06/11(月) 13:33:30.08
結局特に解決や参考になるような話は出なかったね
まあ今更CSVで新ネタも出ないだろう
2018/06/11(月) 13:38:57.30
まだお前CSVって言ってんのか?
そんなにCSVの話だと勘違いしていたことが
ショックだったのか?
2018/06/11(月) 13:40:15.04
もう引っ張るなや子供かよ
2018/06/11(月) 13:42:59.29
元データの上書きとバッファにコピーしての加工を同列に語っちゃうんだすげえな

ていうか元データの仕様からやっていいなら最初から↓で
改行的な区切り文字を許さない仕様にすればいいだけじゃね

> syori "a1" "a2" "a3" "a4"
> syori "b1" "b2" "b3" "b4"
> syori "c1" "c2" "c3" "c4"
2018/06/11(月) 13:44:44.59
さんざん偉そうだが全くコードを出さないのでお察しでもういいだろう
2018/06/11(月) 14:09:05.24
>>500
特に指定がない部分に関しては、
自由に変えていいと言ったの

改行が含まれてるとか、カンマやダブルクォートが含まれてるとかは
指定されているので、そこは変えたら駄目

当たり前だろ、ガキみたいな言い訳すんな
2018/06/11(月) 14:10:12.79
> 自由に変えていいと言ったの
変えていいと言うか、もともと指定がないから
変えるのではなくどんなものでもOKってことだが
2018/06/11(月) 14:11:48.62
>>502
これには同意する
変えてもいい/変えるべきなのは区切り文字。
2018/06/11(月) 15:25:33.31
もういい加減コードで語れ
どれほど偉そうにしてもコードがアレだったらアレだし、偉そうにしてなくても素晴らしいコードはそれだけで尊敬されるだろう。後者が断然かっこいいのに
2018/06/11(月) 16:00:25.01
意訳 参考にしたいのでコード教えてください
2018/06/11(月) 16:04:12.37
いや、全然。使わないもの。それも勝手なお題のだし
まあ勉強のためというのでなら、それはあるかもだが、どんなんだかだな。そもそもコードはそういうものだろうし、教えてやるって立場なんだしなw
2018/06/11(月) 16:50:37.25
>>506
言ってやるなw
2018/06/11(月) 17:10:06.71
結局一行も書けてない
2018/06/11(月) 17:15:08.96
ようやくこのスレも静かになるな…
2018/06/11(月) 17:51:10.54
そう思うやろ? 次のネタ準備中やで
2018/06/11(月) 17:56:57.42
なにこいつ
2018/06/11(月) 18:49:50.82
こいつもしかしてこの間の「標準入力と標準エラー出力を同時に操作したい」のアホか。
2018/06/11(月) 18:55:33.57
これ以上くだらん問答するならコテハンつけてくれ
2018/06/12(火) 03:51:38.30
>>513
これって解決したんだっけ
2018/06/12(火) 06:46:40.08
今時Python使わないでわざわざシェル使う理由って?
2018/06/12(火) 08:01:38.11
Pythonを使う理由が特にないから
2018/06/12(火) 08:37:27.40
pythonであるコマンドを実行して
それを他のコマンドに流すみたいな
ことが簡単にできたらね
2018/06/12(火) 10:53:58.20
普通にできるぞ
2018/06/12(火) 11:54:38.75
>>519
じゃあ、これ相当のことをやってみて


ここまで簡潔に書ける言語をシェルスクリプト以外しらない
シェルスクリプトは(特定の用途に対して)最善だから使ってるんだよ
2018/06/12(火) 11:55:23.82
>>519
じゃあ、これ相当のことをやってみて

cat /etc/password | grep /bin/bash | cut -d: -f1
(なんかブロックされたからパスワードを大文字にしてる)


ここまで簡潔に書ける言語をシェルスクリプト以外しらない
シェルスクリプトは(特定の用途に対して)最善だから使ってるんだよ
2018/06/12(火) 12:05:07.20
>>520
これってどれ?
ここ>>282-以降にある記述だとてんで仕様になってないから、
仕事レベルとまではいかないまでも、
学生演習の問題として出せる程度には仕様をまとめて書いて。

あとPythonに限らずスクリプト言語はどれでも
シェルにパイプ繋いで任意のシェルコマンドが実行できるから、
シェルにできてPythonでできないことなんてないよ。
勿論シェルでできないことも普通にできるし。
2018/06/12(火) 12:10:52.66
大文字w
2018/06/12(火) 12:12:33.73
>>522
これは、>>521に訂正しておいた。見れてるやろ?

>>523
多分 /etc/p@ssw0rd がブロックされるんだと思う
2018/06/12(火) 12:13:42.07
>>522
> シェルにできてPythonでできないことなんてないよ。

あるよ。
(特定の用途に対して)シェルスクリプトほどに "簡潔にできない"
2018/06/12(火) 12:14:36.84
そりゃまあ、冗長でいいなら、アセンブラでなんでも作れますわなw
作れるか作れないかの話なんかしてない
2018/06/12(火) 12:34:38.85
>>521
そういうのはperlやawk向きだな。
perl -F: -anle 'print $F[0] if $F[6] eq "/bin/bash"' /etc/passwd
awk -F: '$7=="/bin/bash" {print $1}' /etc/passwd

pythonはもっと汎用言語よりだからずっと長くなる。
こんな感じか?
f = open("/etc/passwd", "r");
for l in f :
 c = l[:-1].split(":")
 if c[6] == "/bin/bash" :
  print(c[0])
ふだんpython書いてないからよくわからん。

専用言語がそれに向いた用途なら、汎用言語よりもコンパクトに書けるのは当たり前。
でなきゃ専用言語の存在価値がない。

でもたとえば改行もデータの一部として扱いたいみたいに向いてない用途だと
書きやすさも長さも逆転したりする。

ひとつの言語にこだわるんじゃなくて、用途に応じて言語を選択するのが
UNIX流だよ。
2018/06/12(火) 12:43:39.68
import csv
[p[0] for p in csv.reader(open('/etc/pas@wd'), delimiter=':') if p[-1] == '/bin/bash']
2018/06/12(火) 12:44:23.95
>>395
>>396
多分\エスケープ云々は途中でなんらか処理をする時にRFC準拠のエスケープだと不都合だからじゃないかな
「Mika says "I'm Happy"」という文を一つのフィールドとして処理するとき
RFC準拠だと
「Mika says ""I'm Happy""」になるけど、例えばこれをsed(1)やらawk(1)に通したいと思ったときは
「Mika says \"I'm Happy\"」という形にしたほうが処理しやすいでしょう?

そういうことなんじゃないかな。
2018/06/12(火) 13:05:44.44
>>528
やっぱりそのわかりにくいのが限界ですよね
2018/06/12(火) 13:48:35.13
>>527
> でもたとえば改行もデータの一部として扱いたいみたいに向いてない用途だと
> 書きやすさも長さも逆転したりする。

まだこだわってんのかw
中身がない反論(?)は惨めなだけやで?
2018/06/12(火) 13:51:53.23
老害じじいかよ
2018/06/12(火) 13:55:48.66
その話続けたければいい加減名前つけろ
NGするから
2018/06/12(火) 13:57:32.52
だな。なんで、へー、そう書けるんだとかならずに、あれが駄目これが駄目ってばっかなんかな。会話として見ててくもそ面白くない、いらいらすんなw
2018/06/12(火) 14:08:40.82
>>527
> pythonはもっと汎用言語よりだからずっと長くなる。

汎用言語だから長くなるんじゃなくて、
Pythonには向かない作業だから長くなるっていうのが正解
2018/06/12(火) 18:38:07.06
>>529
RFC準拠ってなんの話してるの?
CSV形式ではないと明確に言われてるのに
まだCSV形式にこだわってるの?
2018/06/12(火) 18:40:26.84
よほどお前がこだわってるな。てかキモいわ
2018/06/12(火) 18:46:13.86
俺はレスしただけだけど?
>>529が書かなければ、この話をすることもなかった
2018/06/12(火) 18:49:00.93
新参なので>>513ってなんのこっちゃと、ちょっと前スレの当該箇所を流し読みしてはいた。ふーんてな
で、>>538となんか同じようなのがあったようなww
2018/06/12(火) 18:51:25.65
お前の落ち度だってのはわかった
2018/06/12(火) 18:52:26.75
>>540
>>538のな?w
2018/06/12(火) 19:00:28.24
自分のことだって自覚してるからレスしたんだろ?
2018/06/12(火) 19:03:32.17
へ?
さすが、自分のことだけはよくわかってるな。それはお前がそうだからだろう
何を言っているのかわからん、>>538によく似合うレスだなっていう
2018/06/12(火) 19:12:05.82
どうも同一人物みたいだが(>>539に対しての?>>540あたりからも)、だとしたら>>513はすげえなっということでw
2018/06/12(火) 19:16:54.17
自作自演
2018/06/12(火) 19:18:03.28
いつまでも俺のこと話題にしつづけてくれ! まで読んだ
自意識過剰すぎてきもい
2018/06/12(火) 19:21:22.12
>>546
いやあ、本人はそうは思ってなさそうだけど?自己顕示欲は満々みたいだけど
まあ、話題にしている>>513や俺などに対する当てつけ的になら、なんかすまん
2018/06/12(火) 19:23:17.23
自作自演2
2018/06/12(火) 19:27:22.55
なにか気に触るようだな、繰り返しとはwなにが気に触ってるのかさっぱりだな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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