X



シェルスクリプト総合 その26 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
垢版 |
2017/03/20(月) 12:07:26.41
シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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/
0017名無しさん@お腹いっぱい。
垢版 |
2017/03/22(水) 02:44:38.59
bash内での関数の組み立て方を教えて下さい
jqのコマンドオプションを組み立てて実行したいのですが上手く行きません

function XXXX {
local filename=$1
local option="'.files | map(select(.name = \"$filename\" )) | .[0] '"
local st='echo' "\$files | jq $option"
$st
retrun 0
}

そもそもこんがらがってきているのでお助け下さい
0019名無しさん@お腹いっぱい。
垢版 |
2017/03/22(水) 03:14:20.82
>>17
自己解決しました。jqの問題だったみたいです

function XXXX {
local filename=$1
local onefile
onefile=$(echo "$files" |jq―arg n "$filename" ".files | map(select(.name =\"\$n\" )) |.[0]")
以下省略
}
0020名無しさん@お腹いっぱい。
垢版 |
2017/03/25(土) 09:35:56.16
最近標準エラー出力で引っかかったこと

pingで疎通が出来ないときにインタフェースを上げなおすスクリプト書いてた
pingでerror(パケットロス)が発生したときと

例:1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

インタフェースがダウンしてたとき

例:connect: Network is unreachable

一つ目は普通に実装できたけど二つ目がなぜか出来ない
コンソールで試してみたけどgrepにも引っかかってる

ように見えただけだった・・・

実はこれ標準エラー出力に出ててgrepに引っかかってるように見えたのはフェイクだった
結局以下のように「2>&1」を追加して標準エラー出力を標準出力に出すようにして解決した

例:ping x.x.x.x -c 10 2>&1 | grep "connect: Network is unreachable"
0022名無しさん@お腹いっぱい。
垢版 |
2017/03/25(土) 10:25:44.42
一般にstdoutとstderrは用途が違うから(stderrはstdoutがリダイレクト
されても端末に出したいとか)、エラーテキストをgrepするような
ことをしたい場合は意識しないといけないね
ただ、pingコマンドの場合は終了コードを見るのが王道だと思う
0023名無しさん@お腹いっぱい。
垢版 |
2017/03/25(土) 13:57:40.19
>>21-22
いまは$?見てる
元々は何パーセントかロスしてもいい造りにする予定だったんだ
最終的には正常0、ロスあり1、リンクダウン2だったので
0以外は問題ありって言う処理に修正した
0025名無しさん@お腹いっぱい。
垢版 |
2017/03/26(日) 04:25:32.34
だいたい何かを作ってエラーが出てハマる時って、基本に立ち返って当たり前の事から検証し始めると解決するよね
大抵本当にアホな理由でつまづく
0030名無しさん@お腹いっぱい。
垢版 |
2017/03/30(木) 17:29:20.60
簡単なマルチプロセスの方法ないか考えてたら
置換コマンドを変数で定義してやって、|でつなげてやればいいだけだった
0033名無しさん@お腹いっぱい。
垢版 |
2017/03/30(木) 21:12:06.15
>>32
マルチプロセスだろ?
0034名無しさん@お腹いっぱい。
垢版 |
2017/03/31(金) 16:30:56.29
本报讯(记者黄辛)复旦大学药学院李聪团队和附属华山医院毛颖团队合作,
将一种新型纳米探针用于脑肿瘤手术导航,通过纳米探针对脑胶质瘤酸性环
境的响应性成像引导手术切除,有望为改善脑胶质瘤手术的预后提供一种新
策略。相关研究成果近日秋月康秀在线发表于《先进材料》。
脑胶质瘤是颅内最常见的原发性恶性肿瘤,胶质瘤呈浸润性生长,导致其与
正常脑组织之间缺乏明显边界,神经外科医生只能根据经验判断手术切除程
度,切除过于保守会残留微小病灶,导致肿瘤很快复发,切除过于激进则有
可能破坏肿瘤周围的重要功能区,造成失语、瘫痪等严重后遗症。
该研究发现了一种对肿瘤酸性环境具有双模态信号响应的探针,可用于引导
胶质瘤的手术切除。”李聪表示,该类探针的创新性在于“可实现不同类型
胶质瘤普适性示踪和导航”以及“提高胶质瘤边缘的示踪信噪比和准确率”。
0039名無しさん@お腹いっぱい。
垢版 |
2017/04/01(土) 22:25:57.55
シェルスクリプト用のトランスパイラとか
ビルドツールってないですかね?

JavaScriptの世界であるような、それらがあれば
POSIX標準のままシェルスクリプトという言語仕様を
拡張できるのですが
0040名無しさん@お腹いっぱい。
垢版 |
2017/04/02(日) 13:32:05.83
前スレに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'

