シェルスクリプト総合 その26 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その25
http://echo.2ch.net/test/read.cgi/unix/1439563321/ 本报讯(记者黄辛)复旦大学药学院李聪团队和附属华山医院毛颖团队合作,
将一种新型纳米探针用于脑肿瘤手术导航,通过纳米探针对脑胶质瘤酸性环
境的响应性成像引导手术切除,有望为改善脑胶质瘤手术的预后提供一种新
策略。相关研究成果近日秋月康秀在线发表于《先进材料》。
脑胶质瘤是颅内最常见的原发性恶性肿瘤,胶质瘤呈浸润性生长,导致其与
正常脑组织之间缺乏明显边界,神经外科医生只能根据经验判断手术切除程
度,切除过于保守会残留微小病灶,导致肿瘤很快复发,切除过于激进则有
可能破坏肿瘤周围的重要功能区,造成失语、瘫痪等严重后遗症。
该研究发现了一种对肿瘤酸性环境具有双模态信号响应的探针,可用于引导
胶质瘤的手术切除。”李聪表示,该类探针的创新性在于“可实现不同类型
胶质瘤普适性示踪和导航”以及“提高胶质瘤边缘的示踪信噪比和准确率”。 とうせアフィ貼ってるスクリプトだろ
goo.glはURLの末尾に+つけるとリンク先が見れる 短縮URLは完全スルーだしNGワードにしようと思えばできるし
コメントもスパム丸出しだから問題ない シェルスクリプト用のトランスパイラとか
ビルドツールってないですかね?
JavaScriptの世界であるような、それらがあれば
POSIX標準のままシェルスクリプトという言語仕様を
拡張できるのですが 前スレにsedで改行を扱う方法があったんでいろいろ遊んでたら、
分かったつもりでいた挙動がわからなくなってしまった
おk
echo -e "abc\ndef" | sed 'N;s/\ndef/def/g'
echo -e "abc\ndef\nghi\njkl" | sed 'N;s/\ndef/def/g'
ダメ
echo -e "abc\ndef\nghi" | sed 'N;s/\ndef/def/g'
echo -e "abc\ndef\nghi\njkl\nmno" | sed 'N;s/\nghi/ghi/g'
なんで、下二つは最後の行が表示されないの?
しかもダメの下は置換もされないのは、なぜ? GNU sed 4.4 だとダメ2つとも最後の行が表示されるなぁ。
同じく GNU sed 4.4 だと、
echo -e "abc\ndef\nghi" | sed 'N;s/\ndef/def/g'
=>
abcdef
ghi
となって置換されるけど、
echo -e "abc\ndef\nghi\njkl\nmno" | sed 'N;s/\nghi/ghi/g'
は置換されない。これは ghi が3行目にあるから(偶数行目にあれば問題ない)。
まぁ、やるとしたらこんな感じになると思う(意味のない処理だけど)
echo -e "abc\ndef\nghi\njkl\nmno" | sed ':a;N;$!ba;s/\nghi/ghi/' echo -eはなんか厄介
他のディストリに持ってったら動き(表示だけど)が違った unixプログラミング環境って本の問題に、
1「cat hoge.txt fuga.txt >hoge.txt」
2「cat hoge.txt >>hoge.txt」
ってやるとどうなるか考えろってのがある。
実行すると、
1「hoge.txtがfuga.txtの内容で上書きされる」
2「hoge.txtの内容が無限にコピペされる」
となったんだが、どうしてこうなるのか誰か知ってたら教えて! >>47
考えたらわかったけど、知らなかったから教えない シェルとcatがそうなるような実装になってるんだろう
わりと自然な結果だと思う 知らんけど推測で。
1-a. シェルが hoge.txt を O_WRONLY(?) | O_TRUNC とかでオープン (O_TRUNC なので 0バイトになる)
1-b. シェルが cat hoge.txt fuga.txt を exec
1-c. cat が hoge.txt をオープンするも、0バイトなので実質何もしない。
1-d. cat が fuga.txt をオープンして標準出力に出力。
2-a. シェルが hoge.txt を O_WRONLY(?) | O_APPEND でオープン。
2-b. cat が hoge.txt をオープンし、読み込んだものを標準出力に出力。
2-c. 読み込むと、直前に書いたものが読み込めてしまうので永遠に終わらない。
2の挙動は知らんかったなぁ。 2 の場合、bash, dash, ksh だと input file is output file って表示される
bash では noclobber を unset にしても同じ >>53
それはcatの引数が入力ファイルだと言う知識をshellがもってるという事だね
気持ち悪い これは無限ループにもエラーにもならない
$ cat hoge.txt | cat >> hoge.txt
しかし、ファイルサイズがパイプやプロセスのバッファサイズを
超えるとどうなるか…こんな場合は moreutils の sponge コマンドかな Cで言う未定義なみたいなもので、どういう結果になろうが客観的な意味は無い >>53はシェルではなくGNUのcatの実装
% echo a >a
% cat a >>a
cat: a: input file is output file
%
gitリポジトリ上で参照できる一番古いログ(1992年)の時点で既にある
https://git.savannah.gnu.org/cgit/coreutils.git/tree/src/cat.c?id=b25038ce#n267 >>57
ありがとう、GNU cat だからなのね sqlplusでselect文を実行したときにレコードが該当しない場合の値って何が返されるの?
予想だと""なんだけど >>59
俺は SELECT 結果の行数をカウントして判定してる。
ちなみにシェルスクリプトで sqlplus をカプセル化しようとすると、SQL 実行時のエラーチェックが地味に面倒だよね。
頑張ってね。 >>60
count(0)ですねわかります
シェルスクリプトってsqlで取ってきた値がnullのときその値を変数に格納したらどうなんの?
そもそもselect文で該当なしでエラーになるのかもわからん なんでこんなこと聞くのって思うだろうけどprintfで書式指定するときにnullが変えるかもしれない変数を%08d$nで指定してるんだよね
文字列指定してけば良かったんだけど、これって修正必要かなぁ >>61
違う違う。SPOOL で SELECT 結果をファイルに保存し、そのファイルの行数を wc -l でカウントするイメージです。
いろいろとやり方があると思うけど、私の場合は項目区切りを TAB でレコード区切りを改行にして SELECT 結果を TSV ファイル化することが多い。
んで、そのファイルをシェルで一行ずつ読み込みながら必要に応じて処理する感じ。awk で各項目の値をバラすのがラクチン。
NULL 値は、フツーに処理してれば特に意識してなくても空文字列としてシェルスクリプトの変数に入るはず。
あと SELECT COUNT(*) を実行するケースも無いではないけど、その結果が 0 でない場合はもう一度 SELECT するってこと?
クエリを二度実行するコストは容認できないケースが多いと思います。
もちろん、SELECT 結果の有無のみが必要なケースなら SELECT COUNT(*) した結果が 0 かどうかで判定するのはアリです。
>>62
もうちょっと具体的に説明してもらわないと分からないけど、例えば SELECT name FROM emp WHERE id=1; の結果が NULL だと困るのなら……
実行するクエリを SELECT NVL(name, '(NULLだよ)') FROM emp WHERE id=1; みたいに変更すればいいだけじゃね? 確かに一度ファイルに落としてからawkとかに食わせる方が何かと楽そうだな 澁谷 恭正 (46歳)
千葉県立沼南高柳高等学校卒
松戸市立六実第二小学校PTA会長
小学女子レイプ殺人で逮捕
お住まい:
千葉県松戸市六実4-8-1 Mシャトレ
お子さん:
ひりゅう、あやか ※父子家庭
趣味傾向:
アニオタ SQL*Plus、PL/SQLに詳しくないからそういう発想になるのはわかるが、普通にやれよ。 シェルとsqlplus触ったの1,2ヶ月だけど、半年後にはおまえ超えてるから クエリを2度実行するコストよりもってあるけど、コストそんなかからないし、どっちでもよくね。
sqlじたいそんな詳しくなくてすまんな これはステップ数大きいけど、たしかおれは2ステップで書いた >>72
なんで例外処理でやらないのか?
基本中の基本だぞ。 シェルでカプセル化とかもわけわからんし、このスレわからんわ 実行ファイルが実はシェルスクリプトだった、なんてことは/usr/binによくあること $ for d in /bin /usr/bin /sbin /usr/sbin ; do echo -n "$d: " ; file $d/* | fgrep 'shell script' | wc -l; done
/bin: 25
/usr/bin: 290
/sbin: 12
/usr/sbin: 57
意外とあるな historyから所定のコマンドだけ削除するシェルスクリプトってあったりする? >>80
ほほう -d オプションというものがあるのか……と思ったんだけど、これって bash のみだったりする?
手元の古い tcsh には無いみたい。それとも最近のシェルなら普通に実装されてるのかな。 >>78
こういうのって、fgrepにIをつけたほうがいいのかな。 >>84
ありがとうございます
昔、binの中等気をつけろと言われた事があったので勘違いしてました >>75
なんでexceptionでno_data_foundを拾わないのか?
カウントしてしまうのは、不慣れなひとがよくやるけど。 この中で過去にシェルを仕事でやってたって人何人くらいいるのかな 自分はインフラ関連やってたよ
今は仕事ではコンソール触ることはなくなったけど
家で動画ダウンロード用のスクリプト組んだりしてる ちなみに性能情報の収集や監視スクリプト、
バックアップとかの運用シェル作ってたけど
可読性も考えてオーソドックスなプログラミングのような書き方をしてたから
超何かよく分からん使い方をしてるココの人の方がシェルスクリプト知ってると思う >>94
よくわからない書き方してるほうが上手いとも言えないでしょ linuxってちゃんと使いこなせれば快適だよなすごいわかる >>92
shだけの仕事は数えるほどしかないけど
他の仕事の小道具として毎回のように出てくるな
javaとかwindows系の仕事だと使えなくてめんどくさい
開発ツールとしては使うけど 仕事でシェルスクリプト書くなんて
めずらしくもなんともないよ >>98
めずらしいとは思ってないけどさ、働いてないのかと思った。
何かしら経験ある人もいるのな、仕事で使ってて家でもシェルいじろうとかよく思えるな >>99
手間とかを省くために使うからプライベートだろうと使うだろう
その発想は使わされてる人のものだと思うぞ 仕事か家かどっちかでしか使っちゃダメなの?
便利なんだからいろんなとこで使ってもいいじゃん >>99
俺は職場から2ちゃんに書き込んでるだけだよ。 学生でもなくて働いたことも無いならシェルいじろうとは思わないでしょ 他紙蟹
わかったからそんなせめんなよごめんなっっ
家でシェル使ってる人ってwindows機は別にあるの? あるよ、自分はWindowsなんて使わないという偏屈ではないしさ
Linuxの実機はラズパイだけであとは仮想環境
まあ他にも色々あるけど実際に使ってる環境ってことならね
>>103を書いたのは嫌気がさして書いたんじゃなくて
目的や知識がないとシェルなんて触る機会もないでしょって意味で書いた ubuntu on the windowsのおまえらの率直な感想が聞きたい 【Bash】Windows Subsystem for Linux【Ubuntu】2©2ch.net
http://hayabusa6.2ch.net/test/read.cgi/linux/1468149353/ >>103
便利なもんなんだから使うだろう
知ってて環境あって使いどころあれば >>108
そんな向上心があるなら学ぶか働いてるでしょ >>110
そういう学科の学生かそういう業務の仕事でなくても使う人は使うってことじゃないの >>109
やるじゃんそーゆー振り切ってる感じ好きだぜ >>111
そうは言ってなかったな、シェルなんて職場で使わなきゃやろうと思わないでしょって言ってたよ ぶっちゃけLinuxだけだと不便やねん、だからどっちもいるねん、必須なのはWindowsやねん、結局便利だけどLinuxは無くてもいけるねん >>113
仕事も勉強も関係なくエロ画像収集に使うだろ
初めてはSSIとかCGIだったな
ISPでシェルアカウント付きのとこもあった
やらされてるだけの人には価値はわからんだろうけど >>116
VBとかで出来るからね
シェルを使うにはUnix環境が必要で
知識ゼロのニートが自主的にやったってのは知らないなあ
Unix界隈に居る人って性格悪いじゃん?
そんな中で続くとは思えないんだけど
学生か働いてる(働いてた)時に得た知識でやるならわかるけどさ 画像収集ツールって昔からいくつかあるけど
それを使わずにシェルスクリプト使った人が今何してるのか興味あるな
自分はOSもアプリも言語も道具だから何でもいいんだけど
獲得したものを特別なものと思って他人を見下すってのは余裕のない感じがするね
そのあたりがLinuxが流行らなかった理由なんじゃないかと思う
スマホ使ってる人なんてニコニコしながら嫌味無く教えてくれるときあるしw やらされてるだけの人って嫌味なんだろうけど
ココで答えてくれてる人はそんな人なこと忘れてるよ
失礼な奴だな シェルスクリプトを作れない人がやっかんでるだけに見えるな
画像収集ツールみたいなことをする場合、Windowsアプリも
cygwonでシェルスクリプト+コマンドのパターンも使う
一方しか出来ない人は時間を損してると思うよ 暇つぶしに聞いただけだろう
現役で職場でシェルスクリプト使う身からすると奇妙な質問には思えるが
これがCOBOLとかなら話分かったけど 画像収集ツールってWindowsで動く既存アプリがいくつもあるんだよ〜
自分はシェルスクリプトを否定はしていない
でも学んでも働いても無かった人(要するにシェルを使ってなかった人)が
画像収集するためにいきなりシェルを使うとは思えないんだな
シェルスクリプトに行き着くためには
UnixなりりLinuxなりCygwin、BoW、Services for UNIXが必要になるわけであって
画像収集するのに便利って言うのは違和感がある
そういう人が本当に使ってるとして今どのレベルなのかも興味があるね
まだ画像収集レベルなのかな?
まあ別に目的を達せられたら良いんだけどね(で振り出しに戻ると) ちなみに自分は学んだし仕事でやってたよ
だから実装は楽だしやらせたいことを自動でやらせるためにスクリプト組んでるね すまん、結局何が言いたいのか分からん
これは単にシェルスクリプト使ってるのを見下したいだけなのか? 自分が使える道具を、使うと何かの目的が達せられるところで使うだけだよ
環境、能力、目的は人によるから想像力の欠如をアピールしてもしょうがない >>118
CGIやSSIやISPはweb関連だ
wwwの世界はUnixばかりだからな
で何もなかった昔のwwwではCGIの設置改造とか普通
どうやって動いてるのかとか興味を持って調べた奴も多いだろう
つまり趣味で知った奴もいるってことだ
昔はWindowsでもcygwinとかでシェル使ってたけどな
今はないのかな
VBのツールのメンテとかもしてたけどUnixが吐くデータの処理だったからshで置き換えて効率化したな
やらされてる奴に性格悪い奴がいることはわかった >>129
お前こそ金にならないことやらされてるじゃん なんつうか、こんな話題で長文して結論がそれって
よほど嫌なことあって愚痴りたかったんだろうな ■ このスレッドは過去ログ倉庫に格納されています