トップページunix
1001コメント285KB

シェルスクリプト総合 その2

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2005/04/17(日) 00:17:17
シェルスクリプトの総合スレです。スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-10くらい)をご覧ください。

□前スレや過去スレ:
シェルスクリプト総合 その1
http://pc8.2ch.net/test/read.cgi/unix/1101820646/
☆シェルスクリプトを勉強するにあたって☆
http://pc5.2ch.net/test/read.cgi/unix/989659936/
便利なシェルスクリプト見せろ
http://pc5.2ch.net/test/read.cgi/unix/996949546/
【貝】第1回シェル講座【殻】
http://fun.kz/test/read.cgi/unix/1016372780/

□関連スレ:
sed
http://pc8.2ch.net/test/read.cgi/unix/1085730992/
おまえら! shell は何を使っているんですか?
http://pc5.2ch.net/test/read.cgi/unix/1012330865/
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
http://pc8.2ch.net/test/read.cgi/unix/1102921590/

□他板の関連スレ:
Macでシェルスクリプト総合 Part 1
http://pc7.2ch.net/test/read.cgi/mac/1105074933/
【Shell】どのシェル使ってる?【Script】
http://pc8.2ch.net/test/read.cgi/linux/1067330754/
0792名無しさん@お腹いっぱい。2005/07/31(日) 21:22:19
DOSプロンプトだったら、rename * *.jpg
0793名無しさん@お腹いっぱい。2005/07/31(日) 21:37:19
Linuxだとrenameというコマンドがディス鳥標準で付いていて、一応使える。
ただし一般的ではない。
>>789
はダブルクォート付けていないから、減点だな。
0794名無しさん@お腹いっぱい。2005/07/31(日) 21:45:25
そもそも >>788 は「多数のファイル名を」って言ってるんだから、
* はまずいだろ
0795名無しさん@お腹いっぱい。2005/07/31(日) 22:00:17
>>788 が言う「多数」は4つくらいのようだ。
0796名無しさん@お腹いっぱい。2005/08/01(月) 08:28:05
zsh 使ってるなら zmv も便利
0797名無しさん@お腹いっぱい。2005/08/02(火) 12:42:06
tailの逆、つまり先頭から(ファイル最終のn行前)まで表示するにはどうすれば
いいでしょう?
0798名無しさん@お腹いっぱい。2005/08/02(火) 12:42:33
head
0799名無しさん@お腹いっぱい。2005/08/02(火) 13:38:30
>>797
tail -r
0800名無しさん@お腹いっぱい。2005/08/02(火) 23:45:18
>>799
ひねくれ者め(笑)
0801名無しさん@お腹いっぱい。2005/08/03(水) 00:25:16
liat
0802名無しさん@お腹いっぱい。2005/08/03(水) 00:56:37
ファイル最終の n 行前までって言ってるんだから、
実際のところ head で実現するのは苦しい気がする。
(head で指定できる行数は限りがあったと思うので。)

てことで
 tail -<n> <file_name> > <tmp_file>
 comm -23 <file_name> <tmp_file>
 rm -f <tmp_file>
かな。
0803名無しさん@お腹いっぱい。2005/08/03(水) 02:44:09
ファイル途中にtmp_fileと同一行が出たらおかしくならないか?
0804名無しさん@お腹いっぱい。2005/08/03(水) 03:14:44
comm はソートされたファイルじゃないと使えない
0805名無しさん@お腹いっぱい。2005/08/03(水) 03:32:44
んな、ファイル丸ごと何度も読み書きするくらいだったら、たとえば
last=100
rows=`wc -l file | cut -d ' ' -f 1`
head -n `expr $rows - $last` file
とか。
0806名無しさん@お腹いっぱい。2005/08/03(水) 03:37:55
wc -l file | cut -d ' ' -f 1

wc -l < file
でいいだろ
0807名無しさん@お腹いっぱい。2005/08/03(水) 07:23:57
>>806
??
0808名無しさん@お腹いっぱい。2005/08/03(水) 10:14:37
tail -r | tail +n | tail -r

