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

■ このスレッドは過去ログ倉庫に格納されています
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/
2017/03/20(月) 12:18:18.85
すまん、立てたはいいがセキュリティ違反か何かでテンプレが貼れない
誰か貼れないか
2017/03/20(月) 12:24:45.46
ls -エル かな以前これで引っかかったことがある
ls -Rl とかなら通るんだけど
2017/03/20(月) 14:13:27.13
>>1
> □お約束
> □初心者へのアドバイス:
> □回答者への注意事項:

□じゃなくて■にして欲しい
2017/03/20(月) 15:00:21.27
>>4
それってなぜ?漢字のくちやカタカナのろと間違えやすいから?
2017/03/20(月) 16:21:48.83
>>2
同じく書けなかった。テンプレ書こうとするとなぜかYou are blocked となる。
2017/03/20(月) 17:09:06.18
前スレ立てられたの2年前みたいだし、その間に規約かその辺の変更でもあったかな
2017/03/20(月) 17:32:38.34
シェルスクリプトの総合スレです。
初心者、学生、アマチュア、プロ、シェルの種類や OS を問いません。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずはテンプレートをご覧下さい。

□A. お約束
1. 特記なき場合は #!/bin/sh がデフォルトです。この場合可搬性に注意し、
 Traditional Bourne Shell もしくは、POSIX 相当のスクリプトでお願いします。
 bash / zsh / ksh / ash / dash や OS 等に依存する場合は、明示しましょう。
 良く分からない方は、使用している OS を書いておけば OK です。是非ご参加下さい。
2. 質問する前に、まず自分で調べましょう。ただし、
 「聞くは一時の恥、聞かぬは一生の恥」です。積極的に参加しましょう。
3. 相手を侮辱する発言、失礼な発言は差し控え、知的な議論を楽しみましょう。
4. 他者には様々な環境や事情、目的が有る事に留意し、無下に扱う様な発言は
 控えましょう。

□B. お約束の補足
1. Mac OS X では、/bin/sh の実体は bash です。また、一般的に BSD 系 や
 GNU/Linux の方は、/bin/sh がシンボリックリンクですので、注意して下さい。
 ls (ハイフン)l /bin/sh や readlink -e /bin/sh で確かめて下さい。
2. 可搬性については、下記 F.1 を参照して下さい。
3. POSIX については、man 7 standards や下記 F.2 ( の特に Shell & Utilities )
 を参照して下さい。
4. Traditional Bourne Shell とは、UNIX Version 7 から SVR4.2 の /bin/sh を元に
 小さなの改変を加え主に商用 UNIX で残されているものです。( 下記 F.3 参照 )
5. Traditional Bourne Shell で入手しやすい sh は、後期 SVR4.0 から派生し、
 SunOS 5 / OpenSolaris を経た、Heirloom Bourne Shell です。
 SVR4 / SVID3 相当です。同様の Unix utilities も扱っています。
 ( 下記 F.3 参照 )
2017/03/20(月) 17:32:51.71
ls - lがだめなんですよ
2017/03/20(月) 17:33:10.57
□C. 初心者へのアドバイス
1. シェルスクリプトのことをシェルってゆーな
2. 知らないコマンドが出てきたら man コマンドで調べましょう。
3. UNIX には、シェルスクリプトに便利な小さなコマンドが色々あります。
 apropos ないしは man -k でそれらしい単語による簡単な検索もできます。
4. シェルの構文や内部コマンドは man sh で。英語は LANG=C man shで。
5. 思い通りに動かないときは、まずは #!/bin/sh -x でトレースしましょう。
6. 適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 awk / perl / javascript / ruby / python 等、他の (スクリプト) 言語の方が
 適した処理にはそちらを使いましょう。
7. シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題は正規表現スレへ
8. csh / tcsh のシェルスクリプトは推奨されません。理由は下記を参照
 http://www.speech-lab.org/~hiroki/csh-whynot.euc
9. cat file|すんなハゲ
 a. 詳細は "Useless Use of Cat" UUOC で検索して下さい
 b. 有用な場合も有ります Useful use of cat(1) 英文
  http://www.in-ulm.de/~mascheck/various/uuoc/

