シェルスクリプト総合 その15 at UNIX
[2ch|▼Menu]
1:名無しさん@お腹いっぱい。
09/07/01 09:42:48
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。

□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
  URLリンク(src.opensolaris.org)
  URLリンク(heirloom.sourceforge.net)
・csh/tcshのシェルスクリプトは推奨されません。
 (理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その14
スレリンク(unix板)

2:名無しさん@お腹いっぱい。
09/07/01 09:45:39
□関連スレ:
sed
スレリンク(unix板)
正規表現
スレリンク(unix板)
おまえら! shell は何を使っているんですか?
スレリンク(unix板)
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
スレリンク(unix板)

□初心者向けリンク
「誰にでも」シリーズ
URLリンク(kanji.zinbun.kyoto-u.ac.jp)
/bin/shプログラミング入門
URLリンク(freebooks.info.nara-k.ac.jp)
シェルを使おう - 導入からプログラミングまで -
URLリンク(www.netfort.gr.jp)

□入門者向け書籍:
プロフェショナルシェルプログラミング
URLリンク(www.amazon.co.jp)
入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
URLリンク(www.amazon.co.jp)
UNIXシェルプログラミング徹底解説
URLリンク(www.amazon.co.jp)
入門Kornシェル
URLリンク(www.amazon.co.jp)
入門bash
URLリンク(www.amazon.co.jp)


3:名無しさん@お腹いっぱい。
09/07/01 09:46:30
□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
URLリンク(x68000.q-e-d.net)
POSIX: Shell & Utilities (標準規格)
URLリンク(www.opengroup.org)

□最近のシェルスクリプト本(1)

(2004/03) UNIXシェルスクリプトハンドブック 関根 達夫 (著)
URLリンク(amazon.co.jp)
(2004/10) UNIXシェルスクリプト逆引き大全333の極意 中橋 一朗 (著)
URLリンク(amazon.co.jp)
(2004/11) 仕事に使えるLinuxシェルスクリプト 千葉 真人 (著)
URLリンク(amazon.co.jp)
(2004/12) UNIXシェルスクリプトサンプルブック デイブ・テイラー (著)
URLリンク(amazon.co.jp)
(2005/02) シェルスクリプト基本リファレンス 山森 丈範 (著)
URLリンク(amazon.co.jp)
(2005/04) LinuxWorldスクリプト 月刊リナックス・ワールド総集編 月刊LinuxWorld特別 (著)
URLリンク(amazon.co.jp)
(2005/05) UNIXシェルスクリプトコマンドブック 山下 哲典 (著)
URLリンク(amazon.co.jp)
(2005/05) わかる&使える UNIX基礎講座 シェルスクリプト編 中井 獏 (著)
URLリンク(amazon.co.jp)


4:名無しさん@お腹いっぱい。
09/07/01 09:48:31
□最近のシェルスクリプト本(2)
(2005/07) UNIX シェルスクリプト辞典 川井 義治 (著)
URLリンク(amazon.co.jp)
(2005/08) シェルスクリプト ポケットリファレンス bash編 宮原 徹 (著), 川原 龍人 (著)
URLリンク(www.amazon.co.jp)
(2005/12) 図解でわかるLinuxシェルスクリプト・正規表現 小泉 修 (著)
URLリンク(www.amazon.co.jp)
(2006/01)詳解 シェルスクリプト アーノルド ロビンス (著), ネルソン・H.F. ベーブ(著), Arnold Robbins (原著), Nelson H.F. Beebe (原著), 日向 あおい (翻訳)
URLリンク(www.amazon.co.jp)
(2007/3) Linuxシェルスクリプトユーザー便利帳―bash2/bash3対応 伊藤 幸夫 (著), 寒川 陽美(著)
URLリンク(www.amazon.co.jp)
(2007/9) ゲームで極める シェルスクリプトスーパーテクニック 山森 丈範
URLリンク(www.amazon.co.jp)
(2007/10) UNIX/Linuxシェルスクリプトマスタリングハンドブック 野川 准子
URLリンク(www.amazon.co.jp)


5:名無しさん@お腹いっぱい。
09/07/01 09:49:46
□関連書籍と関連リンク:
FreeBSD Hypertext Man Pages
URLリンク(www.freebsd.org)
Linux JF (Japanese FAQ) Project.
URLリンク(www.linux.or.jp)
Unix Programming Frequently Asked Questions 日本語訳
URLリンク(www.adl.nii.ac.jp)
UNIXプログラミング環境
URLリンク(www.amazon.co.jp)

□人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
 シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
 使い方の質問などはスレ違いなので無用に願います。

□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts
テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル検索系: find
(スペースなどを含むファイル名を正しく処理するため、
findは -exec command {} + を推奨。
他に -print0、xargsは -0オプションという方法もあるがSolaris非対応)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl


6:名無しさん@お腹いっぱい。
09/07/01 10:57:14
回答者側の心得:
エスパー以外回答禁止
わからないなら無理に回答せず、黙っていましょう
あなたが回答しなくても、もっと詳しい回答者がより的確に回答してくれます
無理に中途半端な回答をすると、回答者同士で叩き合いが始まり、スレのS/N比が悪化します

7:名無しさん@お腹いっぱい。
09/07/02 00:49:01
2005年は、最近ですか?

8:名無しさん@お腹いっぱい。
09/07/02 09:10:15
地球の歴史からすれば一瞬

9:名無しさん@お腹いっぱい。
09/07/02 11:05:46
中国の歴史からしても1‰

10:名無しさん@お腹いっぱい。
09/07/02 11:13:19
中国400年の歴史?

11:名無しさん@お腹いっぱい。
09/07/02 11:58:24
‰を知らないゆとり乙

12:名無しさん@お腹いっぱい。
09/07/02 12:08:38
中国は建国60年

つまり
>中国の歴史からしても1‰
は0.6年、61日

13:名無しさん@お腹いっぱい。
09/07/02 12:09:35
219日だw

14:名無しさん@お腹いっぱい。
09/07/02 13:14:42
句点の。に見えたわorz

15:名無しさん@お腹いっぱい。
09/07/05 03:20:29
ftpであるディレクトリ配下をまるまるダウンロードするために、
ローカルに同じディレクトリ構造を作りながらファイルを1個づつダウンロードしていくシェルをつくりたいんですが
ftpでのdir結果をファイルに落としてそれを読んでって感じになりますかね?
簡単そうな方法があるとうれしいんですが?


16:名無しさん@お腹いっぱい。
09/07/05 03:32:17
簡単な方法なら wget -r だが

17:名無しさん@お腹いっぱい。
09/07/05 16:48:05
>>12
最近はパーミル習わないのか

18:名無しさん@お腹いっぱい。
09/07/05 18:56:12
>>17
円周率を3と習う世代に無理を言っちゃいかん。

19:名無しさん@お腹いっぱい。
09/07/08 12:49:23
シェルの本で定番は何ですか?

20:名無しさん@お腹いっぱい。
09/07/08 12:59:59
「たった3日でシェルが書ける、シェル自作入門」
〜 シェルで始める Hello World 〜

とか?

21:名無しさん@お腹いっぱい。
09/07/08 13:05:47
「ゲームで極める シェルスクリプトスーパーテクニック 」
シェルスクリプトでここまでできる。ゲームを作ってシェルスクリプトの超技を学べ。

22:名無しさん@お腹いっぱい。
09/07/08 13:08:42
おもわずググっちまったorz

23:名無しさん@お腹いっぱい。
09/07/08 13:17:05
>>22
see >>4


24:名無しさん@お腹いっぱい。
09/07/08 13:18:29
いや、自作の方な

25:名無しさん@お腹いっぱい。
09/07/10 00:53:20
質問です。

たとえば、以下のような仮のhogeコマンドを実行すると、
$ hoge -12 hoge.dat foo.dat bar.dat
パラメタで指定したファイル(hoge.dat、foo.dat、bar.dat)の12行目だけをリストするようなコマンドはないでしょうか?

よろしくお願いします。


26:名無しさん@お腹いっぱい。
09/07/10 01:14:30
シェルスクリプトスレなのに、単一のコマンドでないといかんのか?

でないなら
for i in hoge.dat foo.dat bar.dat; do sed -n 12p "$i"; done
とか、
cat -n hoge.dat foo.dat bar.dat | egrep '^ *12^I'
とか。

「コマンド」風にしたいなら、関数にするなり、別のスクリプトにするなり。

27:名無しさん@お腹いっぱい。
09/07/10 06:43:11
>>26
シェルスクリプトスレで質問してるんだから、

$ hoge -行番号 ファイル...

という形式の引数を渡せるようなシェルを書いて回答してやれよ。

例えば、-12 で渡された引数を、sedの中に 12p の形に渡すためには
文字列の変換処理とかがちょっと必要になるだろ。
そのあたりも含めての質問だと思うが。

28:名無しさん@お腹いっぱい。
09/07/10 09:16:55
シェルを書いて回答してやれよ(笑)

29:名無しさん@お腹いっぱい。
09/07/10 09:47:48
>>26
2つ目の、cat -n の例、それじゃ駄目だろ。
全部のファイルに通し番号で番号が付いちゃうから。

30:名無しさん@お腹いっぱい。
09/07/10 10:04:15
俺のcatはファイルごとに1から始まるぞ

31:名無しさん@お腹いっぱい。
09/07/10 10:06:41
どこの方言OSのcatですか?

32:名無しさん@お腹いっぱい。
09/07/10 10:30:33
OpenSolarisとFreeBSDとNetBSDです。おたくはどちらのご出身で?

33:名無しさん@お腹いっぱい。
09/07/10 10:51:08
>>25
awk 'FNR==12{print}'

が単純でエレガントでは。パイプやループが要らないし。

34:名無しさん@お腹いっぱい。
09/07/10 11:02:28
あ、シェルにするには、

#!/bin/sh

n=$1
shift
awk "FNR==-($n){print}" "$@"


ね。-12とかの引数をマイナスの数とみなして、awkの中で符合反転してる。

35:名無しさん@お腹いっぱい。
09/07/10 13:05:32
シェルにする、とな!

36:名無しさん@お腹いっぱい。
09/07/10 15:19:28
>>32
みえすいた嘘付くな。

$ uname -a
SunOS opensolaris 5.11 snv_111b i86pc i386 i86pc Solaris
$ cat hoge
boke
kasu
$ cat -n hoge hoge
1 boke
2 kasu
3 boke
4 kasu


37:名無しさん@お腹いっぱい。
09/07/10 21:10:31
>>36

$ uname -a
FreeBSD freebsd.example.com 7.2-RELEASE FreeBSD 7.2-RELEASE #2: Fri May 22 10:29:03 JST 2009 root@freebsd.example.com:/usr/obj/usr/src/sys/GENERIC i386

$ cat -n /etc/ntp.conf /etc/ntp.conf
1 server ntp1.jst.mfeed.ad.jp
2 server ntp2.jst.mfeed.ad.jp
3 server ntp3.jst.mfeed.ad.jp
1 server ntp1.jst.mfeed.ad.jp
2 server ntp2.jst.mfeed.ad.jp
3 server ntp3.jst.mfeed.ad.jp


38:名無しさん@お腹いっぱい。
09/07/10 21:11:39
ちなみに GNU の cat だと連続する。

$ gcat -n /etc/ntp.conf /etc/ntp.conf
1 server ntp1.jst.mfeed.ad.jp
2 server ntp2.jst.mfeed.ad.jp
3 server ntp3.jst.mfeed.ad.jp
4 server ntp1.jst.mfeed.ad.jp
5 server ntp2.jst.mfeed.ad.jp
6 server ntp3.jst.mfeed.ad.jp

39:名無しさん@お腹いっぱい。
09/07/10 21:19:02
ntp.nict.jp 使ってやれよ!

40:名無しさん@お腹いっぱい。
09/07/10 21:51:19
>>39
Stratum 2 で充分だよ。

41:名無しさん@お腹いっぱい。
09/07/11 14:58:42
>>36
> みえすいた嘘付くな。
デフォルトだと/usr/gnu/binにあるcatが動くのも知らんのか。
わざわざインストールしてみたりしたんだろうか。

GNU以外でcat -nの番号が連続する実装ってある?

42:名無しさん@お腹いっぱい。
09/07/11 17:42:32
>>33 >>34 のエレガントな解が出た今となっては、
cat -n(笑)を使うようなかっこ悪い解はどうでもよい。

43:名無しさん@お腹いっぱい。
09/07/11 19:55:16
かっこ悪(笑)

44:名無しさん@お腹いっぱい。
09/07/11 21:51:28
(command)
って
command
ってやるのと何か違います?

45:名無しさん@お腹いっぱい。
09/07/11 22:23:25
デヴャブ

46:名無しさん@お腹いっぱい。
09/07/11 23:47:08
>>39
3msくらい遠い。ジッタは大差ない。

47:名無しさん@お腹いっぱい。
09/07/12 01:38:50
>>44
一例
cd / ; cd /tmp ; pwd
cd / ; ( cd /tmp ) ; pwd

48:名無しさん@お腹いっぱい。
09/07/12 06:48:20
>>47
それは当然知ってる。

コマンド1個だけの場合に、
command と (command) に違いがあるかどうかを聞いてるんだが。

49:名無しさん@お腹いっぱい。
09/07/12 07:00:54
>>44
シェルによっては、シェル自身の最適化で、
( ) を付けていてもサブシェルの必要がない場合はサブシェルにはしないため、
(command) と command に違いはない。

50:名無しさん@お腹いっぱい。
09/07/12 08:32:03
>>48
有る。

51:名無しさん@お腹いっぱい。
09/07/12 08:41:05
ash zsh ksh では (command) と command に違いはないようだ。(トレースして確認)

52:名無しさん@お腹いっぱい。
09/07/12 12:45:20
それらにおいても unset PATH と (unset PATH) は動作が違う気がする


53:名無しさん@お腹いっぱい。
09/07/12 14:01:37
>>52
それはあたりまえ。で、そんなことは聞いてない。

>>49
> 「サブシェルの必要がない場合はサブシェルにはしない」

欲嫁。

54:名無しさん@お腹いっぱい。
09/07/12 14:09:27
>>48
そこまでいくと実装依存的な話になる気がするけど
誰かに " (command) と command に違いは無い " とでも言って欲しいの?

で誰かがそういったところで保証される訳でもなし
" (command) と command " に違いはないから今後は " command "で書こうって話にはならない

逆に " (command) と command " に違いがないから作成中のスクリプトで「今困ってる」っていうなら
そこまで動作を調べられる>>48なら解決方法も分かってるだろ?

バカなの?

55:名無しさん@お腹いっぱい。
09/07/12 14:14:05
バカで〜す

56:名無しさん@お腹いっぱい。
09/07/12 14:48:35
>>54
> 実装依存的な話になる気がするけど

すでに、>>51 が、
> ash zsh ksh では (command) と command に違いはないようだ。

って(実装依存を前提として)答えてるのに、いまさら「気がするけど」って何?

補足したいなら、>>51 が調べた以外のシェルではどうなってるか試して
レポートするべきじゃないの?

57:名無しさん@お腹いっぱい。
09/07/12 17:08:44
        ___ モシャモシャ
        /     \
     /   ⌒  ⌒ \
   /    (●)  (●) \   >56なに言ってんだこいつ
    |   、" ゙)(__人__)" .)|    ___________
   \      。` ⌒゚:j´ ,/ j゙~~| | |             |
__/          \  |__| | |             |
| | /   ,              \n||  | |             |
| | /   /         r.  ( こ) | |             |
| | | ⌒ ーnnn        |\ (⊆ソ .|_|___________|
 ̄ \__、("二) ̄ ̄ ̄ ̄ ̄l二二l二二  _|_|__|_

58:amatsuno ◆Z7H81aEWFM
09/07/13 12:42:35
テストします。
次で質問させて下さい

59:amatsuno ◆y1bfd53lWE
09/07/13 13:02:32
質問させて下さい。

AIX(ksh)で、以下を行おうとしています。
コマンドなどわかりましたら、教えて下さい。
やりたいこと)
csvファイルを読み込んで、データを抜きだす。

csvファイル)
A_table,3,DEF_ind,JKL_ind,TUV_ind,out.txt
のように書かれたリストが複数行有ります。
出力ルール)
csvファイルの第1カラム目に書かれたテーブルを見て、
その中から該当の文字列を呼び出します。
該当の文字列は、
第2カラムで指定された数字分、第3カラム目から先のカラムに書かれたものになります。
(上記の場合、第2カラム目が3なので、第3カラム目から第5カラム目までとなります)
そしてその出力を最終カラムで指定したファイルに出力します。

上記の出力結果は、
DEF_ind
JKL_ind
TUV_ind
をout.txtに出力します。

すいませんが、
わかるかた、宜しくお願いいたします。

60:名無しさん@お腹いっぱい。
09/07/13 13:21:29
>>59
ほれ、

awk -F, '$1=="A_table"{out=$($2+3);for(i=1;i<=$2;i++)print $(i+2)>>out}'

61:amatsuno ◆y1bfd53lWE
09/07/13 13:47:11
>60
ありがとうございます。
ただこれを実行したところ、1箇所だけ問題があるようで、
3カラム目から先が永遠に出力されてしまい、ひたすら空白行が出ます。
第2カラム目で指定しらカラム数で止めるには、
どうすれば良いのでしょうか?
たびたびで申し訳ございませんが、宜しくお願いいたします。

62:amatsuno ◆y1bfd53lWE
09/07/13 13:51:46
>60
もうしわけございません。
61はデータ側の問題でした。
スクリプトは完璧でした。
誠に申し訳ございません。
ありがとうございました。

63:名無しさん@お腹いっぱい。
09/07/13 14:02:13
不正なデータとして、
第2カラムが数値以外だと、ループがおかしくなるな。
そういう場合でも安全なように、

for(i=1;i<=$2;i++)
を、
for(i=1;i<=$2+0;i++)

にしておいた方がいいかも。

64:名無しさん@お腹いっぱい。
09/07/13 14:13:42
>>59 >>60

awkはシェルにあらず。
シェルスレならシェルで解決。


#!/bin/sh

IFS=,
while read line
do
set $line
case $1 in A_table):;;*)continue;;esac
shift
max=$1
shift
eval out=?$$#
i=1
while [ $i -le $max ]; do
echo "$1"
shift
i=`expr $i + 1`
done > "$out"
done

65:名無しさん@お腹いっぱい。
09/07/13 14:19:55
awkも可だよ。

66:amatsuno ◆y1bfd53lWE
09/07/13 14:33:33
>>64

このawkを含んだ処理のkshは、
1.リストからデータの抜き出し
2.抜いたデータのインデックス検索
3.インデックス検索でたデータのバックアップ
4.バックアップデータのソート

になります。
その一部でしたので、
ここで質問させていただきました。

67:名無しさん@お腹いっぱい。
09/07/13 23:23:55
質問させてください。

テキストファイルの最後からN行を削除するにはどうしたらいいでしょうか?
例えばa.txtの最後から2行を削除して保存したいです。よろしくお願いします。

68:名無しさん@お腹いっぱい。
09/07/13 23:36:53
>>67

head -n `expr ?`wc -l < a.txt?` - 2` a.txt

69:名無しさん@お腹いっぱい。
09/07/13 23:39:34
>>68
「保存」してねえぞ

(echo '$-1,$d'; echo wq) | ed -s a.txt

70:名無しさん@お腹いっぱい。
09/07/13 23:41:10
>>68
全角?はなんのおまじない?

71:名無しさん@お腹いっぱい。
09/07/13 23:43:51
>>69
printfコマンドって、使えない環境もあるのかな。
あと「wq」は使えなくて「w」と「q」の2コマンドなら
OKという環境はよくあるね。

72:名無しさん@お腹いっぱい。
09/07/13 23:44:10
>>69
ありがとうございます。
でも結構難しいですね。もうちょっと簡単に短くできませんでしたっけ?

73:名無しさん@お腹いっぱい。
09/07/14 00:47:11
度々すみません。
たしかheadで出来たと思うのですが
a.txtの最後から2行を削除して保存。とか出来ませんでしたっけ?

74:名無しさん@お腹いっぱい。
09/07/14 01:09:23
保存はともかく、
末尾の指定行数をカットできるのはGNUのおせっかいheadくらいじゃないか

75:名無しさん@お腹いっぱい。
09/07/14 07:38:51
>>70
半角バックスラッシュが?に化ける模様。
そう解釈すれば >>68 が正解。

76:名無しさん@お腹いっぱい。
09/07/14 08:06:31
Safari@Macかね?

77:名無しさん@お腹いっぱい。
09/07/14 16:19:50
>>71
>printfコマンドって、使えない環境もあるのかな。

SunOS4 とか。


78:amatsuno ◆y1bfd53lWE
09/07/14 17:52:11
この前はありがとうございました。

もうひとつ教えて下さい。

前回教えていただきましたリストを1行にまとめる方法を教えて下さい。

変更前のファイル(b_ind)の中身);0
DEF_ind
JKL_ind
TUV_ind

変更後のファイル(a_ind)の中身);
DEF_ind,JKL_ind,TUV_ind

上記では3行ですが、実際は1-8のいずれかの行数となります。
このような複数行をカンマ区切りの1行にしたいのです。


DBからバックアップを取る時の指定のインデックスのため、
カンマ区切りの1行記載が必要となりました。

すいませんが知っている方、
宜しくお願いいたします。

79:名無しさん@お腹いっぱい。
09/07/14 18:01:02
>>78
>>60 のスクリプトをちょっと修正すればいいだけだよ。

awk -F, '$1=="A_table"{out=$($2+3);for(i=1;i<$2+0;i++){printf $(i+2) ",">>out}print $(i+2)>>out}'

80:名無しさん@お腹いっぱい。
09/07/14 19:17:06
>>78-79

awkはシェルにあらず。
シェルスレならシェルで解決。


#!/bin/sh

IFS=,
while read line
do
set $line
case $1 in A_table):;;*)continue;;esac
shift
max=$1
shift
eval out='$'$#
i=1
while [ $i -lt $max ]; do
echo -n "$1",
shift
i=`expr $i + 1`
done > "$out"
echo "$1" >> "$out"
done

81:名無しさん@お腹いっぱい。
09/07/14 21:01:22
経験的にsedとawkはrcスクリプトで使われてるのでOK

82:名無しさん@お腹いっぱい。
09/07/14 21:16:41
経験的にイマドキのOSはrcスクリプト自体を使わないのでNG

83:amatsuno ◆y1bfd53lWE
09/07/15 09:40:43
>>79
できました。
ありがとうございます。

84:名無しさん@お腹いっぱい。
09/07/15 16:09:35
>>82
テンプレ読み直してこい
あまりキチガイめいたこと言うなよ

85:名無しさん@お腹いっぱい。
09/07/16 00:53:20
#!/bin/rc もベル研純正シェル

86:名無しさん@お腹いっぱい。
09/07/17 21:39:49
>>34

awkはシェルにあらず。
シェルスレならシェルで解決。


#!/bin/bash

n=$((-$1))
shift
for file in "$@"; {
i=1
while IFS= read -r line
do
((i++ == n)) && {
echo "$line"
break
}
done < "$file"
}

87:名無しさん@お腹いっぱい。
09/07/17 21:52:56
bash使うなよ

88:名無しさん@お腹いっぱい。
09/07/17 22:25:33
bashはLinux板でやれ

89:名無しさん@お腹いっぱい。
09/07/17 22:39:05
>>87-88
bashに過剰反応するな。
kshでもzshでも動くから、bash依存とまでは言えない。


#!/bin/ksh

n=$((- $1))
shift
for file in "$@"; {
i=1
while IFS= read -r line
do
((i++ == n)) && {
echo "$line"
break
}
done < "$file"
}

90:名無しさん@お腹いっぱい。
09/07/18 00:36:24
POSIX準拠だから#!/bin/shでもいいはず、といってみる

91:名無しさん@お腹いっぱい。
09/07/18 01:40:37
/bin/shにはPOSIX shellを置く、なんてことはPOSIXに書いてない

92:名無しさん@お腹いっぱい。
09/07/21 13:50:12
シェルスクリプトでドラッグアンドドロップできる?

93:名無しさん@お腹いっぱい。
09/07/21 14:12:21
>>92
目的は何?

94:名無しさん@お腹いっぱい。
09/07/21 14:32:02
>>93
目的がわかっても答えられないのに逆質すんな。

95:名無しさん@お腹いっぱい。
09/07/21 14:38:10
あぁ、釣りか。

つられちゃったw てへっ?☆

96:92
09/07/21 15:19:06
ちょっと思いついたので聞いてみただけです。目的はありません。

97:名無しさん@お腹いっぱい。
09/07/22 01:01:27
シェルスクリプトで手マンできますか?

98:名無しさん@お腹いっぱい。
09/07/22 01:03:03
>>97
目的は何?

99:sage
09/07/22 15:28:06
質問させてください。
標準入力から入力した値を処理するシェルスクリプト(Bシェル)を作成しています。
入力値に\(バックスラッシュ)が入る可能性があるので、
readのオプションに「-r」を付けて、入力値をすべて受け取れるようにしようと思ったのですが、
「-r」オプションをつけると「英数字以外の文字が使用されています。」というメッセージが出力され
オプションが使えないようです。

例) OS:Solaris10
$ cat aaa.sh
#!/bin/sh
read aaa
echo $aaa

read -r ppp
echo $ppp
$
$ ./aaa.sh
III ←コマンドラインから入力
III ←出力
./aaa.sh: -r: 英数字以外の文字が使用されています。 ←オプションを付けたreadに対してのエラーメッセージ

質問ですが、Bシェルでは、readに「-r」オプションは使えないのでしょうか?
(manを見る限り使えないとは言ってないように思われたのですが)
もし、使えないとすると、何か他に方法をご教授頂けないでしょうか?
(出来る限りBシェルでしたいと考えているのでこのコマンドだけkshで実行するなどでしょうか)
よろしくお願いします。

100:名無しさん@お腹いっぱい。
09/07/22 15:45:09
どうみても使えるとは書いていませんが、何を見ているのでしょうか?
URLリンク(docs.sun.com)

101:名無しさん@お腹いっぱい。
09/07/22 16:14:27
>>99
Solarisの/bin/shのreadは、-rには対応していません。

bashか、zshか、kshを使いましょう。

102:名無しさん@お腹いっぱい。
09/07/22 16:18:57
>>99
どうしても /bin/sh だけでやりたい場合、

read -r aaa
の代わりに、

aaa=`head -1`
とやる方法がある。

103:sage
09/07/22 16:32:21
ありがとうございます。
>>100
-r 使えないんですね。
URLリンク(docs.sun.com)
を見て、標準のオプションなのかなと思い込んでました。

>>101
やっぱり他のシェルにするべきなのか
検討します。

>>102
その様な方法もあるんですね。勉強になります。
今回使用できるのか検討します。


104:名無しさん@お腹いっぱい。
09/07/22 16:32:27
なるほどねえ

105:名無しさん@お腹いっぱい。
09/07/22 16:34:43
>>103
> URLリンク(docs.sun.com)
sh のとこに -r 書いてないじゃん。

106:名無しさん@お腹いっぱい。
09/07/22 16:39:22
docs.sun.com に書いてあるのは、外部コマンド版の /usr/bin/readじゃん。
中身はkshスクリプト。

これって、結局シェル変数が親プロセスに渡らないから意味ないし、
外部コマンド版の /usr/bin/cd と並んで意味不明コマンドのひとつなんだよな。

107:名無しさん@お腹いっぱい。
09/07/22 16:40:44
>>106
いや、/usr/bin/read 以外にシェルの内部コマンドについても書いてあるよ。

108:名無しさん@お腹いっぱい。
09/07/22 16:44:04
>>107
そんなことは知ってるよ。
そうじゃなくて、/usr/bin/readのアフォさ加減について話題を振りたいわけだが。

109:名無しさん@お腹いっぱい。
09/07/22 16:46:03
>>106の書き方じゃ知ってたかどうかわからんよ。

110:名無しさん@お腹いっぱい。
09/07/22 16:50:18
質問者の >>99 が、shの内部コマンドのreadは使えなくても、
shから/usr/bin/readを呼び出せば使える、と勘違いしていた可能性もあるわな。

111:名無しさん@お腹いっぱい。
09/07/22 17:04:48
>>108
POSIX標準では、
・$0 "$@"で実装できるからシステムの負担にはならない
・いい使い方があるかも知れない
・対称性のため
などと存在理由を説明しています。

112:名無しさん@お腹いっぱい。
09/07/22 17:26:25
>>111
>・対称性のため

なら、なぜ、eval exit export wait などについては
外部コマンド版がないのか合理的な説明をお願いします。

113:名無しさん@お腹いっぱい。
09/07/22 17:35:26
POSIX仕様には書いてありません。

114:名無しさん@お腹いっぱい。
09/07/22 17:41:28
POSIX標準がそう決めた理由を聞いているのに、
「POSIX仕様には書いてありません」は循環論法。

115:名無しさん@お腹いっぱい。
09/07/22 17:53:32
>>111に理由聞いてもしょうがないんじゃね。

116:名無しさん@お腹いっぱい。
09/07/22 17:56:28
使えない外部コマンドがあるくせに、
Solarisでは /usr/bin/[ が削除されてるんだよなぁ。
ほんとわけわからん。

117:名無しさん@お腹いっぱい。
09/07/22 17:57:33
>>116
使いたいの?

118:名無しさん@お腹いっぱい。
09/07/22 17:59:48
v7shをもってきて使いたくなるかもしれないじゃないか

119:名無しさん@お腹いっぱい。
09/07/22 18:16:31
>>117
使いたいかどうかじゃなくて、

/usr/bin/[ は、呼び出せば動作する。
一方、/usr/bin/read とか、/usr/bin/umask とかは readや umaskの動作はしない。

動作するものを削除して、動作しないものを配置することの馬鹿さを言ってるんだが。

120:名無しさん@お腹いっぱい。
09/07/22 18:56:40
あってもなくても害がないならどっちでもいいじゃん。
馬鹿と非難するほどのことでもないと思うけど。

121:名無しさん@お腹いっぱい。
09/07/22 19:39:41
これ、正しいか?

URLリンク(docs.sun.com)
> 例 1 read コマンドの例
>
> 以下に示す /usr/bin/read の例は、入力ファイルの内容を、各行の先頭フィールドを最後尾に 移動して出力するものです。
> example% while read -r xx yy
> do
> printf "%s %s\n" "$yy" "$xx"
> done < input_file

122:名無しさん@お腹いっぱい。
09/07/22 20:12:29
マニュアルのバグだね。send-prしといてね。

123:名無しさん@お腹いっぱい。
09/07/23 03:48:55
AIX5.2,5.3で2Gを超えるディレクトリをtarで固めるにはどうすればいいのでしょうか?

124:名無しさん@お腹いっぱい。
09/07/23 15:41:48
man tarとすると、ustarヘッダーの書式を使用すると、ファイルサイズを最大8GBにできます。
とあるのですが、具体的にどうすれば2GB以上のファイルをtarで扱えるようになるのでしょうか?

125:名無しさん@お腹いっぱい。
09/07/23 17:05:40
まず、適切な質問の方法を学びましょう。

126:名無しさん@お腹いっぱい。
09/07/23 17:05:54
これは「シェルスクリプト」なのか ?

まぁとりあえずAIX 5.2では可能らしい
URLリンク(d.hatena.ne.jp)

US-TARかどうかは適当に固めたものを用意してcatで確認したらいい
ustarの文字が入ってたらUS-TARの形式

ほかに
ファイルシステムの問題かも知れない。何使ってる ?
/tmpの残り容量の問題かも知れない。十分ある ?

127:名無しさん@お腹いっぱい。
09/07/23 17:52:21
>>125
まず、適切な回答の方法を学びましょう。

わからないなら黙っていましょう。

128:名無しさん@お腹いっぱい。
09/07/23 17:58:09
AIXスレ行け。

129:名無しさん@お腹いっぱい。
09/07/23 18:06:20
>>127
クズは黙ってろ。

130:名無しさん@お腹いっぱい。
09/07/23 18:15:49
>>123 の質問がとくに不適切とも不備な質問とも思えない。
実際にAIXで2GB超のファイルをtarで固めた経験がある者なら
>>123 を見ただけで即答できるはずだ。

質問の仕方に注文を付けたり、さらに「○○の結果は?」とか追加情報を求める回答者は
その追加情報があっても答えられないダメ回答者。

131:名無しさん@お腹いっぱい。
09/07/23 18:17:42
おかしな煽り野郎が張り付いている模様です。

しばらく放置しましょう。てか、元の質問がシェルスクリプトの質問じゃねぇし。

132:名無しさん@お腹いっぱい。
09/07/23 18:18:36
シェルスクリプトスレで質問するのは適切ではない。言い訳してないで。消えろ。

133:名無しさん@お腹いっぱい。
09/07/23 18:20:43
その tarを シェルスクリプトの中で使う予定なんですぅ、、

134:名無しさん@お腹いっぱい。
09/07/23 18:22:24
言い訳してないで。消えろ。カス。

135:名無しさん@お腹いっぱい。
09/07/23 18:27:49
AIX5.2とAIX5.3です。
以下のようなシェルを発行したところ、
dir以下に2GBを越えるファイルがあるとエラーになります。
どのように修正すればよろしいか?

#!/bin/sh
tar cvf hoge.tar dir

136:名無しさん@お腹いっぱい。
09/07/23 18:36:21
詰まらん。消えろ。クズ。

137:名無しさん@お腹いっぱい。
09/07/23 20:43:57
>>126
ありがとうございます。
USTARの文字ははいっていました。
TMPには空きがあります。
ファイルシステムについては、よくわかりません。

138:名無しさん@お腹いっぱい。
09/07/23 21:51:51
>>137
2G制限ならulimitを確認。
8G制限はどうにもならないのでGNU tarでも使ったら?
で「シェルスクリプトで必要だから」という理由で環境依存の
質問をシェルスクリプト一般のスレでやっても煙たがられるだけ
というありがたい指摘を、そろそろ受けいれたらどうかな?

139:名無しさん@お腹いっぱい。
09/07/23 23:39:41
>>138
ありがとうございます。
今帰りなので、週末に調べてみます。

140:名無しさん@お腹いっぱい。
09/07/26 07:59:26
ulimitはunlimitedでした。引続きお願いします。

141:名無しさん@お腹いっぱい。
09/07/29 12:57:14
スレ違いだと何度いったらわかるんだ。池沼。消えろ。

142:名無しさん@お腹いっぱい。
09/07/31 20:12:20
すみません、お力を貸してください。
aaa.txtの中身が、

aa\n
bb\n
cc\n

として、これをシェルスクリプトで

unko=$(cat aaa.txt)
echo ${unko}

とすると、

aa bb cc

と改行がスペースに置換されていますが、これを改行のまま格納することはできないでしょうか。

上記はあまりいい例ではないので「cat aaa.txt」でいいだろ、と思われるかと思いますが。。。
ftp -nvとかの標準出力を一旦変数に入れといて、後から結果解析及び出力したく、しかも、諸事情でtmpファイル(←すみません、ちんぽファイルではなくて一時ファイルです)を作るのはNGなので、なんとか改行をスペースに置換させないで変数に入れて実現したいのです。

どなたか、ご教示お願いいたします。OSは、HP-UX、Bashです。よろしくお願いします。

143:名無しさん@お腹いっぱい。
09/07/31 20:48:07
>>142
echo "$unko"

144:名無しさん@お腹いっぱい。
09/08/01 23:50:17
シェルを2つ以上コマンドで開くことは出来る?
今はパネルからクリックしてるので大変。
でも、コマンド売っても出てこない><
ちなみに端末エルミネーターはBASH。

145:名無しさん@お腹いっぱい。
09/08/01 23:52:35
はいはい 15点

146:名無しさん@お腹いっぱい。
09/08/02 05:00:19
>>142
配列(パイオツじゃないよ)使うんじゃだめなの?

147:名無しさん@お腹いっぱい。
09/08/02 09:40:59
>>146
>>143

148:名無しさん@お腹いっぱい。
09/08/02 13:13:29
>>142
シェル変数の展開時は、ダブルクォートでくくるのが原則。
それで、改行もスペースもそのまま保存される。

逆に、単純に展開する場合は ${ } でくくる必要はない。

149:名無しさん@お腹いっぱい。
09/08/03 00:52:02
. や source で起動されても、自分の名前を取れる方法ありますか?

当然$0だとだめなわけですが

[root@miu tmp]# cat a.sh
#!/bin/sh

echo $0

[root@miu tmp]# source a.sh
bash
[root@miu tmp]#

150:名無しさん@お腹いっぱい。
09/08/03 01:39:05
. や source は起動されてないし

151:名無しさん@お腹いっぱい。
09/08/03 02:40:17
そこをなんとか・・

152:名無しさん@お腹いっぱい。
09/08/03 04:37:49
bash依存

$ echo 'echo $BASH_SOURCE' > /tmp/t.sh
$ . /tmp/t.sh
/tmp/t.sh


153:名無しさん@お腹いっぱい。
09/08/03 06:26:10
>>152
bash3以降依存だね。bash2だと動作しない。

154:名無しさん@お腹いっぱい。
09/08/03 07:19:14
>>149
先頭で自分の名前を変数に代入すれば?

155:名無しさん@お腹いっぱい。
09/08/03 07:24:49
>>154
全然解決になりません。
同じスクリプトを複数のファイル名でハードリンクしていて、
呼ばれた名前によって動作を切替えたいので。

156:名無しさん@お腹いっぱい。
09/08/03 07:28:15
もう $BASH_VERSION チェックして $BASH_SOURCE 使えよ。

157:名無しさん@お腹いっぱい。
09/08/03 08:19:17
そもそも.でもsourceでも名前わかってなきゃ呼べないよね
呼べるってことは名前わかってるじゃん
あほじゃないの?
$_とかでもいいんじゃないの?


158:名無しさん@お腹いっぱい。
09/08/03 08:39:57
>>157
惜しいけど、

hoge=file
source $hoge

みたいに、変数経由で呼ぶと、
$_ では名前を取得できないから NG。

159:名無しさん@お腹いっぱい。
09/08/03 08:43:04
>>157
シェル依存。

ashとかでは、sourceファイル内一発目の $_ は、$0 と同じ値になってる。よって不可。

160:名無しさん@お腹いっぱい。
09/08/03 20:41:06
>>155
>同じスクリプトを複数のファイル名でハードリンクしていて、
>呼ばれた名前によって動作を切替えたいので。
それは(+sourceした時にまで対応したいという)発想に無理があるのでは

161:名無しさん@お腹いっぱい。
09/08/03 20:48:50
>>160
わからないなら黙ってろ

162:名無しさん@お腹いっぱい。
09/08/03 21:10:02
シェル非依存な方法はないから。

163:名無しさん@お腹いっぱい。
09/08/04 01:00:01
関数内のexitをreturnと同じように振舞わせる方法はないでしょうか。

現場で共通利用している共通関数の定義ファイルを . で読込んで使っているのですが、、、
お目当ての共通関数は、関数内でエラーだった場合、ログ吐いてexitまでしてしまい、困りました。
エラーコードで返してくれさえすれば、処理自体はそのまんま使いたいのですが。。。

その共通関数の戻り値はreturnでは返されず、共通関数内で定義した変数に格納され、呼び元でその変数を使う作りになっています。
何卒よろしくお願いします。

164:名無しさん@お腹いっぱい。
09/08/04 01:02:56
質問です。
以下のようなファイルhoge.datがあるとします。
------------------------
~$ cat hoge.dat
usa\newyork
japan\tokyo
korea soul
------------------------
このhoge.datを、以下のようなスクリプトで読み込んでから、出力してみたのですが、
円マーク(\)が表示されなくなります。
------------------------
~$ cat hoge.sh
#!/bin/sh
IFS='
'
while read line
do
echo "$line"
done < hoge.dat
---------------------------
実行結果
---------------------------
~$ ./hoge.sh
usanewyork
japantokyo
korea soul
---------------------------
円マーク(¥)も表示されるようにするにはどうしたらよいでしょうか?

165:名無しさん@お腹いっぱい。
09/08/04 06:39:16
>>164
read -r


あと、円マークじゃなくてバックスラッシュが表示されるように設定しろ

166:名無しさん@お腹いっぱい。
09/08/04 06:44:51
>>163
alias exit=return
. hoge
unalias exit

167:名無しさん@お腹いっぱい。
09/08/04 08:37:30
>>163
result=`. hoge;echo \$result`

168:名無しさん@お腹いっぱい。
09/08/04 08:43:41
>>167
「.」でソースしてるファイル内で「関数定義」をしているので、
それだとサブシェル扱いになるので、リターンすると関数定義が消えてしまうので
解決になりません。(戻り値が必要なのではありません)

169:名無しさん@お腹いっぱい。
09/08/04 08:58:38
条件後出しすんなよ。そういうことなら
(共通関数)

条件後出しのお代りか?

170:名無しさん@お腹いっぱい。
09/08/04 09:06:40
>>169
後出しじゃないだろ

>>163
>共通関数の定義ファイル

171:名無しさん@お腹いっぱい。
09/08/04 09:09:35
>>166 で解決でしょ。
sourceしたファイル内で returnできるshには、aliasもあるから。

172:名無しさん@お腹いっぱい。
09/08/04 09:21:24
見てきたように嘘をつくなあ、純正shはreturnあって、alias無い。

173:名無しさん@お腹いっぱい。
09/08/04 09:27:17
>>172
> 「sourceしたファイル内で return」

純正shは、関数の中でしかreturnできない。
sourceしたファイル内で returnすると、純正シェルではエラーになる。

嘘はお前。

174:名無しさん@お腹いっぱい。
09/08/04 09:58:18
嘘つきはどちらでしょうか?
> お目当ての共通関数は、関数内でエラーだった場合、ログ吐いてexitまでしてしまい、困りました。

175:163
09/08/04 12:35:58
みなさんたくさんのレスありがとうございます。

>>166を使って相談してみたところ怪訝な顔をされてしまい、
結局「共通関数のコピペで別の関数(exit→returnだけ)を作れ」
となってしまいました。。。
※個人的には、その方がよっぽど怪訝な顔したいですが。。。

とても勉強になりました。ありがとうございました!

176:名無しさん@お腹いっぱい。
09/08/04 13:39:20
>>172
質問者(>>175)が、「>>166(alias)を使って相談してみた」って言ってるから、
やっぱりaliasが使えるシェルだったということで、>>171 が正しかったじゃん。

177:名無しさん@お腹いっぱい。
09/08/04 13:44:25
たまたま使えただけ。↓は赤っ恥全開の嘘。
> sourceしたファイル内で returnできるshには、aliasもあるから。

178:名無しさん@お腹いっぱい。
09/08/04 13:45:27
>>177
「sourceしたファイル内で returnできるshには、aliasもある」は正しいが。

179:名無しさん@お腹いっぱい。
09/08/04 13:50:33
恥の上塗りミットも茄子。
シェル関数内でのexitを書き換える為には↓これでは十分じゃないから。
> sourceしたファイル内で returnできるshには、aliasもあるから。

180:名無しさん@お腹いっぱい。
09/08/04 13:53:53
>>179
おまえ、意味取り違えてるよ。

シェル関数じゃなくて、sourceしたファイルを中途終了するときに、
returnが使えるんだよ。(純正シェルだと使えない)
(exitを使うとsourceした元のシェル自体が終了するので使えない)

そういう新しい機能のreturnが使えるシェルなら、aliasも使える。

181:名無しさん@お腹いっぱい。
09/08/04 13:58:38
>>180
とぼけようと必死だな。質問者のお題(>>163)は関数内のexitを再定義すること。
> 関数内のexitをreturnと同じように振舞わせる方法はないでしょうか。

「sourceしたファイル内でのreturn」は全然関係ない。

182:名無しさん@お腹いっぱい。
09/08/04 14:08:28
>>172 は、
>>171 「sourceしたファイル内で returnできるshには、aliasもある」
のことを「嘘」だと言った。

その >>172 は間違い。
(>>172 では、元の質問のことには触れられていないから、
>>171 自体を質問に関係なく「嘘」と決めつけている。それは当然間違い)

「sourceしたファイル内で returnできるshには、aliasもある」は正しい。

183:名無しさん@お腹いっぱい。
09/08/04 14:09:10
彼らは何のために戦っているのだろう。

184:名無しさん@お腹いっぱい。
09/08/04 14:11:55
なぜ「彼」と限定できるんですか? エスパーですか?

185:名無しさん@お腹いっぱい。
09/08/04 14:13:25
エスパーですよ。

186:名無しさん@お腹いっぱい。
09/08/04 14:14:22
>>173 に指摘されるまでは、
>>172 は関数外での returnの用法を知らなかったんだろう。

187:名無しさん@お腹いっぱい。
09/08/04 14:14:44
>>182
無様杉。引っ込んでろ。

188:名無しさん@お腹いっぱい。
09/08/04 14:17:13
>>187
一般的に、>>187 みたいに論理的な指摘が一切含まれていない暴言を先に吐いた方が
議論の負け。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4253日前に更新/233 KB
担当:undef