GNU tail では -r はないようなのでかわりに tac を。
0809名無しさん@お腹いっぱい。2005/08/03(水) 12:55:11
tail -rだと全文をバッファに抱えるプロセスを二つ重ねないといけないので、
あんまり嬉しくないんですよね。

というわけで、こうかなあと。(n=4の場合)
ruby -ne '(q||=[])<<$_;q.size<=4||print(q.shift)' file
0810名無しさん@お腹いっぱい。2005/08/03(水) 13:07:44
echo '1,$-Np' | ed file
0811名無しさん@お腹いっぱい。2005/08/03(水) 17:21:46
質問させてください。
スクリプトを実行したら
login:
名前を打ち込んで
password:
パスを打ち込む(非表示)
パスはファイルにリダイレクト
っていうのを作りたいんですが。バッシュで。
途中で文字列を入力させるやり方が分かりません。
教えてください。おねがいします。
0812名無しさん@お腹いっぱい。2005/08/03(水) 17:37:23
read -p 'login: ' NAME
read -s -p 'password: ' PASS
echo $PASS > file
0813名無しさん@お腹いっぱい。2005/08/03(水) 20:14:02
そんでそんで? 誰のパス盗もうとしてんの?(σ ̄ー ̄)σ>>811
0814名無しさん@お腹いっぱい。2005/08/04(木) 02:44:04
シェルスクリプトで perl -pe chomp と同じことをしたいのですが、
どのようにやればよいでしょうか?
0815名無しさん@お腹いっぱい。2005/08/04(木) 08:57:48
#!/bin/sh
exec perl -pe chomp
0816名無しさん@お腹いっぱい。2005/08/04(木) 13:31:14
readで出来たのか
知らなかった
0817名無しさん@お腹いっぱい。2005/08/04(木) 13:39:59
 cmd1 | cmd2
上記のようなパイプで繋いだコマンドで、cmd1の終了ステータスを拾いたいのですが、
どうしたらよいのでしょうか?
0818名無しさん@お腹いっぱい。2005/08/04(木) 14:25:13
csh -c 'cmd1 | cmd2'
0819名無しさん@お腹いっぱい。2005/08/04(木) 14:45:12
出来ました、ありがとうございます。
0820名無しさん@お腹いっぱい。2005/08/04(木) 14:55:23
(((cmd1; (echo $? >&3)) | cmd2 >&4) 3>&1 | (read x; exit $x)) 4>&1
echo $?

うーん、美しくない。
0821名無しさん@お腹いっぱい。2005/08/04(木) 22:10:15
一瞬lispに見えたw
0822名無しさん@お腹いっぱい。2005/08/04(木) 23:58:53
>>814
tr -d '\n'
0823名無しさん@お腹いっぱい。2005/08/05(金) 00:59:04
>>817
bash の(たぶん)3.0じゃないと使えないと思うけど、
$ echo $PIPESTATUS[0]
とか、出来る。
ちなみに配列だから、
$ echo ${PIPESTATUS[*]}
で、全部見れる。

あと、ちょっと違うけど、
$ set -o pipefail
とかもある。

08248232005/08/05(金) 01:01:30
PIPESTATUS、bash-2.05bにもあったよ。
pipefailが、3.0からだった。
0825名無しさん@お腹いっぱい。2005/08/05(金) 02:17:49
今/home/.emacsがあるとして、ユーザディレクトリにそれぞれコピーするには
どう書けばいいですか?所有者ももそれぞれのユーザに設定できますか?
0826名無しさん@お腹いっぱい。2005/08/05(金) 02:32:28
>>825
/etc/skel に置いとけ
0827名無しさん@お腹いっぱい。2005/08/05(金) 02:35:58
シェルスクリプトのスレよりもくだ質が似合いの質問者だな。
0828名無しさん@お腹いっぱい。2005/08/05(金) 02:54:40
>>826 >>827
そんなぁ・・・
そこをなんとか・・・
0829名無しさん@お腹いっぱい。2005/08/05(金) 03:15:53
くだ質いけって言われたのになんでここで粘るんだ?
だだこねる相手はママだけにしとけよ。

次の方、どうぞ↓

