シェルスクリプト総合 その27
■ このスレッドは過去ログ倉庫に格納されています
シェルスクリプトの総合スレです。 □お約束 ・特記なき場合は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/ FAQ Q. 秘密結社シェルショッカーってなんですか? A. しらん。どっかの変態団体やろ。近寄らんほうが良い。 Q. USP友の会ってなんですか? A. しらん。どっかの変態団体やろ。近寄らんほうが良い。 Q. シェル芸ってなんですか? A. しらん。ヲタ芸みたいなもんやろ。恥ずべきものや。 Q. ユニケージ開発手法ってなんですか? A. しらん。所でアプリの開発には普通のプログラム言語使ったほうが良いぞ シェルスクリプトの総合スレです。 初心者、学生、アマチュア、プロ、シェルの種類や 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 参照 ) ★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 ★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/ 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/ ★え?Windowsでシェルを!? Bash on Ubuntu on Windows©2ch.net https://mevius.5ch.net/test/read.cgi/win/1470496450/ Win10がBash・linuxコマンドに公式ネイティブ対応★3 [無断転載禁止]©2ch.net https://mevius.5ch.net/test/read.cgi/win/1459904955/ 【Bash】Windows Subsystem for Linux【Ubuntu】2©2ch.net https://mao.5ch.net/test/read.cgi/linux/1468149353/ Bash for Ubuntu for Windowsで開発しようぜ! [無断転載禁止]©2ch.net https://medaka.5ch.net/test/read.cgi/prog/1493495197/ シェルスクリプトの勉強をしたいです WindowsよりMacの方がいいんですかね? 今Windows使ってるならその上で環境作った方が楽だと思うけど わざわざMac買ったって他のことで苦労するよ >>12 ありがとうございます 今Windowsでvirtualboxにubuntu入れてやっているんです Macだと仮想環境じゃなくてその物がUNIXだから勉強するにはもっといいかなと思ったんです 職場が今年からMacになってしまいましたし 手始めにbashの入力履歴を自在に編集できるスクリプト組んでごらん Windows 10ならWSLでUbuntuがほぼそのまま使えるやん WSLってちゃちな玩具みたいなもんだろ あんなもの使ってる奴がここにいるのか? そもそろWindows10て >>16 使えるよ いままでcygwin入れてたけど、代わりに使ってる。 最近はちゃんと動くし、 cygwinよりはちゃんとしてるから色々使いやすい。 飽くまでもローカルでのツール的な使い方でね あとはGimpとかわざわざWin32版を使ってたようなものもそうする必要語なくなった。 サーバで動かすようなものを作る場合はちゃんとlinuxネイティブの環境でコンパイルから動作確認までする。 >>16 WSLがおもちゃじゃないと認めるにはなにが必要? 多分すでに実現できてると思うけどさ このスレの親だっけか。aliasが便利っていうレスがあったけど、確かにそうだわ。 とりあえずalias NOP=':'として明示的に「何もしない」命令を作れる。 NOP() {:}より作るのが楽。 >>20 ←こういう奴ってオブジェクト指向とか理解できなさそう。 「クラス作るとかコードが長くなるだけじゃん」とか言って。 シェルスクリプトにオブジェクト指向とか言い出す方がTPOをわきまえないトンチンカンだけどな シェルスプリプトもオブジェクト指向な言語(?)になればいいね。いや、C言語が未だに基盤としては唯一なのと同じで必要としてない、されてないか 素人の頓珍漢な質問だと思います。すいません。 $ echo "$$" | echo "$(cat), $$" とすると、 n, n といったように同一の番号が表示されますが、これは正当な挙動なのでしょうか。 $$には現行コマンドのPIDが入っているとマニュアルで読んだのですが、なぜ違うコマンドが同じPIDを持っているのでしょうか……。 なんのマニュアルか知らんけど違うよ。シェルのPID。なので同じなのは当然 ps ってしてみりゃ、そのPIDがそのシェルのPIDってわかるっしょ ($$にも問題あって、より正確には$BASHPIDの方がだけど) BASHPID Expands to the process ID of the current bash process. This differs from $$ under certain circumstances, such as subshells that do not require bash to be re-initialized. ディレクトリ→オブジェクト 実行ファイル→メソッド テキストファイル→プロパティ シンボリックリンク→継承、委譲 >>19 なにが楽なのかよくわからない alias NOP=: NOP() { :; } >>23 シェルスクリプトはオブジェクト指向言語ではなくて 関数型言語だからなぁ 標準入力からの配列(複数の行)を入力して フィルタかまして標準出力に出力する この動きがメインとなってる 構造体も配列もない言語で、そんな複雑なデータ構造使うプログラム書いちゃいかん。 そういうのは他の言語に任せて、シェルスクリプトはその間のグルーに徹するようにしないと保守不能になる。 >>31 配列あるよ?POSIXシェルにはないんだっけ? 少なくとも ksh で配列を使ったことはあるなあ。 >>33 POSIX仕様にある配列は $@ だけでしょ。 >>32 シェルでオブジェクト志向って言ってる人。 関数型風に書ける範囲内で関数型風に書くのは構わないと思う。 ただしBourneシェルを関数型言語だ等と主張したら、関数型言語の専門家に鼻で笑われるのは必至だな。 オブジェクト志向じゃない、オブジェクト指向だ、すまん。 なんで変換ミスって送った直後に気づくんだろうなあ。 オブジェクト指向云々は、多分、 名前重要って事を言いたかったんだと思うよ たぶん>>21 はオブジェクト指向の文脈で名前の付け方の重要性を知って んで、その前提でオブジェクト指向って単語を出したんだろうけど 他の人はその前提を共有してないから、シェルでオブジェクト指向(笑)となって 挙句関数型だの尾ひれはひれに揚げ足取りするに至ったと憶測しました >>37 ,38 それは知っていてのだったがな そこここにはそれ流があると思うよ。LinuxとかBSDのソース見たらいまだにC流で短かったりするし。シェルスクリプトなら>>20 っていう意見があってもいいだろう、そもそもいろいろ記号的なもんだから なのにいきなりオブジェクト指向とか言い出し馬鹿にするのがTPOをわきまえない馬鹿だなっていう シェルスクリプトがオブジェクト指向ならそれはそれでオブジェクト指向言語というかそれでのフレームワークなどでの名前付け方がってのはわかるけど 名前に拘るならNOPも略さずにNoOperationで 名前の長さとオブジェクト指向は独立した話だからなあ。 オブジェクト指向って言うからにはクラスか、あるいは型のプロトタイプか、どっちかは必須だろう。 >>38 あまりにも的確な分析にワロタ。まさか御本人様ですか?w まあ文字だけのコミュニケーションだといろいろと伝わりにくいことが多いから、お互い気を付けないとね。 秒を分に変更するにはどんなコマンドを使ったらいいですか? 3000という文字があったとして、50にしたいです date -d "3000" +"%M"だとダメでした $(( 3000 / 60 )) `expr 3000 / 60` 普通に算術で date使ってもある意味無理やりなのは、 Linux date -d "@3000" +"%M" BSD date -r 3000 +%M >>44 は@が抜けてる >>45 >>46 どうもありがとうございます!! date -d "@3000" +"%M" これだと、59分以上を表せなかったです。 >>49 そうだね。 $ echo 3000/60 |bc 50 $ echo 4000/60 |bc 66 だんだん数値が大きくなっていって閏年で悩むんだろうなあ >>50 bcのマニュアル読もう! $ printf '%.0f\n' "$(echo '4000/60' | bc -l)" 67 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる