トップページunix
1002コメント330KB

シェルスクリプト総合 その25©5ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net2015/08/14(金) 23:42:01.51
シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その24
http://peace.2ch.net/test/read.cgi/unix/1415634843/
0368名無しさん@お腹いっぱい。2016/01/01(金) 22:44:41.53
a happy new yeah.

>>367
素晴らしい!
0369名無しさん@お腹いっぱい。2016/01/02(土) 22:52:05.39
有難う!ファイルを書いた人は素晴らしいよね
0370名無しさん@お腹いっぱい。2016/01/14(木) 11:46:10.89
質問です
テキストファイルだけのデータベースを作ろうと思ってます
どんなシェルスクリプトを書けばいいと思いますか
皆さんのお知恵をお貸しください

あとシス管系女子に登場するみんとちゃんのスリーサイズが分かりません
知っている人がいたら教えて下さい

よろしくお願いいたします
0371名無しさん@お腹いっぱい。2016/01/14(木) 12:18:20.24
テキストファイルだけのデータベースってどんなん?
0372名無しさん@お腹いっぱい。2016/01/14(木) 12:37:09.51
女だらけの水泳大会みたいなものだろ
0373名無しさん@お腹いっぱい。2016/01/14(木) 13:49:41.31
Berkeley DB使え、とかそういう話?
0374名無しさん@お腹いっぱい。2016/01/14(木) 19:07:54.47
人のボケつぶした上にダダスベリって最悪じゃね?
0375名無しさん@お腹いっぱい。2016/01/14(木) 19:32:14.79
職場の開発環境がLinuxでcshなのですが
cshでいいリファレンスはありませんか?
ネットが使えないのでWebページは無理です。
0376名無しさん@お腹いっぱい。2016/01/14(木) 20:23:34.08
定年間近の老人から口伝で受け継ぎましょう
0377名無しさん@お腹いっぱい。2016/01/14(木) 22:27:43.69
changelogで日記書く人もいるしな
0378名無しさん@お腹いっぱい。2016/01/14(木) 22:57:32.14
昔はC Shellフィールドガイドとかいう本が定番だったような
もう30年近く前のことだけど…
それにしても開発環境がcshでネットが使えないって、ある意味すごいと思うw
0379名無しさん@お腹いっぱい。2016/01/14(木) 23:03:15.63
>>375
ネットがダメなら本しかないじゃないか
いま流通してるのって
http://www.amazon.co.jp/dp/4893620290
くらいかな
0380名無しさん@お腹いっぱい。2016/01/14(木) 23:24:27.93
いまどきc shell使っているところってC言語でも使ってるの?
0381名無しさん@お腹いっぱい。2016/01/14(木) 23:24:38.54
ネットが使えないのにアマゾン?
0382名無しさん@お腹いっぱい。2016/01/15(金) 00:15:28.22
みんとちゃんは天使
0383名無しさん@お腹いっぱい。2016/01/15(金) 11:42:41.05
>>374
もともとのボケからすべってるじゃん
0384名無しさん@お腹いっぱい。2016/01/15(金) 14:57:47.22
ここにいる様な人たちとだけは仕事したくないな〜
0385名無しさん@お腹いっぱい。2016/01/15(金) 15:21:01.14
>>375
マスタリングcshは目の前に転がってるが、他にも合った気がするが
みつからない。
0386名無しさん@お腹いっぱい。2016/01/15(金) 15:29:47.22
みんとが、rm -rf で全消ししても許してあげるし、データリカバリの講義を、みっちりやったげる
ここの住人がやったら半殺し
0387名無しさん@お腹いっぱい。2016/01/15(金) 15:51:51.83
データーリカバリーとデリヘルって似てるね
0388名無しさん@お腹いっぱい。2016/01/15(金) 16:08:50.97
ディスカバリーチャンネルとデタリカバリーチャンネルも似てるね。
0389名無しさん@お腹いっぱい。2016/01/15(金) 21:52:13.77
20年少し前だと、もう csh でスクリプトを書かない事を進められた
SunOS でログインシェルは、csh がデフォで tcsh に切り替え
0390名無しさん@お腹いっぱい。2016/01/15(金) 21:54:24.42
☓ 進められた
0391名無しさん@お腹いっぱい。2016/01/15(金) 22:29:29.27
cshがスクリプトに向かないのは有名だね。
でも短いスクリプトなら、配列が使えたりとかshより便利なケースがないでもない

