X



シェルスクリプト総合 その27
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
垢版 |
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/
0258名無しさん@お腹いっぱい。
垢版 |
2018/06/07(木) 13:38:14.12
>>255
コマンドライン経由の意味はよくわからないが、
多分ファイルを使うのがいいと思う。

[渡す側]
declare | grep "渡したい変数" > /path/save

[受け取る側]
source /path/save
0265名無しさん@お腹いっぱい。
垢版 |
2018/06/07(木) 22:39:09.40
言語のオブジェクト(配列)を他のプロセスにそのまんま渡せるスクリプト言語ってなんかあったっけ?
間にはシリアラズ/デシリアライズなどの仕組みがあるのは当然だが、そんなの全く意識させない言語でサポートしている言語って。フレームワークなど使えばは抜きで。スクリプト言語でなくてもいいけどとりあえずこのスレなのでスクリプト言語で
0266名無しさん@お腹いっぱい。
垢版 |
2018/06/07(木) 23:15:52.17
>>257
あ、
>分解時のセパレータとしてはタブもデフォルトIFSに入っているので分解時には特に設定する必要はない
何言ってんだか。せっかくスペースをセパレータとされるのを避けているのに、設定しなきゃダメだろう

sub-script.sh:
ORIGINAL_IFS="$IFS"
IFS=$'\t'
array1=($1)
array2=($2)
array3=($3)
IFS="$ORIGINAL_IFS"
0268名無しさん@お腹いっぱい。
垢版 |
2018/06/08(金) 00:05:04.96
>>267
シリアライズ/デシリアライズの手法/フォーマットのひとつとしてね
そゆんじゃなくて、そんな変換が見えなーい言語ってなんかあったっけ。仮にJSONを使っていたとしてもそんなの見えない
0270名無しさん@お腹いっぱい。
垢版 |
2018/06/08(金) 00:18:14.42
分散オブジェクトに近い...つうても実装/言語により全然見えないにはならんけど
process.TheFunc(anObject)
と、呼んだら、別プロセスの
TheFunc(anObject) {
}
に、まんまオブジェクト(ただの配列でもいいけど)が入ってるくるような

PowerShellはそんなんなん?分散オブジェクトかな?
0272名無しさん@お腹いっぱい。
垢版 |
2018/06/08(金) 01:16:08.95
いや、>>259なんて思うのはどういう根拠からかなあと。他のスクリプト言語でそんなんあるんかと
また現れるかもしれんだろw まあ、スレチではある
0273名無しさん@お腹いっぱい。
垢版 |
2018/06/08(金) 01:20:44.78
>>257,258,254 全部、シリアライズ/デシリアライズのことで、どういうシリアライズ/デシリアライズを使うかでしかなく、まあ、普通はそれしかないわなで終わってることなんだけどね
ちょっとなんか他のスクリプト言語であるのかと気になったので
0275名無しさん@お腹いっぱい。
垢版 |
2018/06/08(金) 03:21:57.82
新入社員が先輩よりプログラミング知識あることを知って俺結構世間の中でも出来る方なんじゃね?って勘違いする時期だな
0277名無しさん@お腹いっぱい。
垢版 |
2018/06/08(金) 05:43:51.14
>>270
同一プロセス(要するにPowerShell内で閉じてる)ならそんな感じの記述でオブジェクトを渡せる
ちなみにパイプでも渡せる
他のプロセスへコマンドラインとなると無理だろうね
そもそもOSレベルでもたいていのOSはコマンドラインとして文字列の配列しか渡せないし
0282名無しさん@お腹いっぱい。
垢版 |
2018/06/08(金) 23:18:13.62
Excelから出力したCSVのように一行(?)の中に改行が含まれた
データを扱うにはどうしたら良いでしょうか?

もう少し具体的に書きます。

カンマ区切りのCSVデータだと仮定して、
シェルスクリプトの中に関数を一行ごとに呼び出し、
列を引数に対応させたいです。

例えば以下のような内容のファイルがあったとして
a1,a2,a3,a4
b1,b2,b3,b4
c1,c2,c3,c4

syori "a1" "a2" "a3" "a4"
syori "b1" "b2" "b3" "b4"
syori "c1" "c2" "c3" "c4"

という風にsyori関数を呼び出したいのです。