なんで、下二つは最後の行が表示されないの?
しかもダメの下は置換もされないのは、なぜ?
0041名無しさん@お腹いっぱい。
垢版 |
2017/04/02(日) 18:49:19.32
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/'
0044名無しさん@お腹いっぱい。
垢版 |
2017/04/03(月) 19:25:53.89
>>41
そういうの書くな。
バグの温床だ。
0045名無しさん@お腹いっぱい。
垢版 |
2017/04/03(月) 19:26:37.45
OSによって挙動が異なるかもしれないので危険。
0047名無しさん@お腹いっぱい。
垢版 |
2017/04/03(月) 23:27:26.85
unixプログラミング環境って本の問題に、

1「cat hoge.txt fuga.txt >hoge.txt」

2「cat hoge.txt >>hoge.txt」

ってやるとどうなるか考えろってのがある。

実行すると、

1「hoge.txtがfuga.txtの内容で上書きされる」

2「hoge.txtの内容が無限にコピペされる」

となったんだが、どうしてこうなるのか誰か知ってたら教えて!
0052名無しさん@お腹いっぱい。
垢版 |
2017/04/04(火) 11:29:13.28
知らんけど推測で。

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の挙動は知らんかったなぁ。
0055名無しさん@お腹いっぱい。
垢版 |
2017/04/04(火) 12:16:42.64
これは無限ループにもエラーにもならない

$ cat hoge.txt | cat >> hoge.txt

しかし、ファイルサイズがパイプやプロセスのバッファサイズを
超えるとどうなるか…こんな場合は moreutils の sponge コマンドかな
0059名無しさん@お腹いっぱい。
垢版 |
2017/04/13(木) 16:40:20.18
sqlplusでselect文を実行したときにレコードが該当しない場合の値って何が返されるの?
予想だと""なんだけど
0060名無しさん@お腹いっぱい。
垢版 |
2017/04/13(木) 17:33:03.18
>>59
俺は SELECT 結果の行数をカウントして判定してる。

ちなみにシェルスクリプトで sqlplus をカプセル化しようとすると、SQL 実行時のエラーチェックが地味に面倒だよね。
頑張ってね。
0061名無しさん@お腹いっぱい。
垢版 |
2017/04/13(木) 17:57:28.60
>>60
count(0)ですねわかります
シェルスクリプトってsqlで取ってきた値がnullのときその値を変数に格納したらどうなんの?
そもそもselect文で該当なしでエラーになるのかもわからん
0062名無しさん@お腹いっぱい。
垢版 |
2017/04/13(木) 18:02:46.69
なんでこんなこと聞くのって思うだろうけどprintfで書式指定するときにnullが変えるかもしれない変数を%08d$nで指定してるんだよね
文字列指定してけば良かったんだけど、これって修正必要かなぁ
0063名無しさん@お腹いっぱい。
垢版 |
2017/04/13(木) 18:51:39.93
>>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; みたいに変更すればいいだけじゃね?
0065名無しさん@お腹いっぱい。
垢版 |
2017/04/14(金) 18:54:35.33
澁谷 恭正 (46歳)

千葉県立沼南高柳高等学校卒

松戸市立六実第二小学校PTA会長

小学女子レイプ殺人で逮捕


お住まい:
千葉県松戸市六実4-8-1 Mシャトレ

お子さん:
ひりゅう、あやか ※父子家庭

趣味傾向:
アニオタ
0066名無しさん@お腹いっぱい。
垢版 |
2017/04/14(金) 18:55:56.71
SQL*Plus、PL/SQLに詳しくないからそういう発想になるのはわかるが、普通にやれよ。
0067名無しさん@お腹いっぱい。
垢版 |
2017/04/15(土) 15:48:43.00
>>66
普通ってやんだよw
0068名無しさん@お腹いっぱい。
垢版 |
2017/04/15(土) 17:42:26.47
シェルとsqlplus触ったの1,2ヶ月だけど、半年後にはおまえ超えてるから
0069名無しさん@お腹いっぱい。
垢版 |
2017/04/15(土) 17:43:22.15
シェルなんてゴミ言語勉強するほどでもないけどなw
0070名無しさん@お腹いっぱい。
垢版 |
2017/04/15(土) 18:11:52.36
クエリを2度実行するコストよりもってあるけど、コストそんなかからないし、どっちでもよくね。
sqlじたいそんな詳しくなくてすまんな
0071名無しさん@お腹いっぱい。
垢版 |
2017/04/15(土) 18:15:32.21
ワンステップでどんだけコストかかる現場にいたのか
0073名無しさん@お腹いっぱい。
垢版 |
2017/04/15(土) 18:53:59.01
これはステップ数大きいけど、たしかおれは2ステップで書いた
0074名無しさん@お腹いっぱい。
垢版 |
2017/04/16(日) 03:11:26.19
>>72
なんで例外処理でやらないのか?
基本中の基本だぞ。
0075名無しさん@お腹いっぱい。
垢版 |
2017/04/16(日) 13:19:14.99
>>74
だからやってるって話だよ
バカなの
0076名無しさん@お腹いっぱい。
垢版 |
2017/04/16(日) 13:20:30.64
シェルでカプセル化とかもわけわからんし、このスレわからんわ
0078名無しさん@お腹いっぱい。
垢版 |
2017/04/17(月) 16:49:07.58
$ 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
意外とあるな
0081名無しさん@お腹いっぱい。
垢版 |
2017/04/18(火) 17:45:32.71
>>80
ほほう -d オプションというものがあるのか……と思ったんだけど、これって bash のみだったりする?
手元の古い tcsh には無いみたい。それとも最近のシェルなら普通に実装されてるのかな。
0083名無しさん@お腹いっぱい。
垢版 |
2017/04/19(水) 12:00:20.42
>>78
こういうのって、fgrepにIをつけたほうがいいのかな。
0085名無しさん@お腹いっぱい。
垢版 |
2017/04/19(水) 12:41:43.72
>>84
ありがとうございます
昔、binの中等気をつけろと言われた事があったので勘違いしてました
0086名無しさん@お腹いっぱい。
垢版 |
2017/04/19(水) 16:28:25.43
>>75
なんでexceptionでno_data_foundを拾わないのか?