>>375
manは入ってないの?
0392名無しさん@お腹いっぱい。2016/01/17(日) 00:38:52.85
shって配列使えないんだ?
bashは使えるよね、二次元配列も
0393名無しさん@お腹いっぱい。2016/01/17(日) 13:36:42.66
http://wiki.bash-hackers.org/scripting/nonportable
こういったポータビリティに関することを一発でチェックするための自動テストスイートってないものかね。
それがあればシェルの比較表もすぐに作れると思うんだが。
0394名無しさん@お腹いっぱい。2016/01/17(日) 15:16:57.76
>>393
>>6 というか checkbashisms
http://manpages.ubuntu.com/manpages/wily/en/man1/checkbashisms.1.html
0395名無しさん@お腹いっぱい。2016/01/21(木) 07:44:44.20
外部コマンドの違いも有るよね
GNU のコマンドは機能拡張しまくっていて、UNIX 哲学が云々

grep -o -p とかダメだろうな(と思って調べると、OpenBSD は -o を持っているのか)
http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/egrep.1?query=grep
0396名無しさん@お腹いっぱい。2016/01/21(木) 09:51:46.27
sed -iとかな
0397名無しさん@お腹いっぱい。2016/01/21(木) 21:38:36.72
オプションをある程度統一してほしいよね
-hでヘルプ、-vでバージョン見るくらいは統一してほしい
0398名無しさん@お腹いっぱい。2016/01/22(金) 09:43:42.93
>>397

ほんとになw
0399名無しさん@お腹いっぱい。2016/01/22(金) 10:23:07.08
grep -v してるスクリプトが動かなくなったりしたら嫌だな
0400名無しさん@お腹いっぱい。2016/01/22(金) 21:11:00.15
痛みが大きすぎて統一失敗は無理か
今後も長く使われて行く事を考えると、ある程度統一してほしいなあ

特定の環境変数が定義されている時に限り
統一されたオプションにするとか
0401名無しさん@お腹いっぱい。2016/01/23(土) 00:27:07.84
ロングオプションを使い給え。
0402名無しさん@お腹いっぱい。2016/01/23(土) 16:57:11.77
ロングオプションって、ロング過ぎてなんだかなあ
でも今度から意識してみよっと


ちょっと暇つぶし

list of coreutils (Linux, depends dpkg)
dpkg -L coreutils | sed -ne '\@bin/@s@^.*bin/@@p' | xargs man -f

whatis $( which who )
0403名無しさん@お腹いっぱい。2016/01/23(土) 19:06:44.06
>>397
http://www.gnu.org/software/coreutils/manual/html_node/Common-options.html
‘--help’ ヘルプ
‘--version’ バージョン
‘--’ オプションリスト区切り
0404名無しさん@お腹いっぱい。2016/01/23(土) 19:21:27.03
>>403
そういうことじゃないだろ…
0405名無しさん@お腹いっぱい。2016/01/24(日) 00:23:36.03
>>401でもう既出だし
GNU系コマンド以外には通用しないケースある
0406名無しさん@お腹いっぱい。2016/01/28(木) 05:58:34.66
毎回ランダムに、コマンドを紹介
http://i.stack.imgur.com/oSyyX.png

元をちょっといじりました。少し無駄が減ったかな
while ! { IFS=:; ls $PATH; } | shuf -n 1 | xargs 2> /dev/null whatis -ls 1,6,8; \
do :; done |
cowsay -f $( ls /usr/share/cowsay/cows | shuf -n 1 )