□D. シェルスクリプトでよく使うコマンド
1. 制御・条件判定系: [, test, expr, true, false, yes, getopts
2. テキスト処理系: cat, awk, sed, tr, sort, uniq, grep, wc, head, tail, cut,
 paste, comm, join
3. ファイル検索系: find ( スペースなどを含むファイル名を正しく処理するため、
 find は -exec command {} + を推奨。
 他に -print0、xargs は -0 オプションという方法もあるが Solaris 非対応 )
4. ディレクトリ系: basename, dirname
5. 出力系: echo, printf
6. 対話コマンド制御系: expect
7. http / ftp の処理自動化: wget, curl
2017/03/20(月) 17:33:34.08
□E. 学習用テキスト
1. Bourne Shell自習テキスト ( 1993年 ) pdf お薦め
 http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/sh-text/sh/
 (↑サイト消滅かも)
 http://ayapin.film.s.dendai.ac.jp/~matuda/Lecture/PDF/sh-two.pdf
2. UNIX FAQ LIST
 http://www.nurs.or.jp/~asada/FAQ/UNIX/UNIX.FAQ.html
(3. シェルを使おう - 導入からプログラミングまで - ( 2002年 )
 http://www.netfort.gr.jp/~tomokuni/lms/shell/ (リンク切れ))

□F. 参考リンク
1. 可搬性関連
 a. autoconf マニュアル 移植性のあるシェルプログラム
  http://www.gnu.org/software/autoconf/manual/autoconf.html#Portable-Shell
  http://www.geocities.jp/fut_nis/html/autoconf-ja/Portable-Shell.html
 b. Portability talk [Bash Hackers Wiki] 英文
  Obsolete and deprecated syntax も見る価値有り
  http://wiki.bash-hackers.org/scripting/nonportable
 c. How to make bash scripts work in dash 英文
  http://mywiki.wooledge.org/Bashism
 d. DashAsBinSh 英文
  https://wiki.ubuntu.com/DashAsBinSh
 e. Portable Shell Programming 英文
  http://www.in-ulm.de/~mascheck/various/portability/
2017/03/20(月) 17:33:47.61
2. POSIX
 The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition 英文
 http://pubs.opengroup.org/onlinepubs/9699919799/
3. Traditional Bourne Shell 関連
 a. The Traditional Bourne Shell Family History and Development 英文
  http://www.in-ulm.de/~mascheck/bourne/
 b. BourneShell / Where does the Bourne shell live? 英文
  http://mywiki.wooledge.org/BourneShell
 c. The Heirloom Bourne Shell 英文
  http://heirloom.sourceforge.net/
4. マニュアル
 a. The Base Specifications Issue 7, 2013 Edition 英文
  http://pubs.opengroup.org/onlinepubs/9699919799/nfindex.html
 b. FreeBSD 日本語マニュアル検索
  http://www.jp.freebsd.org/man-jp/search.html
 c. JM Project (Japanese)
  http://linuxjm.sourceforge.jp/
5. FAQ 等
 a. UNIXの部屋 ( 2011年 )
  http://x68000.q-e-d.net/~68user/unix/
 b. Linux JF (Japanese FAQ) Project
  http://linuxjf.osdn.jp/
 c. Advanced Bash-Scripting Guide 英文
  http://www.tldp.org/LDP/abs/html/
 d. Unix Programming FAQ 日本語訳 ( 2000年 )
  http://www.race.u-tokyo.ac.jp/~moro/unix-programmer/
2017/03/20(月) 17:34:01.41
6. ツール
 a. web tool です。Vim syntastic や Emacs の Flycheck でも使えます
  ShellCheck
  http://www.shellcheck.net/about.html
 b. vim 用 syntastic
  https://github.com/scrooloose/syntastic
 c. checkbashisms も使用してチェック duggan/shlint GitHub
  https://github.com/duggan/shlint

□G. 前スレ
1. ☆シェルスクリプトを勉強するにあたって☆
 http://hibari.2ch.net/test/read.cgi/unix/989659936/
2. 便利なシェルスクリプト見せろ
 http://pc.2ch.net/test/read.cgi/unix/996949546/
3. シェルスクリプト総合 その1
 http://pc5.2ch.net/test/read.cgi/unix/1101820646/
後略。検索して下さい
2017/03/20(月) 17:34:15.91
□H. 関連スレ(UNIX板/プログラム板)
1. sed
 http://peace.2ch.net/test/read.cgi/unix/1085730992/
2. 正規表現
 http://peace.2ch.net/test/read.cgi/unix/1039165754/
3. Regular Expression(正規表現) Part13
 http://peace.2ch.net/test/read.cgi/tech/1415149975/
4.Perlについての質問箱 64箱目 [転載禁止](c)2ch.net
 http://peace.2ch.net/test/read.cgi/tech/1417291896/
5. ECMAScript デス 4
 http://peace.2ch.net/test/read.cgi/tech/1325448978/
6. Ruby 初心者スレッド Part 57©2ch.net [転載禁止](c)2ch.net
 http://peace.2ch.net/test/read.cgi/tech/1426165733/
7. Pythonのお勉強 Part50
 http://peace.2ch.net/test/read.cgi/tech/1413474092/
8. 【node.js】サーバサイドjavascript 3【io.js】(c)2ch.net
 http://peace.2ch.net/test/read.cgi/tech/1419673207/

□I. 現在評価待ち: X.n は予定した追加先。主にスレ立て人の判断保留用。
2017/03/20(月) 17:38:33.53
なるほどサンクス、そこだけだったのね
2017/03/20(月) 17:51:56.12
乙です

正規表現スレなんてものもあるのか
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
}

そもそもこんがらがってきているのでお助け下さい
2017/03/22(水) 02:46:07.39
retrun になってる
他は知らん
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]")
以下省略
}
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"
2017/03/25(土) 10:19:05.39
>>20
なぜ出力を解析した?
実行結果を使うべきではなかったのか?
2017/03/25(土) 10:25:44.42
一般にstdoutとstderrは用途が違うから(stderrはstdoutがリダイレクト
されても端末に出したいとか)、エラーテキストをgrepするような
ことをしたい場合は意識しないといけないね
ただ、pingコマンドの場合は終了コードを見るのが王道だと思う
2017/03/25(土) 13:57:40.19
>>21-22
いまは$?見てる
元々は何パーセントかロスしてもいい造りにする予定だったんだ
最終的には正常0、ロスあり1、リンクダウン2だったので
0以外は問題ありって言う処理に修正した
2017/03/25(土) 20:08:07.22
grepはcolor表示でマッチしてるか確かめればいい
2017/03/26(日) 04:25:32.34
だいたい何かを作ってエラーが出てハマる時って、基本に立ち返って当たり前の事から検証し始めると解決するよね
大抵本当にアホな理由でつまづく
2017/03/28(火) 06:24:43.37
一人で見てると、くだらないとこでハマったりよくあるな
一分でわからなければ二分探索する
2017/03/28(火) 08:39:53.43
そして天下三分の計
2017/03/28(火) 08:41:28.46
sakura四分割の術
2017/03/28(火) 14:00:15.46
出会って五分でバグ出し
2017/03/30(木) 17:29:20.60
簡単なマルチプロセスの方法ないか考えてたら
置換コマンドを変数で定義してやって、|でつなげてやればいいだけだった
2017/03/30(木) 18:14:02.75
&でなく?
2017/03/30(木) 18:30:02.88
&だと、サブシェルになるんで変数の取り出しが面倒
33名無しさん@お腹いっぱい。
垢版 |
2017/03/30(木) 21:12:06.15
>>32
マルチプロセスだろ?
34名無しさん@お腹いっぱい。
垢版 |
2017/03/31(金) 16:30:56.29
本报讯(记者黄辛)复旦大学药学院李聪团队和附属华山医院毛颖团队合作,
将一种新型纳米探针用于脑肿瘤手术导航,通过纳米探针对脑胶质瘤酸性环
境的响应性成像引导手术切除,有望为改善脑胶质瘤手术的预后提供一种新
策略。相关研究成果近日秋月康秀在线发表于《先进材料》。
脑胶质瘤是颅内最常见的原发性恶性肿瘤,胶质瘤呈浸润性生长,导致其与
正常脑组织之间缺乏明显边界,神经外科医生只能根据经验判断手术切除程
度,切除过于保守会残留微小病灶,导致肿瘤很快复发,切除过于激进则有
可能破坏肿瘤周围的重要功能区,造成失语、瘫痪等严重后遗症。
该研究发现了一种对肿瘤酸性环境具有双模态信号响应的探针,可用于引导
胶质瘤的手术切除。”李聪表示,该类探针的创新性在于“可实现不同类型
胶质瘤普适性示踪和导航”以及“提高胶质瘤边缘的示踪信噪比和准确率”。
35ich1
垢版 |
2017/04/01(土) 07:50:24.43
https://goo.gl/QoUujp
これは嫌だなー。。本当なの?
2017/04/01(土) 13:12:08.71
どうせグロネタだろ
2017/04/01(土) 13:29:34.75
とうせアフィ貼ってるスクリプトだろ
goo.glはURLの末尾に+つけるとリンク先が見れる
2017/04/01(土) 14:55:47.20
短縮URLは完全スルーだしNGワードにしようと思えばできるし
コメントもスパム丸出しだから問題ない
39名無しさん@お腹いっぱい。
垢版 |
2017/04/01(土) 22:25:57.55
シェルスクリプト用のトランスパイラとか
ビルドツールってないですかね?