ただし実際には各項目(a1等の部分)にExcelから出力したデータのように
改行やカンマやダブルクォートやシングルクォートや空白が入ることがあるのです
0283名無しさん@お腹いっぱい。
垢版 |
2018/06/08(金) 23:18:34.79
各項目には \ が入ることもあります。

今回はCSVではありませんが、RFC4180(=ExcelのCSVの仕様)では
改行が\nのようにエスケープされません

https://ja.wikipedia.org/wiki/Comma-Separated_Values

> フィールドがコンマ、ダブルクォート、改行を含む場合は、かならずダブルクォートで囲む。
> また、フィールドに含まれるダブルクォートは2つ並べてエスケープする。
>
> "日本 CRLF
> 国","""東京""","127,767,944" CRLF

↑「日本国」の国の前に改行が入っている場合
0285名無しさん@お腹いっぱい。
垢版 |
2018/06/08(金) 23:23:17.66
>>283
rubyとかpythonでCSV処理用のライブラリを使うとか、
CSV処理用の専用ツール使うとか。
落とし穴が一杯あるので、シェルだけでやるのは危険。
0289名無しさん@お腹いっぱい。
垢版 |
2018/06/08(金) 23:57:15.15
邪道としては、改行コードとか\を絶対に使われない文字に置換して最後にまた戻すとかやったな
アルメニア文字とかに置換するんやで
0290名無しさん@お腹いっぱい。
垢版 |
2018/06/09(土) 00:06:32.51
今時、シェルスクリプトが使える環境でperlやpythonがデフォルトで入ってないOSの方が稀だろう。なんかここ最近のPOSIXと言えばいいというようなのはなんかアレだな
0293名無しさん@お腹いっぱい。
垢版 |
2018/06/09(土) 00:17:26.20
そんな変わりもんを出されても
>>287がそんなの想定してるとでも思ったの?そんなの想定しているヤツは自力でできるだろうし、そんなの使うやつは必要なら自分で入れるだろう
知識自慢はいらんよw
0294名無しさん@お腹いっぱい。
垢版 |
2018/06/09(土) 00:21:35.51
てゆうか問題に適した言語を組み合わせて問題を解くってのが
もともとのUNIXの思想だと思うので、
CSV扱うならCSVに向いた言語使う方がUNIX的だと思うのよね。
まあケースバイケースなんだけど。
0295名無しさん@お腹いっぱい。
垢版 |
2018/06/09(土) 00:23:20.54
つまりC++ってことか。
0296名無しさん@お腹いっぱい。
垢版 |
2018/06/09(土) 00:25:28.50
https://codezine.jp/article/detail/8323
>gawkの開発は「完全を目指すのではなく9割をサクサクこなし、フィールドに改行を含むようなCSVファイルは専用のツールで処理すれば良い」
ですらだからなあ
Linuxはawk=gawkだが、BSDは巣の(?)awkでgawkは別に入れなければならなく、gawkの機能を使うかどうかっていう話ならわかるけど、そんなんだったらperlやpython使った方がLinuxとBSDの違いも無いだろしな
0297名無しさん@お腹いっぱい。
垢版 |
2018/06/09(土) 00:34:57.73
>>287は単に他の言語/知識までは自分の手に余るっていう逃げだろうとしか見えんな
そこに山があるから登るっていうあえてメンドくさいことをしたいってのなら、のらないでもないけどw
0299名無しさん@お腹いっぱい。
垢版 |
2018/06/09(土) 00:50:25.58
とは言ってるけど、CSVとはどう違うとかは全くだな。てか、延々とCSVのここがってしかないやん
CSVと似た何か特殊なものなら、普通にストリームの一文字一文字処理できるスクリプト使ったほうがいいだろう、てかそれしかないだろう
0301名無しさん@お腹いっぱい。
垢版 |
2018/06/09(土) 01:40:22.57
POSIXはまあいいとしてPOSIXという単語が出る度アレルギーのごとく反発する人はなんなの?
OpenGroupに親でも殺されたのか?
0304名無しさん@お腹いっぱい。
垢版 |
2018/06/09(土) 02:06:03.67
nkfとかiconvで 改行コードを調べたらええんちゃう?
busybox, alpineぐらいのコンテナに nkf を足したぐらいで大してでかくならんやろうに。
0314名無しさん@お腹いっぱい。
垢版 |
2018/06/09(土) 18:01:39.57
トマトとか言ってる日本人が気にすんな。特定のそういう発音違いをめっちゃ馬鹿にしたりするのも日本人だけど
0321名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 00:30:51.68
>>318
そういうものはシェルスクリプトでは扱わない
適材適所

バカは同じものをなんにでも押し付けようとするから無駄に機能が肥大化する
0322名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 01:40:53.84
シェルスクリプトだって適切に扱える(場合はある)
例えば1データがファイル単位に分かれてるとか1データの処理が1プロセスの寿命と同じでいいとか
0323名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 02:20:54.22
U+001EやU+001Fを区切り文字として利用してる方いらっしゃいますか?
結構便利(絶対に他の文字と衝突しない)だと思うんですが、そういうシェルスクリプトを見たことがありません。
0324名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 02:29:16.89
はっはっは。一データの中に改行が含まれてる
ものすら扱えないここの連中にそんな発想ができるやつはいない
その程度の陳腐なアイデアであったとしてもな
0326名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 08:14:53.42
>>323
正直、そういう解答を出してほしかったね。だせるかなーって思っていたけど
シェルスクリプトでそういうデータを扱うなんておかしいとかのたまうばかり
\x1c(ファイル分離)、\x1d(グループ分離)、\x1e(レコード分離)、\x1f(ユニット分離)は
まさにそういう用途で使うもの。ここの連中の技術力の低下を感じる。
0329名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 11:02:49.39
>>327
住民に限定し、しかも馬鹿にしたい欲求を生んだ過去があったのだろう。馬鹿にされたとか、単になにか否定されたとか
0332名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 12:42:33.56
改行コード含んだデータ扱いたいという前提の質問かと思ったら
改行コード含んだデータなどナンセンスであるという主張だった
0336名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 13:40:18.16
なんかただ否定している感じにしか見えんけど
シェルスクリプトで扱うまでも考えて否定してんのかな?
0338名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 14:38:11.53
>>337
動くかどうかだったら動くけど
速度が遅過ぎで現実的じゃないよ
なにせ一行一行forkとプロセス起動が必要になるしね
0341名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 15:18:34.26
>>326
だってどうせCSVの話だろ?区切り文字を換える話をすると
後出しじゃんけんでソレは違うって言い出すのが常套手段
0343名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 15:59:54.35
因みにCSVはRFCで「内部改行はCRLF」と定まっているので
ここから攻めるというのもアリ。
「\r\n」という組はフィールド区切りとしては無効にすればよろし
え? CSV出力すると内部改行がLFになるLibreOffice Calc?
知らない子ですね…
0345名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 16:07:14.39
> "Excelから出力したCSVのように" 一行(?)の中に改行が含まれた
> データを扱うにはどうしたら良いでしょうか?

> カンマ区切りのCSVデータだと "仮定して" 、

> 今回はCSVではありませんが、


こう書いてあるのに、CSV形式だって思い込むのは
頭が悪いと思います。
0347名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 16:10:01.41
だったらお前がそのわけわからんCVS形式でない答えを応えれtばええんちゃんですかね?具体的に何も言ってないのに対する汎用的な
自称賢いらしいから時間かけずになんでもござれの汎用的的なのかけるだろ?
0349名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 16:10:50.12
>>343
> 一度全部置換してから読み取ればいいんじゃないですか(名推理

そして一行ずつ読み取るわけですねw

そりゃそうでしょう。\nを全部改行コードに戻してしてしまったら、
区別できないですからね
0352名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 16:12:08.78
>>347
> だったらお前がそのわけわからんCVS形式でない答えを応えれtばええんちゃんですかね

データの中に改行コードがあるってだけで、
フォーマットは最初から指定してないよ?

その場合どういうやり方があるでしょうって話なんだが、
CSVだと思いこんで効率の悪い方法しか思いつかず
指摘したら逆ギレするのやめなよ?ダサいから
0354名無しさん@お腹いっぱい。
垢版 |
2018/06/10(日) 16:13:10.06
>>351
なにが言いたいのかわからんが、RFCのCSVの仕様に改行コードを
エスケープするという仕様はない。ダブルクォートでくくればいいだけ
■ このスレッドは過去ログ倉庫に格納されています

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