元ネタ
Are there any games which can train people to learn terminal commands? - Ask Ubuntu
http://askubuntu.com/questions/337300/are-there-any-games-which-can-train-people-to-learn-terminal-commands
> cowsay -f $(ls /usr/share/cowsay/cows | shuf -n 1 | cut -d. -f1) $(whatis $(ls /bin) 2>/dev/null | shuf -n 1)
0407名無しさん@お腹いっぱい。2016/01/28(木) 06:13:04.21
shufって何?
0408名無しさん@お腹いっぱい。2016/01/28(木) 08:36:56.70
GNU coreutilsに入ってる、行単位で中身をランダムに入れ替えるコマンド。
BSD系ならsort -Rで代替できるかな。
0409名無しさん@お腹いっぱい。2016/01/28(木) 09:53:14.50
動いてるシェルスクリプトをkillしたいんだけど
以下のコマンドより冴えた方法ある?

pgrep -f 'sh script.sh' | xargs kill

これで不満なのはシェルスクリプトが実行されてなかった場合
USAGEが出ちゃうところくらい
0410名無しさん@お腹いっぱい。2016/01/28(木) 11:04:04.77
pgrepがあるならpkillもあるでしょ
0411名無しさん@お腹いっぱい。2016/01/28(木) 11:35:34.21
pkillだとshを殺してしまうことになって都合が悪いです〜
0412名無しさん@お腹いっぱい。2016/01/28(木) 11:50:19.16
pkill -f 'sh script.sh'
0413名無しさん@お腹いっぱい。2016/01/28(木) 16:03:14.05
ありがとう
帰ってから試してみる
0414名無しさん@お腹いっぱい。2016/01/30(土) 08:10:48.00
tputで表示させたいのですが改行されません

#!/bin/sh

while :
do
# Get Time
time=
0415名無しさん@お腹いっぱい。2016/01/30(土) 08:14:07.46
すいませんダブルクォーテーションよりしたが表示されませんでした

time=$(tail -n4 check_date.dat)

COLOR=`tput setaf 5; tput smso`
echo -n -e "\033[s"

tput cup ${TCUP_CNT}
NORMAL=`tput sgr0`
echo -n $COLOR$time$NORMAL
echo -n -e "\033[u"
# Interval
sleep 1
done

check_date.dat
tokyo 23:23:23
Mexco 12:12:12
frans 05:50:05

といったデータとなります。
取得方法はいくつかかえてみましたがダメでした。
tputで改行表示する方法があればアドバイスいただけると助かります。
0416名無しさん@お腹いっぱい。2016/01/30(土) 09:44:44.08
tput についていちいち覚えていないので適当でスマンが
気になる点を上げておいた

echo -n $COLOR$time$NORMAL
だと、エスケープされていないので、$time に含まれる改行文字がスペースに置換される

echo -e は bash だろうから、#!/bin/bash にする
新しく書くスクリプトでは `...` よりも $(...) を使うのが望ましい
ループ中で、変わらない変数を定義しない
(確か sgr0 がリセットかなんかで変わらなかったとして)
0417名無しさん@お腹いっぱい。2016/01/30(土) 09:50:10.42
訂正

> echo -e は bash だろうから、#!/bin/bash にする
#!/bin/sh のままで printf を使う方が良いかな
0418名無しさん@お腹いっぱい。2016/01/30(土) 09:50:11.74
全く案が思いつかないので教えてください。
smb上のNASにあるファイルをSDカードにコピペしたいけど、コピーする順番がファイル名昇順でないと不具合が出るので、エクスプローラーではダメなんです。
cpコマンドにNASにあるファイルを指定する方法を教えてください。
0419名無しさん@お腹いっぱい。2016/01/30(土) 10:03:02.46
ls でソートされなければ、
find sort awk cut xargs 等を組み合わせる
0420名無しさん@お腹いっぱい。2016/01/31(日) 10:50:47.29
質問です。