JavaScriptの世界であるような、それらがあれば
POSIX標準のままシェルスクリプトという言語仕様を
拡張できるのですが
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'

なんで、下二つは最後の行が表示されないの?
しかもダメの下は置換もされないのは、なぜ?
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/'
2017/04/03(月) 12:09:41.36
echo -eはなんか厄介
他のディストリに持ってったら動き(表示だけど)が違った
2017/04/03(月) 12:50:52.83
-e が使えない場合もあるので printf で
44名無しさん@お腹いっぱい。
垢版 |
2017/04/03(月) 19:25:53.89
>>41
そういうの書くな。
バグの温床だ。
45名無しさん@お腹いっぱい。
垢版 |
2017/04/03(月) 19:26:37.45
OSによって挙動が異なるかもしれないので危険。
2017/04/03(月) 19:34:32.62
だから意味がないって書いたやん
47名無しさん@お腹いっぱい。
垢版 |
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の内容が無限にコピペされる」

となったんだが、どうしてこうなるのか誰か知ってたら教えて!
2017/04/03(月) 23:41:45.44
ファイルですくりぷた
のうごきをかんがえよう
2017/04/04(火) 00:57:45.30
>>47
考えたらわかったけど、知らなかったから教えない
2017/04/04(火) 01:03:26.09
へんくつなやつしかいねー
2017/04/04(火) 01:11:40.09
シェルとcatがそうなるような実装になってるんだろう
わりと自然な結果だと思う
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の挙動は知らんかったなぁ。
2017/04/04(火) 12:04:17.27
2 の場合、bash, dash, ksh だと input file is output file って表示される
bash では noclobber を unset にしても同じ
2017/04/04(火) 12:11:59.45
>>53
それはcatの引数が入力ファイルだと言う知識をshellがもってるという事だね
気持ち悪い
2017/04/04(火) 12:16:42.64
これは無限ループにもエラーにもならない

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

しかし、ファイルサイズがパイプやプロセスのバッファサイズを
超えるとどうなるか…こんな場合は moreutils の sponge コマンドかな
2017/04/04(火) 12:40:17.25
Cで言う未定義なみたいなもので、どういう結果になろうが客観的な意味は無い
2017/04/04(火) 14:59:59.10
>>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
2017/04/04(火) 16:51:55.21
>>57
ありがとう、GNU cat だからなのね
59名無しさん@お腹いっぱい。
垢版 |
2017/04/13(木) 16:40:20.18
sqlplusでselect文を実行したときにレコードが該当しない場合の値って何が返されるの?
予想だと""なんだけど
2017/04/13(木) 17:33:03.18
>>59
俺は SELECT 結果の行数をカウントして判定してる。

ちなみにシェルスクリプトで sqlplus をカプセル化しようとすると、SQL 実行時のエラーチェックが地味に面倒だよね。
頑張ってね。
61名無しさん@お腹いっぱい。
垢版 |
2017/04/13(木) 17:57:28.60
>>60
count(0)ですねわかります
シェルスクリプトってsqlで取ってきた値がnullのときその値を変数に格納したらどうなんの?
そもそもselect文で該当なしでエラーになるのかもわからん
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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