0830名無しさん@お腹いっぱい。2005/08/05(金) 07:43:52
なんで怒ってるの?
0831名無しさん@お腹いっぱい。2005/08/05(金) 07:47:09
$HOMEに押し着せの.emacsを強制コピーしてくる
シス管が居て、迷惑してるのですが、
これを拒否するにはどうしたらいいでしょうか?

ちなみに、root権限で上書きコピーしてくるため、
一般ユーザーのパーミッション設定では防げません。
あと、.emacsだけじゃなく、$HOME/.profile
$HOME/.xinitrcとかもコピーで潰されるので大迷惑です。
0832名無しさん@お腹いっぱい。2005/08/05(金) 08:17:23
.emacs というディレクトリ作っといたら?
0833名無しさん@お腹いっぱい。2005/08/05(金) 08:34:38
>>831
#!/bin/sh
cat <<EOF | mail root
From: $USER

あなたのホスト管理はクソです。
いますぐ.emacsをroot権限で上書きするというアホな行為をやめてください。
EOF
0834名無しさん@お腹いっぱい。2005/08/05(金) 08:53:27
>>831
自分の.emacs を、.my-emacs とかにかえて、
シェルのalias を使って、
alias emacs="emacs -q -l .my-emacs"
とかしとく。

.profile の方も、同じような考え方で、
bash --norc --noprofile の後、自分のprofileを読み込むようなscriptを書いといて、
毎回、loginし直す。(面倒だけど)

zsh 、ksh、tcsh等、対話的に使うshellを他のにするとかでもいいんじゃん?

.xinitrcは、
export XINITRC=$HOME/.my-xinitrc
を設定しといて、startx。
で、どうよ。