topコマンドやuptimeコマンドで得られるload average
ですが、特定の顧客向けにWebで情報ながしてるサーバーの
それが、普通で10.00、ひどいときには30.00とかになったり
します。

このload average、つまり平均負荷が無名数ですが、何を表して
いると考えたらよいでしょうか? dBって事はないですよね。。。
0421名無しさん@お腹いっぱい。2016/01/31(日) 11:10:19.25
>>420
待ち行列の長さ
0422名無しさん@お腹いっぱい。2016/01/31(日) 14:36:00.53
>>420
http://d.hatena.ne.jp/keyword/%A5%ED%A1%BC%A5%C9%A5%A2%A5%D9%A5%EC%A1%BC%A5%B8
0423名無しさん@お腹いっぱい。2016/01/31(日) 16:34:32.83
>>421 >>422
ありがとうございます。

>ロードアベレージが1以下であれば正常といわれていたが、
>最近のマルチコアCPUにおいては読み方が変わってきている。

なるほど、、、わかったようなわからんような。。。どう変わってきてる
か、知りたい。。。w
ま、いずれにしても、高負荷状態が続いているとみるべきなんですね。
0424名無しさん@お腹いっぱい。2016/01/31(日) 21:07:22.79
>>423
もう少し読めよ
http://d.hatena.ne.jp/naoya/20070518/1179492085
0425名無しさん@お腹いっぱい。2016/01/31(日) 21:09:13.08
procps-ng の uptime の説明が分かりやすい

uptime(1) - Linux manual page
http://man7.org/linux/man-pages/man1/uptime.1.html
0426名無しさん@お腹いっぱい。2016/02/02(火) 07:53:41.39
>>424
さんくすです。

2コアだから、負荷は半分にした値を考えておけばいいのかな。

>注目するのは、待ちタスク数を数え上げるのにすべてのキューを見て
>合計する一方、その後出力するまでに CPU の数でその値を割ったりは
>していない、という点です。...ロードアベレージは割り算をしていない
0427名無しさん@お腹いっぱい。2016/02/02(火) 07:57:31.80
>>425
頑張って読みます。どもです。
0428名無しさん@お腹いっぱい。2016/02/02(火) 09:57:29.33
待ち行列とかキューとかの意味がわからずサーバー管理やってるんならな
OSのしくみをほんの少しでも勉強したほうがいいよ
特にタイムシェアリングとかプロセス管理のあたり
0429名無しさん@お腹いっぱい。2016/02/02(火) 11:43:42.95
>>426
別に割る必要はないと思うけど
どれくらい溜まってるかを知りたいならだけど
0430名無しさん@お腹いっぱい。2016/02/02(火) 17:43:21.96
UNIX上で、”コマンドを利用した”スクリプトを書き始めよう
と思っています。
そこで、pythonかbashのどちらを選ぶかで迷っています。
今日pythonパイソンの有名どころの本をみたら外部コマ
ンドの利用についての記述が少なくてがっかりしました。
素直に以下の本を読むべきなのでしょうか?
それともpythonの勉強して、ネット上で外部コマンドの
利用を紹介したサイトも勉強すべきなのでしょうか?
アドバイスお願いします

http://www.amazon.co.jp/gp/product/4797321946/ref=ox_sc_act_title_1?ie=UTF8&;psc=1&smid=AN1VRQENFRJN5
0431名無しさん@お腹いっぱい。2016/02/02(火) 18:59:58.26
>>430
マルチ
http://hayabusa6.2ch.net/test/read.cgi/linux/1452251761/324
0432名無しさん@お腹いっぱい。2016/02/02(火) 20:16:40.85
言語はあくまで道具

何をしたいかによる
0433名無しさん@お腹いっぱい。2016/02/02(火) 21:43:18.36
>>432
レスありがとうございました。マルチってそんなにいけないことなん
ですね。失礼しました。
5年以上ぶりぐらいに2chに戻ってたんで驚いてます。
板にもよるのでしょうが。
こちらだけにすればよかったです。