カウントしてしまうのは、不慣れなひとがよくやるけど。
0091名無しさん@お腹いっぱい。
垢版 |
2017/04/21(金) 17:16:08.95
>>88
え?
0092名無しさん@お腹いっぱい。
垢版 |
2017/04/21(金) 18:35:17.79
この中で過去にシェルを仕事でやってたって人何人くらいいるのかな
0093名無しさん@お腹いっぱい。
垢版 |
2017/04/21(金) 21:31:36.96
自分はインフラ関連やってたよ
今は仕事ではコンソール触ることはなくなったけど
家で動画ダウンロード用のスクリプト組んだりしてる
0094名無しさん@お腹いっぱい。
垢版 |
2017/04/21(金) 21:34:59.83
ちなみに性能情報の収集や監視スクリプト、
バックアップとかの運用シェル作ってたけど
可読性も考えてオーソドックスなプログラミングのような書き方をしてたから
超何かよく分からん使い方をしてるココの人の方がシェルスクリプト知ってると思う
0095名無しさん@お腹いっぱい。
垢版 |
2017/04/22(土) 04:52:18.92
>>94
よくわからない書き方してるほうが上手いとも言えないでしょ
0096名無しさん@お腹いっぱい。
垢版 |
2017/04/22(土) 04:53:18.13
linuxってちゃんと使いこなせれば快適だよなすごいわかる
0097名無しさん@お腹いっぱい。
垢版 |
2017/04/22(土) 05:55:28.79
>>92
shだけの仕事は数えるほどしかないけど
他の仕事の小道具として毎回のように出てくるな
javaとかwindows系の仕事だと使えなくてめんどくさい
開発ツールとしては使うけど
0099名無しさん@お腹いっぱい。
垢版 |
2017/04/22(土) 19:43:27.62
>>98
めずらしいとは思ってないけどさ、働いてないのかと思った。
何かしら経験ある人もいるのな、仕事で使ってて家でもシェルいじろうとかよく思えるな
0104名無しさん@お腹いっぱい。
垢版 |
2017/04/24(月) 16:02:53.74
他紙蟹
わかったからそんなせめんなよごめんなっっ
家でシェル使ってる人ってwindows機は別にあるの?
0105名無しさん@お腹いっぱい。
垢版 |
2017/04/24(月) 17:31:59.58
あるよ、自分はWindowsなんて使わないという偏屈ではないしさ
Linuxの実機はラズパイだけであとは仮想環境
まあ他にも色々あるけど実際に使ってる環境ってことならね
>>103を書いたのは嫌気がさして書いたんじゃなくて
目的や知識がないとシェルなんて触る機会もないでしょって意味で書いた
0106名無しさん@お腹いっぱい。
垢版 |
2017/04/24(月) 17:49:44.72
ubuntu on the windowsのおまえらの率直な感想が聞きたい
0112名無しさん@お腹いっぱい。
垢版 |
2017/04/25(火) 00:43:15.05
>>109
やるじゃんそーゆー振り切ってる感じ好きだぜ
0113名無しさん@お腹いっぱい。
垢版 |
2017/04/25(火) 00:49:06.70
>>111
そうは言ってなかったな、シェルなんて職場で使わなきゃやろうと思わないでしょって言ってたよ
0114名無しさん@お腹いっぱい。
垢版 |
2017/04/25(火) 00:51:05.94
ぶっちゃけLinuxだけだと不便やねん、だからどっちもいるねん、必須なのはWindowsやねん、結局便利だけどLinuxは無くてもいけるねん
0116名無しさん@お腹いっぱい。
垢版 |
2017/04/25(火) 01:15:23.26
>>113
仕事も勉強も関係なくエロ画像収集に使うだろ
初めてはSSIとかCGIだったな
ISPでシェルアカウント付きのとこもあった
やらされてるだけの人には価値はわからんだろうけど
■ このスレッドは過去ログ倉庫に格納されています

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