>>833 みたく、管理者に一言いうのが早いかもしんないけど。
0835名無しさん@お腹いっぱい。2005/08/05(金) 11:18:52
ln -s /etc/passwd ~/.emacs
0836名無しさん@お腹いっぱい。2005/08/05(金) 11:36:49
どういうタイミングでどういう手段で何が上書きされるのか。
ログインシェルは何か。自分の権限でcronやchshは使えるか。
などによっていろいろと対抗手段は考えられるけど、情報不足。
0837名無しさん@お腹いっぱい。2005/08/05(金) 11:41:59
>>825 に対する皮肉として書いた釣りなのに、
こんなに釣りにつき合ってくれてありがとう。
0838名無しさん@お腹いっぱい。2005/08/05(金) 11:48:34
釣られすぎだな。
0839名無しさん@お腹いっぱい。2005/08/05(金) 13:03:52
      ∧_∧ハゥッ
   ∧_(Д`; )
  ( ・∀・)玉  つ
  (っ  ≡つて ヽ チーン!
  して_)_ノw (_)
玉を砕くと書いて「玉砕」と言う。
0840名無しさん@お腹いっぱい。2005/08/05(金) 13:12:34
835に1票
0841名無しさん@お腹いっぱい。2005/08/05(金) 13:32:33
>>835 も面白いけど、
ふつー、rm -f してから cpするだろうから効果なし。
0842名無しさん@お腹いっぱい。2005/08/05(金) 16:40:35
そのふつーが期待できる管理者ならユーザの.emacsを上書きしたりなぞしない。
0843名無しさん@お腹いっぱい。2005/08/05(金) 17:32:09
http://makimo.to/2ch/pc5_unix/996/996949546.html
の3の書き込みなんですが、意味は分かるんですが
なぜ {, という書き方なんでしょうか。
そのままぐぐってみてもヒットしないので
展開の書式を解説しているサイトを教えてください。
0844名無しさん@お腹いっぱい。2005/08/05(金) 17:35:55
(zsh)Brace Expansion
13.6 Brace Expansion
====================

A string of the form `FOO{XX,YY,ZZ}BAR' is expanded to the individual
words `FOOXXBAR', `FOOYYBAR' and `FOOZZBAR'. Left-to-right order is
preserved. This construct may be nested. Commas may be quoted in
order to include them literally in a word.
0845名無しさん@お腹いっぱい。2005/08/05(金) 17:42:34
>>844 は答えになっていない英語スパムだな。
>>843 は、空文字列のカンマに付いての質問と思われ。
ブレース展開自体の質問じゃないよ。
0846名無しさん@お腹いっぱい。2005/08/05(金) 17:42:54
>>845
(゚Д゚)ハァ?
0847名無しさん@お腹いっぱい。2005/08/05(金) 17:43:46
>>845
自分の理解力不足を棚にあげて、人を批判とはおめでたい人ですね. :-)
0848名無しさん@お腹いっぱい。2005/08/05(金) 17:44:25
>>845
> ブレース展開自体の質問じゃないよ。
>>843
> 展開の書式を解説しているサイトを教えてください。
0849名無しさん@お腹いっぱい。2005/08/05(金) 17:44:57
>>845
英語が読めないなら、エキサイト翻訳使えよ。
0850名無しさん@お腹いっぱい。2005/08/05(金) 17:52:13
>>844 が言っているのは、展開時に左から右へという順序と、
ネスティング可能なことと、
カンマ自体を普通の文字として使うならクォートしろということだけ。
元質問のコマンドラインでは左から右への順序は関係ないし、
空文字列のカンマも許されることは >>844 には書かれていない。
なので、 >>844 は早とちりの外し回答だと思う。
0851名無しさん@お腹いっぱい。2005/08/05(金) 18:09:45
この、クソチョッパリが!!!!!!!!!!!!!!!!!!!!!!!
百年謝罪しろ!!!!!!!!!!!!!!!!!!!!!!!!!!
0852名無しさん@お腹いっぱい。2005/08/05(金) 20:29:30
>>850
> 空文字列のカンマも許されることは >>844 には書かれていない。
禁止されていないということは許されているということだろ。
0853名無しさん@お腹いっぱい。2005/08/05(金) 20:38:18
>>852
元質問は「 {, とは何か?」と聞いているのだから、
「それはブレース展開の最初の文字列が空文字列になっているものだ」
と答えるのが的確。

>>850 はマトはずれ。
08548532005/08/05(金) 20:43:42
スマソ。レス番間違えた。>>850 は正解。

>>844 はマト外れ。

0855名無しさん@お腹いっぱい。2005/08/05(金) 21:11:43
別スレで怒られたので、こちらでに移動します。
今/home/.vimrcがあるとして、ユーザディレクトリにそれぞれコピーするには
どう書けばいいですか?所有者ももそれぞれのユーザに設定できますか?
0856名無しさん@お腹いっぱい。2005/08/05(金) 21:12:30
誤爆すみません。逝ってきます。
0857名無しさん@お腹いっぱい。2005/08/05(金) 21:19:51
$HOMEに押し着せの.vimrcを強制コピーしてくる
シス管が居て、迷惑してるのですが、
これを拒否するにはどうしたらいいでしょうか?

ちなみに、root権限で上書きコピーしてくるため、
一般ユーザーのパーミッション設定では防げません。
あと、.vimrcだけじゃなく、$HOME/.xsessionや
$HOME/.cannaとかもコピーで潰されるので大迷惑です。
0858名無しさん@お腹いっぱい。2005/08/05(金) 21:24:00
もういいから。
0859名無しさん@お腹いっぱい。2005/08/05(金) 21:26:37
>>857
コミュニケーション能力を磨くといいよ。
0860名無しさん@お腹いっぱい。2005/08/05(金) 21:34:21
>>859
コミュニケーション能力じゃなくて、
技術的に回避する方法はありませんか?
上司に言っても、
「シス管は彼に任せているから、彼の方針に従ってくれ」
の一点張りで話が進みません。
0861名無しさん@お腹いっぱい。2005/08/05(金) 21:39:23
>>860
> >>859
> 技術的に回避する方法はありませんか?
あるけど、
> 「シス管は彼に任せているから、彼の方針に従ってくれ」
その彼とコミニュケーションはとったの?
0862名無しさん@お腹いっぱい。2005/08/05(金) 21:45:48
もういいから。
0863名無しさん@お腹いっぱい。2005/08/05(金) 21:46:34
>>862
だれも君がどう感じたかなんて聞いていないよ。
0864名無しさん@お腹いっぱい。2005/08/05(金) 21:52:54
>>861
もちろん、とったよ。
「これはシステム管理上必要なことだから」
で話は進まず。
0865名無しさん@お腹いっぱい。2005/08/05(金) 21:56:36
横レスすまそ。
>>861
$HOME/.xsession の場合は回避するの難しくないか?
0866名無しさん@お腹いっぱい。2005/08/05(金) 22:04:22
        _,. -−─−-- 、_
     ,. '´  _ -−ニ二二`ヽ、
    /   /  _,.−'⌒ヽ,ノ``'ミ,、
  ,.'   /  /  ,,イ゙\ /入、ヾ,
. /  / // -‐''"_ ヽ l l′/`_''l}
 '  / ,.イii/ /∠´ `ヾ' l lレ''´ ヾ
   / ,.' ii/u i{,_,,  ゚ }! l li{,_,. ゚ }
.  / /ii i/u uヾく,_,ノ′ l lゞi-rイ
 ,' /-、 i| u    ' ' ` ,__〉〉  |
.  /l 「ヾ'i|   ,.r‐     `'U'U_,ィ}|
 / | ー}.l| /,r 'T"丁 ̄| ̄ | l|'|
 }i iト、}( l! ,イ  |__, ⊥ _|__,l|.ト、
 `i iiiハ `| i l_/       _,ノノ|| \
.  }iij. |. l |Y/      ‐┴''" ||\ \
  ゙l!  | l|. 仁   _,__      ||  \ \
  /   | |l lニレ'´     `ヾ'、  ||   \ \
  /   |. |ヽ 「]、       ヾ>、||     \
/   .|  |. ヽ`「ヽ        }H|\
      |  |  ヽ`「ヽ、、,__,,ノj‐||  ` ー─
   u  |   |  \`'〔`'T''''''T´ ,ノ|
      |   |    \ ` ̄ ̄ ̄ /
       |    |    `−──‐′
0867名無しさん@お腹いっぱい。2005/08/05(金) 22:05:00
>>865
.xsession って #! みてくれたっけ?
0868名無しさん@お腹いっぱい。2005/08/05(金) 22:35:33
>>867
見るかどうかは、/usr/X11R6/lib/X11/xdm/Xsession に
どう書いてあるかによって変わる。デフォルト状態の
Xsessionでも、Xのバージョンによって違ったと思う。

というか、root管理者が /usr/X11R6/lib/X11/xdm/Xsession
を編集して、そもそも$HOME/.xsessionを参照しないようにされてしまうと
一巻の終り。それに気づかない程度のアホ管理者と想像するが・・
08698432005/08/06(土) 00:40:56
すいません、なんかお礼を書くタイミングを逸してしまって
空文字列という意味なんですね
ありがとうございました
0870名無しさん@お腹いっぱい。2005/08/06(土) 13:29:38
diff -u /etc/hosts{.20050801,}とかよく使いますよ。
0871  2005/08/07(日) 12:53:34
>>857
そのホストとは別に、LinuxなりBSDなりマシン立ち上げて、
そっちの環境で作業すれば〜
0872名無しさん@お腹いっぱい。2005/08/07(日) 13:12:15
(SUM=0;find /lib -maxdepth 1 -type f |xargs ls -lt|grep 'Aug 5'|awk '{print $5}'|while read SIZE;do SUM=`expr $SUM + $SIZE`;echo "$SIZE $SUM";done;echo "SUM=$SUM")

これでなんで最後のSUMがゼロになってしまうんでしょうか?
0873名無しさん@お腹いっぱい。2005/08/07(日) 13:17:40
$find /lib/ -maxdepth 1 -type f -mtime -3|xargs wc -c
やりたいこと自体はこれでOKでした。
0874名無しさん@お腹いっぱい。2005/08/07(日) 13:18:26
>>872
パイプでwhileにつないだ場合、
この部分はさらに別シェルで実行されるから
その次のセミコロン以降の変数には反映されない。
0875名無しさん@お腹いっぱい。2005/08/07(日) 13:22:17
>>872
>>454
0876名無しさん@お腹いっぱい。2005/08/07(日) 13:39:50
ある数値をパイプで受け取ったとして、それの合計値を出したいときには
どうするのがいいんでしょうか??
0877名無しさん@お腹いっぱい。2005/08/07(日) 13:48:27
>>876
>>455
0878名無しさん@お腹いっぱい。2005/08/07(日) 13:53:01
>>877
ありがとうございます。これでなんで上手くいくのか分りませんがとにかくそういうもんだと思っておきます。
0879名無しさん@お腹いっぱい。2005/08/07(日) 16:11:32
>>872
シェルによって違う。
bourneとbashはパイプからだとサブシェルになる。
kornとzshはパイプからでもサブシェルにならない。
0880名無しさん@お腹いっぱい。2005/08/08(月) 23:29:21
当方kshを利用しているのですが、whileループを使用して2ファイルを
読み込む処理がうまく行きません。
外側のループが処理されずに抜けてしまいます。
(個人的な推測では内側のループで外側のカーソルも移動している気がします)
どなたか、対処の方法を教えてくだされ。

ソースはこんな感じです。
function funcA
{
while read LINEB
do
処理あれこれ
done <$LINEB
}

while read LINE
do
 funcA
done <$FILEA

0881名無しさん@お腹いっぱい。2005/08/08(月) 23:35:21
>>880
ヒント:リダイレクト、ファイル記述子
0882名無しさん@お腹いっぱい。2005/08/08(月) 23:38:46
$LINEBじは$FILEBの間違いって落ちじゃないよな。
08838802005/08/08(月) 23:42:58
>>881さん
もうちょっと、ヒントをください。

>>882さん
先ほどのソースは間違ってますが、現実は「FILEB」です。
ご指摘ありがとうございます。
0884名無しさん@お腹いっぱい。2005/08/09(火) 00:04:59
1 #!/bin/ksh
2 FILEB=$0
3 CNT=0
4 function funcA
5 {
6 while read LINEB
7 do
8 echo $LINEB
9 done <$1
10 }

11 while read LINE
12 do
13 echo ------$CNT------
14 funcA $FILEB
15 CNT=`expr $CNT + 1`
16 done <$0

この例だと、同じファイルを読み込んでるけど、ちゃんと動くがなぁ。
08858802005/08/09(火) 00:34:04
>>884さん
ほ、本当ですか?
自宅にはUNIX環境がないため、確かめることはできないのですが…
なんでだろうか。。
0886名無しさん@お腹いっぱい。2005/08/09(火) 06:20:17
起動したプロセスのプロセスIDをpidファイルに書き込みたいんですが、
どうすればいいでしょうか?
0887名無しさん@お腹いっぱい。2005/08/09(火) 06:35:34
>>886
echo $$ > pid

念のため言っておくけど、複数個起動すれば当然"pid"というファイルの
内容は書き直されちゃうからね。
0888名無しさん@お腹いっぱい。2005/08/09(火) 07:14:42
>>887
あざーっす!
参考になります。
ところで、やはりスクリプト内で別のスクリプトを読んでいる場合は
実プロセスIDではなくてスクリプトを実行しているプロセスのIDになってしまいますよね・・
0889名無しさん@お腹いっぱい。2005/08/09(火) 07:19:22
>>888
スクリプトを実行してるプロセスのIDになりました。
apacheとかはどうやって取得しているんでしょうか・・・
0890名無しさん@お腹いっぱい。2005/08/09(火) 07:23:10
バックグラウンドで起動した子プロセスのPIDなら「$!」
0891名無しさん@お腹いっぱい。2005/08/09(火) 07:55:48
>>890
あざーーっす!!!!
取れました!
1 #!/bin/sh
2
3 echo $$
4 ./test.sh &
5 echo $!

という超簡単なものなら行けたんですが・・・・・
実はtomcatの自動起動スクリプトを書いているんですが、
ソース晒して見てもらってもいいでしょうか?
0892名無しさん@お腹いっぱい。2005/08/09(火) 16:03:39
> あざーーっす!!!!
ってなんだよ?
■ このスレッドは過去ログ倉庫に格納されています