432さんのおしゃる通りだと思います。自分にとってはコマンド
利用してみたいので、まずはbashにしようかなと思ってます。
0434名無しさん@お腹いっぱい。2016/02/02(火) 22:48:53.08
マルチ禁止は2chだけのルールではなく20年以上前のRFCにさえ書かれている基本中の基本
0435名無しさん@お腹いっぱい。2016/02/02(火) 23:02:32.01
おまえら叩きすぎw

329 名前:324[sage] 投稿日:2016/02/02(火) 21:44:34.24 ID:KBWlYUE4 [2/2]
失礼しました。
ルール知りませんでした。5年以上2chやっていなかったので。

330 名前:login:Penguin[sage] 投稿日:2016/02/02(火) 22:53:07.59 ID:tNcqGKOV
>>329
5年前でもマルチはアカンかったでしょ

331 名前:login:Penguin[] 投稿日:2016/02/02(火) 22:54:56.17 ID:9nG661Lj [2/2]
2chに限らずどこでも嫌われるでしょ

332 名前:login:Penguin[sage] 投稿日:2016/02/02(火) 23:00:54.39 ID:ZV8eeIqB [2/2]
本人はそう思ってないんだろう
死ね
0436名無しさん@お腹いっぱい。2016/02/03(水) 00:07:58.02
たたかれても懲りずに勉強してね

スクリプトを色々と探してきて、長さ順にリストアップする
{ IFS=:; find $PATH; } | xargs readlink -e | xargs file | grep ' script' |
while IFS= read -r line
do echo "$(
echo "$line" | cut -d : -f 1 | xargs wc -l
)$(
echo "$line" | cut -d : -f 2
)"; done |
sort -k1gr,1
0437名無しさん@お腹いっぱい。2016/02/03(水) 06:35:39.85
だいたい、bashとpythonどっちかっていう問題か?ww
どっちも並行してやるべき。
0438名無しさん@お腹いっぱい。2016/02/04(木) 06:50:05.93
『20年動く』本読んだけどひたすら方言に配慮する話書いてあった
もうpythonでいいや
0439名無しさん@お腹いっぱい。2016/02/04(木) 08:44:03.15
>>438
pythonは後付けのなので、そのうちなくなるかもしれません。

Windowsにはそういうものがありました。
0440名無しさん@お腹いっぱい。2016/02/04(木) 08:55:41.67
なくならないにしても、python2のスクリプトのかなりがpython3で動かなくなるよ
0441名無しさん@お腹いっぱい。2016/02/04(木) 09:06:11.16
pythonはなくなってもUNIXは困らない。
0442名無しさん@お腹いっぱい。2016/02/05(金) 01:28:36.41
>>441
vimの拡張にpythonが採用されてることを知らないのか…
0443名無しさん@お腹いっぱい。2016/02/05(金) 02:35:34.81
POSIXにvimもpythonも入って無いしな
0444名無しさん@お腹いっぱい。2016/02/05(金) 02:49:11.38
UNIX開発にふつーにVIM使われてるぞ
0445名無しさん@お腹いっぱい。2016/02/05(金) 04:13:16.68
特定のアプリケーションが使っているから、OSに必要という理屈が分からない。
0446名無しさん@お腹いっぱい。2016/02/06(土) 04:39:26.36
>>438
方言覚えるのとPython覚えるの、労力そんなに違うか?
0447名無しさん@お腹いっぱい。2016/02/06(土) 06:08:30.34
シェルスクリプトはOSの一部だからな。

pythonとは格が違う。
0448名無しさん@お腹いっぱい。2016/02/06(土) 09:18:43.54
#!/usr/bin/shと書いてもbashが走るこんな世の中じゃ
0449名無しさん@お腹いっぱい。2016/02/06(土) 17:24:54.45
#!/usr/bin/shと書いてシェルスクリプトを名乗るのか。
0450名無しさん@お腹いっぱい。2016/02/06(土) 18:52:59.16
>>448
bashがbshのマネをする変なスクリプトたがら推奨しない。
0451名無しさん@お腹いっぱい。2016/02/06(土) 18:54:27.39
>>449
スクリプトの種類を名乗る
0452名無しさん@お腹いっぱい。2016/02/06(土) 19:55:26.03
本物と同じ名前の機能の違うコマンドを検索で優先されるディレクトリに置いちゃってドヤ顔する
バッドノウハウ使いの老害は早く死んで欲しい
0453名無しさん@お腹いっぱい。2016/02/06(土) 20:35:47.85
大丈夫、そんな人はいない
0454名無しさん@お腹いっぱい。2016/02/06(土) 21:23:44.47
/bin じゃなくて /usr/bin なのか?という話だろ
0455名無しさん@お腹いっぱい。2016/02/07(日) 04:25:51.93
>>454
/usr/binと/binは基本的に一緒だが、環境によっては違うんじゃないの?
0456名無しさん@お腹いっぱい。2016/02/07(日) 12:45:47.23
/usrを別パーティションにしてた頃の名残だよね
0457名無しさん@お腹いっぱい。2016/02/07(日) 18:02:30.90
/sbinまでは認めてやっても良い
0458名無しさん@お腹いっぱい。2016/02/07(日) 19:26:38.34
Linuxディストリの一部やSolarisではすべて/usrに移動してる(usr mergeまたはusr moveと呼ぶ)
/binと/sbinはシンボリックリンクで残ってる
0459名無しさん@お腹いっぱい。2016/02/08(月) 08:20:49.74
いっそ、bashをオブジェクト指向に進化させれば、
pythonなぞいらなくなる
0460名無しさん@お腹いっぱい。2016/02/08(月) 10:14:57.97
全角だとバカにしか見えないのは何故だ?
0461名無しさん@お腹いっぱい。2016/02/08(月) 10:31:10.92
>>460
おっさんの可能性もある。
0462名無しさん@お腹いっぱい。2016/02/08(月) 10:49:58.88
新聞社の方でしょう
0463名無しさん@お腹いっぱい。2016/02/08(月) 12:25:26.78
綺麗な見た目に気を遣って作られたプロポーショナルフォントだと全く気にならない
幅が広けりゃいいんでしょ的なやっつけフォントや固定幅フォントを使って表示してると
バランスが悪いのでそうなる
0464名無しさん@お腹いっぱい。2016/02/08(月) 12:34:34.64
>>460
裸の王様だからかな
0465名無しさん@お腹いっぱい。2016/02/08(月) 13:02:09.16
shebang 行は、種類を名乗るといえば名乗っているけれど、
実際には、実行するコマンドラインを指定するもの


以下、補足
例えばこのスクリプトで試すと
$ cat ~/src/test/script
#!../bin/echo "hoge"
'fuga'

$ pwd
/usr

$ ~/src/test/script 'arg 1' "arg 2"
"hoge" /home/anonymous/src/test/script arg 1 arg 2

上では、結果的に
相対パス/echo "hoge" 引数0 引数1 引数2
が実行された結果が印字されている

普通に #!/bin/sh なスクリプトだと、結果的に実行されるのは次
/bin/sh path/to/スクリプト名 引数1 引数2 ...
0466名無しさん@お腹いっぱい。2016/02/08(月) 13:23:29.92
>>465
shebangが種類を名乗るって何のこと?
そのスクリプトを処理するインタプリタを(引数込みで)指定する
以外の説明みたことないけど
0467名無しさん@お腹いっぱい。2016/02/08(月) 15:38:21.12
>>466

>>449 !/usr/bin/shと書いてシェルスクリプトを名乗るのか。
>>451 スクリプトの種類を名乗る
>>465 shebang 行は、種類を名乗るといえば名乗っているけれど、
■ このスレッドは過去ログ倉庫に格納されています