07/02/15 14:32:25
□前スレや過去スレ:
シェルスクリプト総合 その7
スレリンク(unix板)
シェルスクリプト総合 その6
スレリンク(unix板)
シェルスクリプト総合 その5
スレリンク(unix板)
シェルスクリプト総合 その4
スレリンク(unix板)
シェルスクリプト総合 その3
スレリンク(unix板)
シェルスクリプト総合 その2
スレリンク(unix板)
シェルスクリプト総合 その1
スレリンク(unix板)
□関連スレ:
sed
スレリンク(unix板)
正規表現
スレリンク(unix板)
おまえら! shell は何を使っているんですか?
スレリンク(unix板)
Eshell の使い方とか設定とか【Emacs Shell、Lisp】
スレリンク(unix板)
3:名無しさん@お腹いっぱい。
07/02/15 14:34:55
□初心者向けリンク
「誰にでも」シリーズ
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)
□参考リンク:
UNIXの部屋 (沢山のコマンドの簡単な紹介など)
URLリンク(x68000.q-e-d.net)
POSIX: Shell & Utilities (標準規格)
URLリンク(www.opengroup.org)
4:名無しさん@お腹いっぱい。
07/02/15 14:35:28
□最近のシェルスクリプト本(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)
5:名無しさん@お腹いっぱい。
07/02/15 14:38:51
□最近のシェルスクリプト本(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)
6:名無しさん@お腹いっぱい。
07/02/15 14:42:04
□関連書籍と関連リンク:
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,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -print0、xargsは -0オプションを常に付けることを推奨
ただし、Solarisでは未対応。どうするんだろ?)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
7:名無しさん@お腹いっぱい。
07/02/15 15:50:29
>>1
乙
8:名無しさん@お腹いっぱい。
07/02/15 16:34:15
3秒間のウエイトっていれる方法ありますか?
9:名無しさん@お腹いっぱい。
07/02/15 16:35:58
>>8
sleep 3
10:名無しさん@お腹いっぱい。
07/02/15 16:36:49
sleep 3 じゃダメなんか?
11:名無しさん@お腹いっぱい。
07/02/15 16:41:00
sleep 3
12:8
07/02/15 17:35:57
>>9-11
ありがとう
13:名無しさん@お腹いっぱい。
07/02/15 19:50:58
URLリンク(www.linux.or.jp)
14:名無しさん@お腹いっぱい。
07/02/15 21:08:02
>>1
乙
> □最近のシェルスクリプト本(1)
なんかダブってるけど、これの(2)ってのはあるの?
15:名無しさん@お腹いっぱい。
07/02/15 21:29:48
>>14
!
ダブリは1のミス
(2)は(まだ)ない
16:名無しさん@お腹いっぱい。
07/02/15 22:41:49
________
,r'´:.:.:.:.:.:.:.:`.、
,r'/:.:.:.:.:.:.:.:.、ヽ;,:.ヽ
l:.i:.:.i:Mヽヽl:.:i:ヽ;,;,;l
!:l:i.:トl レレVレ!:.:!-、!
ヽトl:f_! '´i_,トl:.:.!_,ノ シエルスクリプトって
l.ヽ '__, l.:.:!/ なんですか?
l:.:| `iー‐'´l:.;!`!
/!;!´ヽ,! -l;!´`ヽ、
,r'´! 人 ,r''ヽ
!::;;l /:::;ヽ ,r';;;r':::ヽ
l:;;/´:::::::::::::;ヽ,r';;/;;:::::::::ヽ
.l;;i:::::::::::::::::::::::::;;;;;;ヽ;::::::::::ヽ
17:名無しさん@お腹いっぱい。
07/02/15 22:47:32
(||)
18:名無しさん@お腹いっぱい。
07/02/15 22:54:41
今度シェルスクリプトを覚えなければならなくなったのですが、
私のマシンにはシェルがインストールされていないようです
(メニューにそれらしいものがない)
シェルを追加インストールするには、どこをクイックすればいいですか?
OSはKDE3.5です。
19:名無しさん@お腹いっぱい。
07/02/15 23:02:42
catの無駄遣いなんかに関する すごい説得力がある スライド
URLリンク(www.netmeister.org)
20:名無しさん@お腹いっぱい。
07/02/15 23:08:35
>>19
面白いから順に見たけどこれ長いよ!
21:名無しさん@お腹いっぱい。
07/02/15 23:09:38
てかおもしろすぎる
22:名無しさん@お腹いっぱい。
07/02/15 23:11:51
FTP に複数コマンドを渡す際に、複数行を「+」で囲んで FTP のコマンドを記述しています。この方法は他のシェルスクリプトからのコピーです。
一応意図した動作をしているのですが、仕様を知らずに使っているため不安です。
この方法の仕様が説明されているサイト等を教えて頂けませんか?man で sh と ftp を見ましたが、該当の記述はありませんでした。
よろしくお願いします。
23:名無しさん@お腹いっぱい。
07/02/15 23:49:48
>>18
シェルがないと起動プロセスがまともに進行しないので、
ないってことはあり得ない。
また、KDEはOSではなくて、デスクトップ環境の一種。
あなたが必要なのはKonsoleというKDEのアプリケーションと、
エディタ。
24:名無しさん@お腹いっぱい。
07/02/15 23:52:19
瓶詰めぬこカワユス。
25:名無しさん@お腹いっぱい。
07/02/16 00:42:36
lsの結果を配列に入れるにはどうすればいいでしょうか?そもそもできますでしょうか?
26:名無しさん@お腹いっぱい。
07/02/16 00:52:10
headでアレかよ!
27:名無しさん@お腹いっぱい。
07/02/16 02:00:22
>>22
ftp<<EOF
コマンド
EOF
じゃダメなの?
28:名無しさん@お腹いっぱい。
07/02/16 02:55:27
>>19 みて awk 覚えようと思った
29:名無しさん@お腹いっぱい。
07/02/16 03:56:04
最後の三ページを忘れるなよ。
catの無駄遣いも可愛いからいいじゃないか。
30:名無しさん@お腹いっぱい。
07/02/16 07:22:48
>>25
sh$ set `ls`
sh$ echo "$1"
sh$ echo "$2"
:
bash$ hairetsu=(`ls`)
bash$ echo ${hairetsu[0]}
bash$ echo ${hairetsu[1]}
:
31:名無しさん@お腹いっぱい。
07/02/16 13:31:32
ここはネタスレと解釈してもいいですか?
32:名無しさん@お腹いっぱい。
07/02/16 15:03:09
>>28
cutもたまには使ってあげようと思った
33:名無しさん@お腹いっぱい。
07/02/16 15:58:55
たまにはぬこの蚤とりしようとおもた
34:名無しさん@お腹いっぱい。
07/02/16 17:25:28
たまにはK.I.S.Sの格好もしてみようと思った。
35:名無しさん@お腹いっぱい。
07/02/16 20:24:12
大至急、BourneとBASHを覚えなければならなくなったのですが、
手っとり早いお勧めの方法は何ですか?
はっきり言って、理論的なことはどうでもいいです。
最小限の努力で、最大限、見ためだけ高スキルに見えればいいです。
よろしくお願いします。
36:名無しさん@お腹いっぱい。
07/02/16 20:24:38
ちょっと思ったのですが、シェルスクリプトでC言語の#ifdefマクロみたいなことって
出来ますか?
37:名無しさん@お腹いっぱい。
07/02/16 20:26:07
>>36
Yes.
38:名無しさん@お腹いっぱい。
07/02/16 20:43:20
>>35
スクリプトは一日にして成らず、だ
だがあなたの要求だけを見ると高スキルのスクリプトを真似て作ればいいと思われ
問題は努力もしないで中身が理解できれば・・・だが
39:名無しさん@お腹いっぱい。
07/02/16 20:48:59
あのTシャツ欲しいと思った
40:名無しさん@お腹いっぱい。
07/02/16 20:50:49
>>35
英語でのコミニュケーション能力と、pythonとperlはいいのかい?
41:名無しさん@お腹いっぱい。
07/02/16 20:51:33
>>39
つくればいいじゃん
42:名無しさん@お腹いっぱい。
07/02/16 20:52:54
>>40
はい。そっちの方は無問題です。
43:名無しさん@お腹いっぱい。
07/02/16 20:53:38
じゃあとりあえず突撃してみたら?
44:名無しさん@お腹いっぱい。
07/02/16 21:01:02
URLリンク(www.thinkgeek.com)
探せばあるかも。
45:名無しさん@お腹いっぱい。
07/02/16 21:07:28
ワロタ
Looking For A Japanese Girlfriend
URLリンク(www.thinkgeek.com)
で、
Go away or I will replace you with a very small shell script
URLリンク(www.thinkgeek.com)
46:名無しさん@お腹いっぱい。
07/02/17 00:40:46
そこ結構面白いな。
鬼畜米英じゃなく鬼畜米兵になっとるw
URLリンク(www.thinkgeek.com)
47:名無しさん@お腹いっぱい。
07/02/17 01:05:58
>>28
複数の grep が一つにまとまるのがいい感じだな。
48:名無しさん@お腹いっぱい。
07/02/17 01:34:50
著書なんかには
if [ i = y ]
then
echo aaa
fi
とかあるのだが、実際やってもErrorがでて・・・
if [[ i = y ]]
then
echo aaa
fi
みたいに2重括弧にしないといけないのはなぜなんでしょうか?
49:名無しさん@お腹いっぱい。
07/02/17 01:35:53
ググったり本で調べたりしてどーしてもわからないことがあるので質問させてください。
ksh で 文字コードで grep するエレガントな方法が分かりません。
bash なら、
grep $'\011' hoge.txt
で可能だということは分かっています。
ksh だと、
grep "`echo '\011\c'`" hoge.txt
で同じことが可能だということは分かっていますが、bash ほど簡潔ではありません。
(いずれも Linux 上で確認)
昔、Solaris 8 上の ksh スクリプトで bash での記述例くらいに簡潔に書かれたコードを見た記憶があるのですが…。
分かる方がいらっしゃったらご教授ください。お願いします。
できれば ksh88 でお願いします。
50:名無しさん@お腹いっぱい。
07/02/17 02:51:41
>>48
[ はコマンドで、[[ は bash の構文の一つ。
/bin/sh で書くなら [[ は使えない。
あと、比較演算子の書き方やその解釈がちょっと違う。
[ 1 -gt 0 ] と [[ 1 > 0 ]] とか
[ "1+1" -ge 2 ] と [[ "1+1" >= 2 ]] とか
詳細は man bash ね。
51:名無しさん@お腹いっぱい。
07/02/17 10:33:59
>>48
if [ i = y ]
then
echo aaa
fi
↑でエラー出ないよ。
もしエラーが出たんなら、[ や ] や = の前後のスペースを忘れたとか、
そういう問題だと思う。([ ]か [[ ]]かの問題とは違う)
[[ ]] は Bourneでは使えないので、できる限り [ ] で書くのがお勧め。
52:名無しさん@お腹いっぱい。
07/02/17 10:58:27
すいません、
名前にスペースの入ったファイル名のリストを for とか foreach に渡すときは
どうしたらいいでしょうか。
for f in `find なんたらこうたら`; do ほげ "$f"; done; みたいなことをしたいのですが
find の結果のファイル名にスペースがある場合、スペースのとこで割られるようです。
53:名無しさん@お腹いっぱい。
07/02/17 11:10:46
>>52
IFS='
' for f in `find なんたらこうたら`; do ほげ "$f"; done;
IFSに改行コードを入れて、それを区切り文字にする。
54:名無しさん@お腹いっぱい。
07/02/17 11:13:56
>>52
find の部分をコマンド置換すると、ファイル名のデリミタとしての半角空白なのか、ファイル名中の半角空白なのがシェルから見ると区別がつきません。
上手く動かない原因はこれです。
よってコマンド置換で実現するのは諦めましょう。
- start --------------------
find . -type f |
while read f
do
echo $f
done
- end ----------------------
自分がパッと思いつくのはこれ。
ただ、read コマンドは遅いので、もっとエレガントを考える余地があるかもしれません。
ところで、sh に foreach ってありましたっけ?
55:名無しさん@お腹いっぱい。
07/02/17 11:15:41
#!/bin/sh
IFS=\
for a in `find . -type f`;do echo "$a";done
これでも、名前に改行が含まれるとダメなのでfind -execをおすすめする。
56:名無しさん@お腹いっぱい。
07/02/17 11:20:18
>>53
その方法、いいですね!
でも環境変数を触るのって、どうなのでしょう?
触るとしても、
- start --------------------
OLD_IFS=$IFS
IFS='
'
for f in `find . -type f`
do
echo $f
done
IFS=$OLD_IFS
- end ----------------------
を推奨すべきかと。
57:名無しさん@お腹いっぱい。
07/02/17 11:27:22
いろいろ条件が許せば、find -print0とxargs -0のコンビにお任せする。
58:名無しさん@お腹いっぱい。
07/02/17 11:29:43
>>55
>>57
ああ、本当だ。改行がファイル名に入るとアウトですな。
for や while だと完全ではないですね…。
59:名無しさん@お腹いっぱい。
07/02/17 12:20:55
>>56
なんでそんなことする必要があるんだ?
>>53 のスクリプト作って、実行した後の $IFS 見てみた方がいいよ。
60:名無しさん@お腹いっぱい。
07/02/17 13:11:12
続きがあるとは想像できないのだろうか?
61:名無しさん@お腹いっぱい。
07/02/17 13:18:38
>>60
続きがあっても関係ない。
↓これ試してみろ。
HOGE=hoge command
echo $HOGE
62:名無しさん@お腹いっぱい。
07/02/17 14:04:31
$ cat hoge
IFS='
' for f in `find -type f`; do echo "$f"; done;
$ sh hoge
sh hoge
for: not found
hoge: 2: Syntax error: ";" unexpected
63:名無しさん@お腹いっぱい。
07/02/17 14:09:59
$ cat hoge
IFS='
' for f in `find . -type f`; do echo "$f"; done;
だった。
64:名無し募集中。。。
07/02/17 21:45:40
変数=値 command ( IFS='改行コード' for ... ) で実行した際
IFSの変更に対して安全かどうなかなんて元のお題には意味なくないか?
元のお題だとそもそもfindで引っかかる数(吐き出す文字数)が予測不能なんだし
tabやspaceのことも含めて for はやめて find | xargs か while の方が安全なんだが
あとファイル名に改行コードが含まれる場合は?とかこの板的には重要かもしれん
けど、そこまで考えるとどうしたら処理できるか?より、そんなファイルが作られないように
するにはどうしたらいいか?という問題になる気がする
その上でそういうファイルをリネームや削除するスクリプトを組みたいっていうなら
環境や状況に合わせたものを組めばいい、動くことが重要で
エレガントな一般的解法なんて考えても無駄だし必要もないはず
65:名無しさん@お腹いっぱい。
07/02/17 22:54:12
もとのお題に対してはどうでもいいが、if, for, while, caseといった
フロー制御コマンドは変数=値 command形式では使えないという事実は、
このスレ的には重要。
66:52
07/02/18 09:45:52
皆さん、どうもありがとうございました。なるほど、IFS とか while ですか。
自分の環境では改行がファイル名に入ることはとりあえずないんですが、
より厳密には find -print0 として IFS に NUL をセットすればいいんですかね?
と思ったんですが... あれ、IFSにNULをセットって、どうやればいいんでしょう?
たびたびすいません。
67:名無しさん@お腹いっぱい。
07/02/18 11:30:58
grep -e 'foo (\w+?) bar' file
とした場合、 perl などでは \1 で (\w+?) の内容を
参照できるのですが、 grep (sed, awk など) でそうする方法はありますか?
68:名無しさん@お腹いっぱい。
07/02/18 12:52:25
>>52
厳密にやりたかったら
1 find -print0を使ってNULLをレコードの区切りと認識できるコマンドで
処理する(shのwhileやforは使用できない)
2 find -execで1個づつ処理する。
3 perlで全部やる
>>67
sedにはある。awkは知らん。マニュアル嫁。
69:名無しさん@お腹いっぱい。
07/02/18 13:03:35
自分が知らんならマニュアル嫁とかほざくな。
70:名無しさん@お腹いっぱい。
07/02/18 13:29:37
マニュアル嫁よ>>69
71:名無しさん@お腹いっぱい。
07/02/18 14:30:15
言うこと無くなると何度も前と同じ事を
繰り返してほざく知恵遅れが小学校の時にいたんだが、
>>68=70 でそいつを思い出した.
もしかするとそいつかもw
72:名無しさん@お腹いっぱい。
07/02/18 15:13:28
何度諭されてもしつこく絡んでくる >>69=>71 みたいなアフォもいたなぁ。
まあ、諭されてることすら理解できてないんだろうけど。
73:名無しさん@お腹いっぱい。
07/02/18 15:32:02
72 が必死すぎる件
74:69!=71
07/02/18 15:33:37
おっと俺はこっちだ。
他人に煽られたからってお前がその煽り文句を真似して効果があるとは限らんぞ。
75:68
07/02/18 15:50:25
いくら煽っても>>67は回答を得られないという事実。
>>71
残念ながら>>70は俺じゃない。>>69のような糞蝿は煽るほどの価値もない。
76:名無しさん@お腹いっぱい。
07/02/18 15:59:07
クスクスクス
77:名無しさん@お腹いっぱい。
07/02/18 17:00:23
(・∀・)ニヤニヤ
78:名無しさん@お腹いっぱい。
07/02/18 23:20:22
>>67
どっちでもできる。
man に載っているよ。
79:64
07/02/19 05:56:44
>>65
お、仰るとおりですな
>>52
普通?は find コマンドと IFS 変数は関係ないよ
いや余程特殊な環境があるなら分からんけど
IFS 変数は Bourne Shell 系 ( sh, ksh, bash など) で区切り文字の定義に使われる
で find コマンド自体はこの環境変数を参照しないから関係ない
find -print0 は出力する各ファイル名にヌル文字を付加する
で find -print0 が使える環境なら xargs -0 も使えるんじゃない?
>>57さんが既に言ってるけどね
>>67, >>78
sed, grep はあるけど awk はなかったような
80:名無しさん@お腹いっぱい。
07/02/19 06:11:10
>>79
grep ではどうやんの?
81:名無し募集中。。。
07/02/19 06:55:03
>>80
環境によっては使えないかもね
manでもネットでも調べれば?
82:64
07/02/19 07:03:11
>>52
あ、find -print0 と IFS を弄って while を組合わせたいって意味なら駄目だよ
>>68さんの言ってる方法で
それより -print0 オプションが使えない環境もあるから
まずはそっちを調べた方がいいよ
83:名無しさん@お腹いっぱい。
07/02/19 07:57:15
>>79
findコマンド自体では IFSは当然関係ないが、
findの結果を ` ` で取り込んで forの引数にする際に
IFSが参照される。(IFSの影響を受ける)
なので、スペース入りファイル名の問題なら、
IFSの内容を改行コードのみにして for f in `find ...` を実行すればOK
なことは既に上に書かれている。
84:名無しさん@お腹いっぱい。
07/02/19 17:57:07
>>68
ちなみに NULL じゃなくて NUL ですね。
85:名無しさん@お腹いっぱい。
07/02/19 22:58:23
>>84
頭ではわかっているが、指が憶えてしまっているのでしょうがない。
86:名無しさん@お腹いっぱい。
07/02/20 02:12:08
>>79
man awk の文字列関数の項を参照してみな。
もしかしたら gawk だけかもしれないけど。
87:名無しさん@お腹いっぱい。
07/02/20 10:40:49
gawk 3.0 以上の拡張機能でございます。
88:名無しさん@お腹いっぱい。
07/02/20 11:31:38
大嘘つき
89:64
07/02/20 17:58:58
いつから正規表現板に?あと自分の環境が全ての人しか居ないの?
素のAIXじゃ、grep '\(a\)\1' はできたが egrep, grep -E は無理みたい
拡張正規表現だと \1 は使えなさそうあとawkも
gawk は知らんけどgawkは無い環境も多いからawkとgawkを一緒にするな
awkと言えば昔ながらの素のawkのことだよ
linuxでshを語るアホウ(そりゃashだ)と同じやね
90:64
07/02/20 19:15:33
最後だけ削除
shについては、Cygwinもash、今時の素のAIX、HP-UXなら実はkshだったりするから
Solaris、FreeBSDは知らんけど例としてはかなり不適切やね、無視してくれ
91:名無しさん@お腹いっぱい。
07/02/20 21:12:01
kshはねーよ。デフォルトでは使いにくい。
set -o emacs
set -o vi
どっち?
92:osuga
07/02/20 22:49:15
>>90
HP-UXのデフォルトがkshかよ
93:名無しさん@お腹いっぱい。
07/02/20 22:58:23
>>64は面白いな
94:名無しさん@お腹いっぱい。
07/02/20 23:48:35
>>89
> 素のAIXじゃ、grep '\(a\)\1' はできた
参考までに grep のバージョン教えてくれ。
>>90
> Cygwinもash
それいつの話?
手元の環境だと ash は入れてあるけど、sh の実体は bash になってるよ?
$ uname -r
1.5.24(0.156/4/2)
$ /bin/sh --version
GNU bash, version 3.2.9(11)-release (i686-pc-cygwin)
Copyright (C) 2005 Free Software Foundation, Inc.
95:名無しさん@お腹いっぱい。
07/02/21 02:37:28
>>89
POSIX的には拡張正規表現(ERE))でbackrefernceが使えるということは
一言も書いていないので、grep -E でbackrefernceが使えるGNU grep
なんかが拡張しているということなんだろう。多分。
96:名無しさん@お腹いっぱい。
07/02/21 04:14:13
それにしてもネタないね
叩きはすぐ集まってくるけど
grep '\(a\)\1' は実際できるし(AIX5.3、SFU)、基本正規表現(BRE)にあるんで
linuxやHP-UXのgrepでも出来た記憶がある、まぁ昔の事なんで自信はない
拡張正規表現(ERE)にはBREの\( \)にあたるものが無いようで
>>95はフォローしてくれたんだろうけど
実際にやってみたが egrep, grep -E じゃできなさそう(AIX5.3)と既に書いている
HP-UXのshについては昔、といっても11iなんだが
純粋なshでは使えないはずの [[ ]] や alias なんかが使えたんで調べたら
sh-posix とか書かれていて、sh->kshで拡張されたものがほぼ?まんま拡張されてた
なんでHP-UXのshはksh、って位の認識だったんだが
POSIX の sh いうんやから [[ ]] や alias が使えるのが今時の純粋な sh ということかもしれんね
97:名無しさん@お腹いっぱい。
07/02/21 09:12:36
おまえら >>1 読め
正規表現については以降はこちらへ
↓
正規表現
スレリンク(unix板)
98:名無しさん@お腹いっぱい。
07/02/21 10:35:28
sh-posix ってのがあるんですよ奥さん
99:名無しさん@お腹いっぱい。
07/02/21 10:37:51
>>98
だから、sh-posixの部分だけ書けばいい。
正規表現の部分はスレ違い。
100:名無しさん@お腹いっぱい。
07/02/21 10:57:54
本当にそういうものはあるのかな?
solaris においては /bin/sh は sh-posixではなく
/usr/xpg4/bin/sh が ごにょごにょ
FreeBSD では /bin/sh は IEEE Std 1003.2 (``POSIX.2'') に対応する途上
NetBSD では /bin/sh は POSIX 1003.2 and 1003.2a に対応する途上
OpenBSDでは (ry
HP-UX では
101:名無しさん@お腹いっぱい。
07/02/21 10:59:10
あ、きみ宛というよりは>>96宛てかな?
102:名無しさん@お腹いっぱい。
07/02/21 12:16:07
URLリンク(docs.hp.com)
でも嫁
現在のHP-UXの/bin/shはsh-posixであって、古いbourne shellは存在しない
sh-posixはkshによく似ているが別物
>>90は間違いだらけ
103:95
07/02/21 12:40:01
>>96
すまん。寝る直前に書いたせいか
フォローのつもりがわけのわからんものになってた。
GNU のツールでそうだからといって、
それがUNIX全般でいえるかというと違うよね。
というのを補足したかった(awkとgawkとか)
104:名無しさん@お腹いっぱい。
07/02/21 13:49:30
>>102
以前は /usr/old/bin/sh に Bourne shell があったんだけど今はもうないの?
手元に実機がないので確認できない。
105:名無しさん@お腹いっぱい。
07/02/21 14:03:34
>>104
実機がなくても参照できちゃうんだなこれが
URLリンク(docs.hp.com)
-
注記 : B シェル (/usr/old/bin/sh) は、HP-UX 11i Version 1.5 以降、削除されました。
代りに、POSIX シェル (/usr/bin/sh) を使ってください。
-
本当に実機がこうであるかは確認していないけどね~
106:ksh
07/02/21 19:49:50
こんばんわ ペソです。
シェル初心者ですが教えてください。
「ディレクトリの中にあるファイルで、実行権限のないファイルを読み込み
そのファイルに実行権限を付与するシェルが必要なのですがどうすればいいのかわかりません。
OS: AIX shell: ksh
#!/bin/ksh
for filename in ${1:+$1/}* ; do
newfilname=$(print $filename |tr [A-Z] [a-z])
newfilename=$newfilename%.}
print "$filename -> $newfilename"
mv $filename $newfilename
done
とりあえず自宅のfedora core5 のkshで実行したら、
' unexpectedtax error: `
と表示されて困ってます。
どうか教えてください。お願いします。
107:名無しさん@お腹いっぱい。
07/02/21 19:56:52
>>106
質問が支離滅裂。実行権限を付けたいといっているのに、
スクリプトではファイル名の大文字を小文字にリネームしようとしている。
あと、クォートが正しくないので、スペース入りファイル名とかでコケるだろう。
釣りじゃないならもう一度よくまとめてから質問し直せ。
108:ksh
07/02/21 20:43:07
すいませんでした。
リネームするスクリプトを少し変更して作ろうとしているのですが、
このファイルもこけて動かないんです。
109:名無しさん@お腹いっぱい。
07/02/21 21:12:05
>>106
そんなの、
#!/bin/sh
chmod +x "$1"/*
だけでいいじゃん。kshである必要もなし。
110:名無しさん@お腹いっぱい。
07/02/21 21:13:56
とりあえず
1. シェルスクリプトのことをシェルというな。
2. forの次の行からdoneの前の行までは全部リネーム用でいらないから削れ。
3. man test
4. man chmod
111:名無しさん@お腹いっぱい。
07/02/21 21:15:07
>>109
「実行権限のないもののみを選び出す」というのが宿題の一部であると
思われるので、問答無用で+xしちゃいけないかもしれない。
112:名無しさん@お腹いっぱい。
07/02/21 21:19:54
「実行権限のないもののみを選び出す」意味がない。
もともと +x なファイルを chmod +x しても影響はない。
AIXで実行しようとしてるし、だとすると
宿題じゃなく、実務で必要なんだろ。
chmod +x で十分。
(ctimeは更新されるけど、そんなの普通関係ない)
113:名無しさん@お腹いっぱい。
07/02/21 21:23:34
>>110
えっと、こういうことでしょうか?
#!/bin/ksh
for filename in ${1:+$1/}* ; do
man test
man chmod
done
やってみましたが、なんか、ファイルの数だけマニュアルのようなものが表示され、
実行権限は付きませんでしたが、、
114:名無しさん@お腹いっぱい。
07/02/21 21:25:51
なんだ釣りか。
115:ksh
07/02/21 22:08:50
kshです。
#!/bin/ksh
for filename in ${1:+$1/}* ; do
if [[ -f $filename ]] ; then
chmod +x $filename
fi
done
なんとかディレクトリの中のファイルすべてに実行権限を付与できました。
これはシェルスクリプトと言うのでしょうか?
お恥ずかしながらシェルスクリプトとはなにか?イメージが完全でなく・・・
116:名無しさん@お腹いっぱい。
07/02/21 22:38:30
>>115
> kshです。
ペソじゃなかったのかw
117:ksh
07/02/21 22:53:27
あっペソです!!
ルールよくわかってなくてすみませんっw
118:名無しさん@お腹いっぱい。
07/02/25 06:28:13
>>102
単に興味本位で聞くけどsh-posixとkshを比較して
実際に機能として違う部分てどんなところがあるの?
119:名無しさん@お腹いっぱい。
07/02/26 18:34:31
すごく久しぶりに man tcsh してみたのだが。
あれ、"THE T IN TCSH" なんて項目、昔あったっけ?
turbo csh じゃないじゃん > 昔俺にそう教えた奴
120:名無しさん@お腹いっぱい。
07/02/26 18:41:12
Tenex CSHの略だと思っていたが、Tenex & Tops-20だったんだな。
121:名無しさん@お腹いっぱい。
07/02/27 00:44:41
TOPS-20 ねぇ。command line editing が欲しくてcshからtcshに移ったが、
それまでは、fep 使ってました。bash は、なじめんな。
今は、zsh 派です。
122:名無しさん@お腹いっぱい。
07/02/27 04:53:35
>>118
102とは別人だけど、kshはksh88とksh93で非常に違う。
とくに後者はperlに遜色ないほどの汎用言語になっている。
kshはbashと同じくshベースということで、
bashがkshから採り入れた機能もけっこうある。ローカル変数とか
123:名無しさん@お腹いっぱい。
07/02/27 17:22:33
>>119
え?違うんだ、知らなかった
124:名無しさん@お腹いっぱい。
07/02/27 22:13:24
kshといえばwkshで一度でいいから遊んでみたかった。
もうwのないkshしかないからなぁ・・・
125:名無しさん@お腹いっぱい。
07/02/27 22:45:55
viで編集中は日本語のメッセージが正しく表示されていたのですが、シェルスクリプトを実行するとメッセージが文字化けします。どうすればよいですか。
126:名無しさん@お腹いっぱい。
07/02/27 22:49:25
viが自動認識して処理してる?
nkf -e < script
nkf -j < script
nkf -s < script
nkf -w < script
で化けないパターンを探してそれに置き換える。
127:名無しさん@お腹いっぱい。
07/02/27 22:51:13
>>125
その vi の実体は、賢い vi で、
シェルの ENV がついていけてないとか。
128:名無しさん@お腹いっぱい。
07/02/28 00:25:54
Cシェル、Oracle10gで
exp ~ query\"where column_name in\( select col from tableB \) \"
みたくqueryパラメータで副照会できないようなんで
exp ~ query\"where column_name in\( $COLUMN_NAMES \) \"
なんて具合に変数を埋め込みたい。
シェル変数が展開されてからexportに渡されるようにする方法ないかな?
129:名無しさん@お腹いっぱい。
07/02/28 00:54:58
>>126
nkf -g が無いバージョンかな?
130:名無しさん@お腹いっぱい。
07/02/28 01:00:16
おお、そんなものが。
nkf -wができることに最近気づいたくらいアップデートしてなかったんで。
131:名無しさん@お腹いっぱい。
07/02/28 09:20:31
浜田マキ子って人のジャーナル見てみなよ。
中国の恐さにぞっとすること請け合い。
あいつら本気で日本を侵略する気だ。
そして、手下はやはり立命館?
132:118
07/03/01 04:39:27
>>122
すんません書き漏れです
知りたいのはsh-posixとksh88の機能差です
kshにksh88とksh93があってかなり違うってのは知ってるというか
kshの情報には大抵2つのバージョンの比較が併記されてるもんだし
ただsh-posixとksh88の比較は見たことがないし違いも見つけられなかったもんで
133:名無しさん@お腹いっぱい。
07/03/01 06:28:17
>>132
・ パターンマッチングがegrep相当に拡張
・ [[ ほげ ]] (中身をメタキャラ解釈しないtestのようなもの)
・ 配列が使えた
・ emacs風コマンドライン編集
ってとこか。なおksh93はksh88と挙動が違ったりバグが直されたりしてるし、
ksh88とpdkshでも機能に違いがあるので、
ksh88で動けば他のkshで動作するとは限らない
134:名無しさん@お腹いっぱい。
07/03/01 22:50:40
ksh に限らないが、バージョン依存の対応は本当に面倒だな。
135:名無しさん@お腹いっぱい。
07/03/02 00:10:52
こういうデータを、
----
yes
・・・・
・・・
・・・・・
IPアドレス xxx.xxx.xx.54
----
no
・・・・
・・・・・
IPアドレス xxx.xxx.xx.123
----
yes
・・・・・・・・・
・・・・・
IPアドレス xxx.xxx.xx.23
こういうふうに加工したいのですが、
yes,xxx.xxx.xx.54
no,xxx.xxx.xx.123
yes,xxx.xxx.xx.23
・・・・・・・・・
・・・・・
の部分は2行のときもあるし10行のときもあります。
136:135
07/03/02 00:14:33
最初の
----
と
IPアドレス
という文字をうまく関連付ければ
加工可能とは思うのですが、
具体的にどうしたらいいのかよくわかりません。
最初の
----
を見つけたら
その次の「IPアドレス」という文字列を捕まえて
xxx.xxx.xx.123を確保する、
という形でしょうか。
うまい方法があればヒントをいただけますか?
cat、more、grep、cut、sedなど一般的なコマンドは習得しています。
137:名無しさん@お腹いっぱい。
07/03/02 00:19:45
1行1レコードじゃないときは
めんどくさいから perl 使っちゃうな。
138:名無しさん@お腹いっぱい。
07/03/02 00:34:22
csplit input '/^----$/' '{*}'
for file in xx*; do echo `sed -n '2p;${s/.* //;p}' $file`; done
csplitってPOSIX標準だっけ?
139:名無しさん@お腹いっぱい。
07/03/02 00:34:30
俺もperlかawkに1票。適材適所ってやつ。
140:名無しさん@お腹いっぱい。
07/03/02 01:17:00
awkで RSに---を入れてやればいいじゃない
141:名無しさん@お腹いっぱい。
07/03/02 01:52:51
ここはあえてCで
142:名無しさん@お腹いっぱい。
07/03/02 02:52:27
>>141
書いてみて
143:名無しさん@お腹いっぱい。
07/03/02 08:40:46
>>135
俺も awk に一票だが、
最初と最後をどうにかすれば grep と sed だけでもできそう。
grep -C 1 -x -e ---- | sed ....
こんな感じで。
144:名無しさん@お腹いっぱい。
07/03/02 08:56:59
143 | sed -n '
N;
N;
N;
s/¥(yes¥|no¥)¥n/¥1 /;
s/----¥n//;
s/--¥n//;
s/IPアドレス //;
p'
改行ってどこのsedでも¥nと書けるのだっけ?
145:名無しさん@お腹いっぱい。
07/03/02 09:03:20
あー、最後の部分がきちんと処理できないな。
146:名無しさん@お腹いっぱい。
07/03/02 09:10:43
sed -n '
/¥(yes¥|no¥)/h;
/IPアドレス /{
H;
x;
s/¥(yes¥|no¥)¥n/¥1/;
s/IPアドレス /,/;
p
}' input
どだっ!?
147:135
07/03/02 13:43:23
みなさんありがとうございます。
僕はまだレベルが低いですし
awkは(難しくて)使えないので
>>143さんの
grep -C
オプションでやってみよと思います。
148:名無しさん@お腹いっぱい。
07/03/02 15:27:32
変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするにはどうすればいいですか。
149:名無しさん@お腹いっぱい。
07/03/02 15:32:33
>>148
ちょっと、質問が複数の意味に取れるけど、
ls > "$1"/"$2"
ってことか?
150:148
07/03/02 16:42:33
>>149 できたっす。バックスラッシュいれてたっす。
151:名無しさん@お腹いっぱい。
07/03/02 17:25:16
変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするときに、すでにファイルが存在する場合、上書き確認のメッセージを出して処理を分岐させるにはどうすればいいですか。
152:名無しさん@お腹いっぱい。
07/03/02 17:27:36
test -f ファイル
[ -f ファイル ]
153:名無しさん@お腹いっぱい。
07/03/02 18:47:44
その調子で、1から10まで全部ここで聞くのか?
154:名無しさん@お腹いっぱい。
07/03/02 19:02:57
シェルスクリプトの犬小屋でも作るか?
155:名無しさん@お腹いっぱい。
07/03/02 19:07:44
いらね。
156:名無しさん@お腹いっぱい。
07/03/02 21:48:30
>>152
便乗質問ですが、よく、ファイルがあるかどうかを判断するのに、
test -fを使えと言われるのですが、実行しても何も起こりません。
何か設定が必要なのでしょうか?
157:名無しさん@お腹いっぱい。
07/03/02 21:58:24
test -f hoge && echo found
158:名無しさん@お腹いっぱい。
07/03/02 22:18:29
「ファイルがあるかどうか」なら、test -fじゃなく、test -e使え。
test -fだとレギュラーファイル以外はないものと判定されるぞ。
(デバイスファイルとか、broken symlinkとか、socketとか)
159:名無しさん@お腹いっぱい。
07/03/02 22:36:23
>>158
だめーっ。Bourneではtest -eは使えなーい。test -fが定石。
160:名無しさん@お腹いっぱい。
07/03/02 22:40:52
if exist %1
161:名無しさん@お腹いっぱい。
07/03/02 23:04:59
>>156
何かが起こるように書けばいい。
test を実行しただけで何も起こらないのは当たり前。
162:名無しさん@お腹いっぱい。
07/03/02 23:15:29
Bourne Shellのif文で、ifの次に来るのはコマンド(列)
test...も [ ... ] もコマンドを実行してる。
実行した結果のステータスコードで分岐するだけ。
163:名無しさん@お腹いっぱい。
07/03/03 00:09:47
>>159
>>162の通り、testはシェルの内部コマンドではない。Bourneかどうかは関係ない。
まあそれはそれとして、autoconf infoの"Limitations of Builtins"から抜粋。
POSIXも信用せずにportableにしたいならどおぞ。
... use `test -f' or `test -r'. Do not use `test -x', because 4.3BSD
does not have it. Do not use `test -e' either, because Solaris 2.5
does not have it. To test for symbolic links on systems that have
them, use `test -h' rather than `test -L'; either form conforms to
POSIX 1003.1-2001, but older shells like Solaris 8 `/bin/sh' support
only `-h'.
164:名無しさん@お腹いっぱい。
07/03/03 00:37:34
うちのシェルでは内部コマンドなのだが。
165:162
07/03/03 01:05:35
>>164
そういえばそうか。シェルの実装はtestを内部コマンドとして定義しても
いいんだっけか。すまん間違えた。
166:名無しさん@お腹いっぱい。
07/03/03 01:21:37
testは外部コマンドだから条件分岐は出来るだけcaseを使おうって話を
どっかで聞いたことがあるけど、
UNIX黎明期を除けばどのシステムでもシェル組み込みコマンドとして実装されている。
ループで最頻出のコマンドが外部呼び出しじゃ実用的な速度が出ないだろうしね。
167:名無しさん@お腹いっぱい。
07/03/03 01:30:36
>>166
KernighanとPikeのUnix Programming Environmentにそういう記述があった希ガス。
UNIX第7版とかの時代の話だが。
168:名無しさん@お腹いっぱい。
07/03/03 07:57:52
162は俺なのだが……、俺は「外部コマンド」とは書いてないぞ。
169:163=165
07/03/03 11:51:37
>>168
すまん番号間違えた。
漏れは163と165だた
170:名無しさん@お腹いっぱい。
07/03/03 12:08:23
>>166
適当なループ回して試してみろ。
testが内部コマンドである現在のシェルでも、
case使った方が、if [ ... ] よりも若干速いよ。
おそらく、内部コマンドとはいえ、独立したコマンドとして
内部的に実行するオーバーヘッドがtestにはかかるんだろう。
caseの場合はシェル本体が直接解釈するから
オーバーヘッドはtestよりも少ないと。
171:名無しさん@お腹いっぱい。
07/03/03 14:06:00
>>170
釣りか天然か... 判断に苦しむ。
172:名無しさん@お腹いっぱい。
07/03/03 14:20:05
>>171
釣りじゃないだろ。実験してみろ。time sh -c '...' とかで計れる。
確かに caseの方がちょっと早い。
173:名無しさん@お腹いっぱい。
07/03/03 14:34:36
>>171
おかしなところがあるなら具体的に指摘してみればいいじゃない
174:名無しさん@お腹いっぱい。
07/03/03 14:37:35
だね。あと、zshだと何故か違いが顕著になる。
$ time zsh -c 'for i in `seq 1 10000`; do [ a = a ] && :; done'
real 0m3.051s
user 0m2.705s
sys 0m0.207s
$ time zsh -c 'for i in `seq 1 10000`; do case a in a);;esac; done'
real 0m0.915s
user 0m0.703s
sys 0m0.204s
↓おまけ。[ ]の代わりに [[ ]] にすると、内部コマンドじゃなく、
直接のシェル文法になるので、早くなる。
$ time zsh -c 'for i in `seq 1 10000`; do [[ a = a ]] && :; done'
real 0m1.708s
user 0m1.201s
sys 0m0.402s
175:名無しさん@お腹いっぱい。
07/03/03 15:41:12
>>173
おかしなところは推測の部分。単に実装の違いだけでしょ。
ksh(93)
case 0.65 real 0.46 user 0.17 sys
test 0.58 real 0.46 user 0.10 sys
pdksh
case 23.23 real 22.45 user 0.20 sys
test 4.96 real 4.74 user 0.14 sys
bash2
case 3.52 real 3.21 user 0.24 sys
test 4.26 real 3.93 user 0.25 sys
ash
case 0.38 real 0.28 user 0.09 sys
test 0.52 real 0.45 user 0.05 sys
176:名無しさん@お腹いっぱい。
07/03/03 17:55:22
>>175
その実装の違いを推測してるのではないか? なので、おかしくない。
ちなみに俺の環境では、kshでもtestよりcaseの方が速かったよ。
177:名無しさん@お腹いっぱい。
07/03/03 18:59:53
つまり、testよりcase使え、って言うテクは今でも生きてるってわけか。
178:名無しさん@お腹いっぱい。
07/03/03 20:43:22
bash3 [[
real 0m1.758s
user 0m1.562s
sys 0m0.160s
bash3 case
real 0m1.515s
user 0m1.341s
sys 0m0.150s
確かに少しだけど、case の方が速いね
179:名無しさん@お腹いっぱい。
07/03/03 20:53:55
>>178
いや、[[じゃなくて [ と caseを比較するという話だが。
速い順に、
case > [[ > [
となると思う。
180:名無しさん@お腹いっぱい。
07/03/03 21:13:01
>>179
あ、そうだったっけか。
bash3 [
real 0m2.388s
user 0m2.042s
sys 0m0.370s
181:名無しさん@お腹いっぱい。
07/03/04 21:32:58
Bashにおいて以下の条件で動くシェルスクリプトを書く場合、どのように書けばよいのでしょうか?
ディレクトリ名とその中にあるファイルサイズが0のファイル名を出力する。
補足1:ディレクトリが特定されていない場合は、現在シェルが働いているディレクトリ名を出力する。
補足2:もし引数がディレクトリ名でない場合は、すべてのコマンドラインの引数にエラーメッセージを出力する。
補足3:ファイル名の一番最初の文字が、「.」の場合は無視するようにする。
182:名無しさん@お腹いっぱい。
07/03/04 21:54:16
>>181
問題に曖昧なところがあるけど、こういうことか?
bashじゃなくてもB-sh共通で動く。
dir=${1-.}
if [ ! -d "$dir" ]; then
echo "$dir is not a directory" 1>&2
exit 1
fi
for f in "$dir"/*
do
if [ ! -s "$f" ]; then
echo "$f"
fi
done
183:名無しさん@お腹いっぱい。
07/03/04 21:55:25
「すべてのコマンドライン」の意味がちょっと判らないけど、
大体こんな感じじゃない?
usage() {
echo "Usage: ..." 1>&2
exit 1
}
test -d $1 && find $1 -not -name '\.*' -size 0 -print || usage()
ただし補足1はGNU findの機能を使ってるので、どのfindでもということなら
$1が空だった場合の扱いを自分でする必要がある。あと、「.」で始まる
フォルダは処理したいのなら、find の条件をもうちょっと詰める必要がある。
184:名無しさん@お腹いっぱい。
07/03/04 21:59:31
宿題にマジレスはご遠慮ください。本人のためになりません。
185:名無しさん@お腹いっぱい。
07/03/04 22:01:31
>>182
レスありがとうございます。
問題文は元々英語の為、変な訳になって細かい部分が伝わらず申し訳ありません。
英文ですが、元の問題はこちらです。URLリンク(user.ftth100.com)
186:181
07/03/04 22:21:53
>>183
分かりやすい解説付でありがとうございます。
この場合、
test -d $1(ディレクトリ名を引数1に格納)
&& find $1 -not -name '\.*' -size 0(ファイル名の頭文字が「.」、サイズが0の物をはじく)
-print || usage() (結果をusage()に返し、出力)
usage() で、正常ならば結果を出力。エラーならば1>&2が働きエラーを表示。そしてexitで終了。
といった感じでしょうか?
187:名無しさん@お腹いっぱい。
07/03/04 22:46:22
>>185
この問題って出所はどこなの?
188:181
07/03/04 23:16:28
>>187
Unix and Shell Programmingという洋書です。
189:名無しさん@お腹いっぱい。
07/03/04 23:23:20
>>184
>>181 のいう通りなので、後は自分で解読してみてください。
190:名無しさん@お腹いっぱい。
07/03/04 23:24:06
しまた、181 <-> 184 ね
191:名無しさん@お腹いっぱい。
07/03/05 14:36:49
>>186
短絡評価でぐぐれ
192:名無しさん@お腹いっぱい。
07/03/05 15:46:28
>>135
sed -n '/^[yn][eo]/p;s/^IPアドレス.//p' data.txt | fmt -w 18 | tr ' ' ,
193:192
07/03/05 15:55:14
ああ先頭が ne とか yo で始まる行があるとだめなので、
yes/no 個別に書くべきですね。
それとスペースを数えると正しくは fmt -w 19 だ ww
194:192
07/03/05 16:14:27
ああ、やっぱ駄目だ。
スレ汚し済まない。
195:名無しさん@お腹いっぱい。
07/03/05 16:49:38
>>135
perl -ne 'BEGIN { $/ = "----\n" } /(yes|no).*(\d+(?:\.\d+){3})/s && print "$1,$2\n"'
196:名無しさん@お腹いっぱい。
07/03/05 17:46:13
>>135
sed -f 135.sed
$ cat 135.sed
/^----/{N
s/^----\n//
x
d
b
}
/^IPアドレス /{
s/IPアドレス /,/
x
G
s/\n//
b
}
d
197:名無しさん@お腹いっぱい。
07/03/07 17:04:39
一連のアクションが3回実施され(割り込み重複なし)
一行ずつ一つのログファイルに延々と結果が記載されます。
100
ABC
101
200
DEF
201
…こんな感じで3行ずつが一連のアクションです。
これを以下のように整形したいのですが、妙案は有りますでしょうか?
100,ABC,101
200,DEF,201
ご教示いただければ幸いです。
198:名無しさん@お腹いっぱい。
07/03/07 17:29:18
>>197
sed 'N;N;s/¥n/,/g'
む、あたまに余計な空行が付くな。
199:名無しさん@お腹いっぱい。
07/03/07 17:31:06
ああ、勘違いだった。198でいいわ。
200:名無しさん@お腹いっぱい。
07/03/07 18:03:28
>>199
やっぱりsedを使うのかな?と思い本を見ていたところでした。
なるほどNで行数分読み込んで、改行\nを,に置き換える…。
見れば直ぐに解りますが、これを0から考えるのは大変でした。
今度は誰かに教えれるよう、頑張ります。
素早いご解答ありがとうございました!
201:名無しさん@お腹いっぱい。
07/03/08 12:24:02
どうしても分からないので教えてください。
利用者が指定した文字列の書いてあるファイルを読み込んで、
配列に文字列を一つずつ格納し、その文字列を順番に出力させたいのですが、
どのようにすれば良いのでしょうか?
202:名無しさん@お腹いっぱい。
07/03/08 12:32:35
>>201
どのシェルよ?
少なくともピュアBourneシェルには配列はない。
203:名無しさん@お腹いっぱい。
07/03/08 12:33:26
>>202
申し訳ありません。bashです。
204:名無しさん@お腹いっぱい。
07/03/08 12:37:11
>>201
tr ' ' '¥012' < ユーザーが指定したファイル | sort
という意味?
指定したファイルの中はどんな構造なの?
1行に1語なのか、フリーテキストか。
205:名無しさん@お腹いっぱい。
07/03/08 12:40:27
>>204
指定したファイルは、おっしゃる通り、1行1語のテキストファイルです。
Sapporo
Tokyo
Osaka
Nagoya
Fukuoka
といった感じです。
単純に中身を表示するだけなら、
echo -n "ファイル名を入力してください:"
read x
cat $x
でよいと思われるのですが、一度配列に全文字列を格納してやるので困っています…。
206:名無しさん@お腹いっぱい。
07/03/08 12:46:39
言ってる意味が分からん。
sort そのファイル
とするのとは違うの?
207:名無しさん@お腹いっぱい。
07/03/08 12:55:10
>>206
sort ファイル とは違い、この場合だと、
array[0]=Sapporo
array[1]=Tokyo
array[2]=Osaka
array[3]=Nagoya
array[4]=Fukuoka
i=0
while [$1 -le 5]
do
echo ${array[$i]}
let i=$i+1
done
読み込んだテキストファイルをこのような感じで出力させたいです。
208:名無しさん@お腹いっぱい。
07/03/08 12:58:49
宿題は自分でやりましょう。
209:名無しさん@お腹いっぱい。
07/03/08 13:05:51
>>201
シェルスクリプトじゃなきゃいかんの?
perlかなんか使った方が楽じゃない?
210:名無しさん@お腹いっぱい。
07/03/08 13:12:43
とりあえず、「順番に」が読んだ順にという意味であって
「整列させて」という意味ではないことは理解した。
211:名無しさん@お腹いっぱい。
07/03/08 13:16:34
while read word; do
words=($words $word)
done < 指定したファイル
してあとは一緒。
212:名無しさん@お腹いっぱい。
07/03/08 13:43:20
>>209
perlじゃ駄目なんです。
>>211
echo -n "ファイル名を入力してください:"
while read word; do
words=($words $word)
done < $word
という事でしょうか?
213:名無しさん@お腹いっぱい。
07/03/08 14:02:36
違う。
214:名無しさん@お腹いっぱい。
07/03/08 14:07:43
>>213
すいません・・・
どうやれば良いのでしょうか?
215:名無しさん@お腹いっぱい。
07/03/08 14:10:26
<の後ろに書くのは、>>207のx
echo -n "ファイル名を入力してください:"
read source
while ....
done < $source
あとは出力のためのループ
216:名無しさん@お腹いっぱい。
07/03/08 14:52:24
>>215
echo -n "ファイル名を入力してください:"
read source
while read word; do
words=($words $word)
done < $source
cat $source | while read
do
echo $words
let source=$source+1
done
でやってみましたが、テキストの最初の文字列しか表示されません。
後半の出力ループがいけないのでしょうか?
217:名無しさん@お腹いっぱい。
07/03/08 15:06:49
ああ、ごめん、bashじゃなくzshでやってたわ。
218:名無しさん@お腹いっぱい。
07/03/08 15:12:44
bashで配列にpushする方法がわからん。
代わりに一パラメータで逃げてみた。
while read word; do
set -- $* $word
done < $source
for word in $*; do
echo $word
done
219:名無しさん@お腹いっぱい。
07/03/08 15:18:07
訂正
×一パラメータ
○位置パラメータ
あんど、こう書くらしい。
while read word; do
size=${#words[@]}
words[$size]=$word
done < $source
for word in ${words[@]}; do
echo $word
done
220:名無しさん@お腹いっぱい。
07/03/08 15:24:40
bash限定スクリプトは、以降はこちらへ
↓
スレリンク(linux板)
ここはBourneのみでよろしこ。
221:名無しさん@お腹いっぱい。
07/03/08 15:49:17
>>219
動作確認出来ました。本当にありがとうございました。
>>220
誘導ありがとうございます。
スレ違いで申し訳ありませんでした。
222:名無しさん@お腹いっぱい。
07/03/08 15:53:31
shです
教えてください
#!/bin/sh
COUNTER=0
while [ $COUNTER -lt 100 ]; do
mv "$COUNTER".jpg /home/more/
let COUNTER=COUNTER+1
done
こんな感じのとき最初の10までが1桁になってしまうのですが
01 02 03,,,,
行頭に0を付けた2桁で処理するのはどうすれば良いのでしょうか?
00-09と10-99でループをわけるしか無いのでしょうか?
223:名無しさん@お腹いっぱい。
07/03/08 15:59:51
最近の環境ならprintf外部コマンドがあるんじゃない?
mv `printf %02d $COUNTER`.jpg /home/more
なければ
mv `echo "0$COUNTER" | sed 's/0*¥(..¥)$/¥1/'`.jpg /home/more
とか、
mv `echo "0$COUNTER" | rev | cut -b1,2 | rev` /home/more
とか。
224:名無しさん@お腹いっぱい。
07/03/08 16:09:12
>>222
for COUNTER in `seq -w 0 99`; do : ...; done
↑でループすれば桶。
あと、letコマンドは純粋な shには無いぞ。
225:名無しさん@お腹いっぱい。
07/03/08 16:11:22
ただ、>>222 がやっていることをやるだけなら、
そもそもループすら不要で、
mv [0-9][0-9].jpg /home/more
だけで一発。シェルは不要。
226:名無しさん@お腹いっぱい。
07/03/08 16:11:48
seqもあったりなかったり
227:名無しさん@お腹いっぱい。
07/03/08 16:12:07
>>223
ありがとうございました。
最終行でうまくいきました。
上の2個も含め手法を理解するように勉強してみます
228:名無しさん@お腹いっぱい。
07/03/08 16:15:29
(たとえば) [0-9][0-9] を展開しているのはシェルですぅ
ので不要じゃないわよ>>225
229:名無しさん@お腹いっぱい。
07/03/08 16:16:49
>>228
お約束どおり釣れましたよ。おめでとう。
230:名無しさん@お腹いっぱい。
07/03/08 16:18:58
>>224-226
ありがとう。
実際にはdateから自動生成された莫大な
画像データを部分的に抽出しながら動画生成を
行うので
例に出したのより多少複雑に書き直します
seqも実験してみます
231:名無しさん@お腹いっぱい。
07/03/08 16:20:11
touch [0-9][0-9].txt
[root@localhost /tmp]$ ls
[0-9][0-9].txt
となります。
00.txtから99.txtを作りたいのですが…
232:名無しさん@お腹いっぱい。
07/03/08 16:20:18
BSDだとseqの代わりにjotだったかな。
233:名無しさん@お腹いっぱい。
07/03/08 16:23:11
zsh があるなら
zsh -c 'touch {00..99}.txt'
とか
234:名無しさん@お腹いっぱい。
07/03/08 16:26:04
231は空のディレクトリで touch *.txt やったときに
どういう結果になってほしいんだろう。
235:名無しさん@お腹いっぱい。
07/03/08 16:27:16
zsh -c 'touch {00..99}.txt'
は、書かれてしまったから
touch `seq -s ".txt " -w 99"`.txt
236:名無しさん@お腹いっぱい。
07/03/08 16:27:59
シェルってゆうな。クズ。
237:名無しさん@お腹いっぱい。
07/03/08 16:28:49
>>234
00.txtから連番で99.txtまでのファイルが欲しいんでしょ
238:名無しさん@お腹いっぱい。
07/03/08 16:30:36
>>236
いつものお約束も釣れましたよ。おめでとう。
239:名無しさん@お腹いっぱい。
07/03/08 16:31:17
シェルっていうな
240:名無しさん@お腹いっぱい。
07/03/08 16:35:08
>>233 >>235
ありがとうございました!
zshって凄いですね。
でも、それに依存しないよう
>>235さんの方法を覚えます。
241:名無しさん@お腹いっぱい。
07/03/08 16:38:39
>>223 のprintf以外の方法だとちょっと無駄。
exprを使うのが定石。
expr 0$COUNTER : '.*\(..\)'
242:名無しさん@お腹いっぱい。
07/03/08 16:40:10
seqもない場合があるけどね
243:名無しさん@お腹いっぱい。
07/03/08 16:43:23
>>235 の seq、間違ってるよ。最後の .txtが余分なのと、"が1個余分。
244:名無しさん@お腹いっぱい。
07/03/08 16:46:42
>>235 よりも、
seq -f %02g.txt 0 99
の方がエレガント。
245:名無しさん@お腹いっぱい。
07/03/08 16:53:02
>>243
-sは間に挟む文字列だから最後の.txtがないと、
00.txt ... 98.txt 99 で終わってしまうぞ。
でも正解は>>244。
246:名無しさん@お腹いっぱい。
07/03/08 16:57:54
>>244
確かにこっちなら完璧に出来ますね。
ところで %02g と言うのは何なんでしょうか?
247:名無しさん@お腹いっぱい。
07/03/08 17:06:19
>>246
man seq
つーか
man 3 printf
248:201
07/03/08 18:43:31
>>219
最後にもうひとつだけ質問させてください。
出力をする時に配列の反対(リバースオーダー)から出力をするのはどうやれば良いのでしょうか?
例えば、
Tokyo
Osaka
Nagoya
とあったら
Nagoya
Osaka
Tokyo
と出力されます。
249:名無しさん@お腹いっぱい。
07/03/08 18:46:19
>>248
tac
250:名無しさん@お腹いっぱい。
07/03/08 18:51:21
for ...
done | tac
のようにパイプすればいいのではないでしょうか。
tacがない環境では、
for ...
done | sed '1!G;h;$!d'
251:201
07/03/08 19:14:20
ありがとうございました。
これでなんとか単位が取れます
252:名無しさん@お腹いっぱい。
07/03/08 19:25:38
はぁ? 単位?? 宿題禁止なわけだが、、答えて損した、、
253:名無しさん@お腹いっぱい。
07/03/08 19:46:30
上で指摘されてるのに気付けよ
254:名無しさん@お腹いっぱい。
07/03/09 00:33:46
ファイルを1行ずつ読み込んで配列に入れたいとおもってまつ。
↓みたいに書いてみたのですがエラーでちゃいます。なぜ??
#!/bin/csh
set ALLCOUNT = 5
@ CT = 1
@ NO = 3
@ CN = ""
while ( $NO <= $ALLCOUNT )
set CN[$CT] = `sed -n "$NO p " job.txt
@ CT ++
@ NO ++
end
255:名無しさん@お腹いっぱい。
07/03/09 01:11:36
シェルスクリプトでは、sh だろうと csh だろうと、
配列を使おうと思った時点で負け。別の方法を探すべし。
256:名無しさん@お腹いっぱい。
07/03/09 01:17:09
>>254
>>201と同じ学校の人?
257:名無しさん@お腹いっぱい。
07/03/09 01:19:14
>255
ダメっぽ?
>256
いや趣味
258:名無しさん@お腹いっぱい。
07/03/09 07:50:56
cshの時点で負け。
それが宿題だとすると、そんな教官がいるような学校に
進学した時点で負け。
259:名無しさん@お腹いっぱい。
07/03/09 07:52:39
思考停止論か
260:名無しさん@お腹いっぱい。
07/03/09 07:54:46
宿題で「cshで書け」と指定されている場合以外に、
cshで書かなければいけない合理的な理由は存在しない。
趣味なら自分で研究すること。
261:名無しさん@お腹いっぱい。
07/03/09 17:07:47
シェルスクリプトならファイルが配列ってことで
262:名無しさん@お腹いっぱい。
07/03/09 19:22:22
インデックスによるアクセスが必要ならポジションパラメータ使うだろ。普通。
263:名無しさん@お腹いっぱい。
07/03/09 21:47:41
配列も、位置パラメータも
所詮人間がデータ構造を解釈しているだけの話。
264:名無しさん@お腹いっぱい。
07/03/10 21:31:59
201が宿題やったせいで254も宿題思われてるのかw
というより口だけで実は分からないだけですかおまいら。
265:名無しさん@お腹いっぱい。
07/03/10 21:37:01
>>264
宿題かどうかが問題なんじゃなくて、cshのスクリプトは論外ということ。
誰も答えるはずがない。
266:名無しさん@お腹いっぱい。
07/03/10 21:44:39
自演乙
267:名無しさん@お腹いっぱい。
07/03/10 21:45:26
/ / ,. -'"´ `丶、、 ヽ
__l // / | \ \\ ゙、 / ̄ ̄ ̄ ̄ ̄ ̄
/ :::|| / / / l l ヽ ヽヽド、 /
l::::::::::|| / / / ! l ヽ ヽ ヽヽ ||:::::ヽ | l 十`` 十_ヽ
斤.::::::::||/ / //! ハ l ! ヽ ', ゙ヽ||::::::::勺 | レ d、 (_| _)
|ll|i :::::::|| l l イ l /!l | ヽ ト、|、 ト、 l l、||::::::::}ll| | ┼‐、ヽ ┴┴
|ll|ヽ:::::|l !l |l!‐!‐ト、l ヽ | l | ヽ | l i l l||:::::::/!l| | ノ 月 l |
|lll| `ー! l | l 」-=ミ|`ヽ ヽ | !-‐!‐|-l、|} l |r、〃|ll| | 二二`` l__ヽ
L!l | l | 〃{ノ::::iヾ ヽ! ,. =-ミ、!ハ l !"´ |ll| | ノ _)
{l |!l | ヽ `ー" ' トイ:::}ヾ | l | |ll」 | ─ァ
ヽ |l !| `二ノ '| || | /\
l |', | /)|l l | ┼‐、ヽ
l | ゙、 ` ´ /-イ| l | ノ
!| \ ヽニヽ , ′/゙! l ∠ '⌒)
| |ヽ、 ー / 〃 | ! | 「
,.rr| 丶、 ,.. '´ト、 l′ ヽ ゚
l::l {:| ` ´ |::}} \______
_. -‐1::ヽ' -、 _,.. -‐ン::|ヽ、
_.. -‐ "´ |:::::::::`ゝヽ /rJ::'"´:::::::! ` 丶、
268:名無しさん@お腹いっぱい。
07/03/10 21:52:54
だいたい木曜辺りに宿題が出るのか?
269:名無しさん@お腹いっぱい。
07/03/10 22:04:01
宿題は2chでやってもらうのが当たり前です。
270:名無しさん@お腹いっぱい。
07/03/10 22:11:17
逆に、宿題を出す立場の人間です。
毎回、問題を出すのにネタが尽き気味で大変です。
宿題が出た人、どんどんその問題を書き込んでください。
一部変えて出題に使わせていただきます。
271:名無しさん@お腹いっぱい。
07/03/10 22:19:47
2ちゃんを使わせない方法
272:名無しさん@お腹いっぱい。
07/03/10 22:29:26
>>270
分かった。
うちで使うスクリプトを問題として出してやる。
273:名無しさん@お腹いっぱい。
07/03/12 10:34:35
>>270
tacをシェルスクリプトで書かせる。
274:名無しさん@お腹いっぱい。
07/03/12 10:47:03
>>273
そういえば、まだ bash の回答がない。
URLリンク(golf.shinh.org)
この問題にかぎらず、sh で参戦してる人が少ないのでおまいらもやってみてくれ。
おれもがんばってみる。
275:名無しさん@お腹いっぱい。
07/03/12 17:31:24
sedの解が出てるんだからそれを呼べばよいのでは。
何も無理してshだけで文字列操作するこたーないと思うけど。
#!/bin/sh
f () { local l; read -r l && { f; echo "$l"; }; }
f
276:名無しさん@お腹いっぱい。
07/03/12 18:28:56
>>275
readの -r オプションはbash依存。localコマンドは Bourneで使えない。
あと、再帰呼出しは重い。非再帰版の方がエレガント。
出題ネタにしたいので、回答は省略。
277:名無しさん@お腹いっぱい。
07/03/12 18:44:38
#! /bin/sh
txt=
IFS='
'
while read line
do
txt="${line}
${txt}"
done
echo -n "$txt"
278:名無しさん@お腹いっぱい。
07/03/12 19:10:00
>>276
CodeGolfが出ちゃったからbashism上等の答えになったんだと思う。
279:名無しさん@お腹いっぱい。
07/03/12 19:18:19
localはどうか忘れたがread -rはPOSIXにもあったんじゃないか?
280:名無しさん@お腹いっぱい。
07/03/13 01:40:57
そーすpls
281:名無しさん@お腹いっぱい。
07/03/13 02:44:26
>>280
>>3
> POSIX: Shell & Utilities (標準規格)
> URLリンク(www.opengroup.org)
282:名無しさん@お腹いっぱい。
07/03/13 09:45:19
URLリンク(www.opengroup.org)
なるほどね
283:名無しさん@お腹いっぱい。
07/03/13 20:53:58
awkについて質問します。
single quotation mark("'")をエスケープしたいのですが、
次のコードは×となります。
どなたか、どうやって、"'"をエスケープするのか
教えていただけますか?
たとえば、
awk '{printf "\'%s\'", $2}' file
として、
$2フィールドの値を
'AX'
'PY'
'CU'
のように''で囲みたいのです。
284:名無しさん@お腹いっぱい。
07/03/13 20:57:48
シェルレベルで '...' と ¥' からなる並びに見えるようにする。
'{printf "'
¥'
'%s'
¥'
'¥n", $2}'
見やすいように改行入れてみたが実際にはくっつけて記述。
285:名無しさん@お腹いっぱい。
07/03/13 21:15:45
>>284
できました!
ありがとう。
なんでできるのか、もう少し詳しく
教えていただけないでしょうか?
286:名無しさん@お腹いっぱい。
07/03/13 21:48:08
awk に渡したい文字列を分解するだけだよ。
シェルの解釈する文字をエスケープしながらね。
だから、
'{printf "'"'%s'"'\n", $1}'
などでもいい。
287:名無しさん@お腹いっぱい。
07/03/13 21:49:44
$1じゃなくて$2だったか
288:名無しさん@お腹いっぱい。
07/03/13 22:15:15
wgetの実行結果をファイルに書き込みしたいんですけど
wget アドレス >>ファイル名
で実行して失敗しました。
どうしたらいいかわかりますか?
289:名無しさん@お腹いっぱい。
07/03/13 22:19:00
わかりますよ。
290:名無しさん@お腹いっぱい。
07/03/13 22:25:01
wget --help
291:名無しさん@お腹いっぱい。
07/03/14 17:16:17
テキストファイルのある行が2chのdat形式かどうかを
正しく判別するにはどうすればいいでしょうか?
grep -E ".*<>.*<>[0-9]+/[0-9]+/[0-9].* [0-9:.]+ ID:[a-zA-Z0-9+-/]+<>.*<>.*"
こんな感じでひっかけようと思ったのですが、
何かの間違いでメール欄やレス欄に <> が
まぎれこんでしまってる場合でもマッチしてしまいます。
やりたいことは、このようなゴミのまじった行を削除することなのですが
どうするのがよいでしょうか?
292:名無しさん@お腹いっぱい。
07/03/14 18:47:38
あ、しまった。
293:名無しさん@お腹いっぱい。
07/03/14 21:33:18
> ゴミのまじった行を削除する
全部捨てたらいいんじゃないか。
294:名無しさん@お腹いっぱい。
07/03/14 22:54:48
無理にシェルで書かんでもいいんでは。
295:名無しさん@お腹いっぱい。
07/03/14 23:24:19
>>288
-O
296:名無しさん@お腹いっぱい。
07/03/15 03:28:47
>>270
宿題にするな。テストにしとけ。
297:名無しさん@お腹いっぱい。
07/03/15 09:45:11
ペーパーテストで一発完動のスクリプトかける奴なら即戦力だな。
298:名無しさん@お腹いっぱい。
07/03/15 23:41:20
ShellScriptの中でscpとsshを使用しようと思っているのですが
普通に構文を書くとパスワード入力等を求められると思うのですが
手動入力でなく、完全自動化にできないでしょうか?
Shellは「sh」です。
OSはRedhatです
299:名無しさん@お腹いっぱい。
07/03/15 23:42:09
>>298
ssh-agent
300:名無しさん@お腹いっぱい。
07/03/15 23:53:17
ssh-agent を使用するしか方法はないですか?
他のプログラムとかの絡みで使用できるか・・・・
301:名無しさん@お腹いっぱい。
07/03/16 00:12:20
リモートの.ssh/authorized_keyにローカルの公開鍵を書いとく
302:名無しさん@お腹いっぱい。
07/03/16 00:13:16
>>298
板違い。
【sed】シェルスクリプト総合@LINUX Part2【awk】
スレリンク(linux板)
むしろこっちか。
くだらねえ質問はここに書き込め! Part 142
スレリンク(linux板)
303:名無しさん@お腹いっぱい。
07/03/16 07:56:47
>>300
ssh-agentを知ってるなら質問するなよ!
304:名無しさん@お腹いっぱい。
07/03/16 08:32:48
自分の鍵を暗号化しないでおくというのはどうだろう
305:名無しさん@お腹いっぱい。
07/03/16 08:33:30
パスフレーズを空にする。
ただし、秘密鍵を盗まれないように。
306:名無しさん@お腹いっぱい。
07/03/16 10:28:23
ssh-keychain は?
307:306
07/03/16 10:30:13
gentoo が作ってるやつな
URLリンク(www.gentoo.org)
308:名無しさん@お腹いっぱい。
07/03/16 22:01:18
>>298
expect
309:名無しさん@お腹いっぱい。
07/03/16 22:13:13
困ったときは~expect
310:名無しさん@お腹いっぱい。
07/03/18 18:56:13
expectって標準ではいってたっけ?
311:名無しさん@お腹いっぱい。
07/03/18 22:20:49
なんの標準だかわからんけど
入ってないなら入れればいいじゃん。
312:名無しさん@お腹いっぱい。
07/03/18 23:45:58
>>310
お馬鹿さん?
313:名無しさん@お腹いっぱい。
07/03/20 00:15:56
仕事の場合、そうホイホイと入れるわけにはいかないんだな
314:名無しさん@お腹いっぱい。
07/03/20 00:34:23
じゃあしかたないな
315:名無しさん@お腹いっぱい。
07/03/20 00:46:09
必要ないものはホイホイ入れられないだろうが
必要あるなら入れなきゃいかんだろ。
316:名無しさん@お腹いっぱい。
07/03/21 00:06:29
あたらしい言語処理系が入るというと嫌がられそうだから、
perlの小さなライブラリを追加といってExpect.pmでよくない?
かなりプログラム臭くなるのでexpectに比べてはいけないが、次善の策ではあるはず。
317:名無しさん@お腹いっぱい。
07/03/21 01:28:07
なんでexpect入れる話になってんだ
318:名無しさん@お腹いっぱい。
07/03/21 01:51:29
今回は>>298からの流れ
319:名無しさん@お腹いっぱい。
07/03/21 02:25:07
telnetならexpect使うのがいいだろうけど、sshとscpならパスなしのkeyを使うのが無難だと思うけどな。
パスなしでログインできるのが怖いなら、authorized_keysにcommandを書いて、できることを限定しておくといいよ。
スレ違いだったらすまん。
320:名無しさん@お腹いっぱい。
07/03/28 01:47:01
sedで、最後の行から逆順に文字列検索していって、1件目を出力して終わらせることできるかな?
321:名無しさん@お腹いっぱい。
07/03/28 02:04:06
cat hoge.txt | grep ほげ | tail -1
322:名無しさん@お腹いっぱい。
07/03/28 02:30:58
>>320
awkでやれ
awk '{line[NR]=$0}END{for(i=NR;i>0;i--){if(line[i]=="検索パターン") print line[i];}}' input.txt
323:名無しさん@お腹いっぱい。
07/03/28 02:50:52
tac filename | sed -n '/hoge/{p;q;}'
324:名無しさん@お腹いっぱい。
07/03/29 16:52:36
二つのテキストファイルA.txtとB.txtがあります。
行数は同じでそれぞれの行が関係のある物になっています。
現在、その二つの行をそれぞれスペースで区切って接続を行いたく考えています。
A.txt
山田
山下
B.txt
太郎
二郎
AB.txt
山田 太郎
山下 二郎
A.txtとB.txtからAB.txtを作成する妙案などございましたらご教示いただけませんでしょうか?
よろしくお願い致します。
325:名無しさん@お腹いっぱい。
07/03/29 16:56:53
>>324
paste A.txt B.txt > AB.txt
326:名無しさん@お腹いっぱい。
07/03/29 17:09:44
>>325
PASTE(1)
名前
paste - ファイルを行単位でマージする
大変失礼いたしました…orz
シェルスクリプトとかそう言うレベルで無かったことをお許し下さい…。
327:名無しさん@お腹いっぱい。
07/03/30 09:37:33
b.txt の内容で
幸子の場合、a.txtが山田となっていたら
里中に変更する。という条件付きくらいにしとけば
スクリプトでしなきゃいかんけどな。
328:名無しさん@お腹いっぱい。
07/03/30 15:20:07
~/.forwardに記述して、メールを標準入力から読み込んで
そのenvelope Fromを、実データのFromに置換して/usr/bin/vacation
に渡すスクリプトを書きたいのですが・・・
sed -n 's/^From: [^<]*<\([^>]*\).*/\1/p'の内容を覚えさせておいて、
もう一度先頭から読み込んで置換すればよいと思いますが、
その方法がわからないのです。
微妙な内容なのでググるためのキーワードもいまいちで、ヒットしません。
別にsedでなくてpealやawkでもよいのですが、何かいい方法はありますでしょうか?
329:名無しさん@お腹いっぱい。
07/03/30 15:26:46
>>328
そのまま
・覚えさせる->ファイルに書く
・もう一度先頭から読み込んで置換する->そうする
でいいんじゃないの?
330:名無しさん@お腹いっぱい。
07/03/30 16:01:32
URLが一行ずつずらーと並んでいるのですが
頭とケツにそれぞれ「”」を付けたいです。
何か良い方法は有りませんでしょうか?
331:名無しさん@お腹いっぱい。
07/03/30 16:08:36
sed 's/^/”/' | sed 's/$/”/'
332:名無しさん@お腹いっぱい。
07/03/30 16:17:30
>>331
パイプが無駄。一発でできる。
sed 's/\(.*\)/"\1"/'
333:名無しさん@お腹いっぱい。
07/03/30 16:24:13
pealのようなもの
334:328
07/03/30 16:31:53
>>329
難しく考えずに、そうすることにします。
335:名無しさん@お腹いっぱい。
07/03/30 16:44:44
>>331-332
ありがとうございます。
頑張ってsed覚えます。
336:328
07/03/30 17:10:27
>>334
と思ったら、メール出力から起動されるプログラムは
きわめて弱い実行権限(nobody)しかないので、/tmpにさえ
ファイルを作れません。(人間がテストしたときは巧くいきましたが・・)
権限を強めればセキュリティーリスクが増大するし、
やはり、スクリプトの中で記録と標準入力の再読み込みが必要な模様です。
まあ記録は置換文字列に変数を使えることが判ったので何とかなりそうですが、
「初めからもう一度実行」が途方に暮れてしまいますね。
何かよい方法ありますでしょうか?
337:名無しさん@お腹いっぱい。
07/03/30 17:14:32
・nobody でも /tmp に書ける。
・そもそも sendmail でも postfix でも .forward のファイル所有者と
同じ権限でプログラムが起動する。nobody にはならない。
338:328
07/03/30 18:36:24
>>337
なるほど
では、ほかの原因を考察して見ます。
ありがとうございます。
339:名無しさん@お腹いっぱい。
07/03/30 22:30:53
>>335
sed 's/.*/"&"/'
でもいいな。
340:名無しさん@お腹いっぱい。
07/03/30 23:05:57
>>335
正規表現は使わない方が速いかな。
awkで、
awk '{print "\""$0"\""}'
341:名無しさん@お腹いっぱい。
07/04/03 01:43:34
awkのsystem関数に与えるコマンド文字列の中で「"」や「'」って使える?
「\」を前に置いても駄目でした…
342:名無しさん@お腹いっぱい。
07/04/03 02:26:06
>>341
system が起動しているシェルに食われたんじゃね?
343:名無しさん@お腹いっぱい。
07/04/04 00:17:45
>>342
例えばこんな感じ。実際はこんなシンプルじゃないけど。
awk '{system("grep \"^$\" $1")}' input.file
systemが食われたのか、systemの引数の中では引用符が使えないのか、切り分けができません。
344:名無しさん@お腹いっぱい。
07/04/04 00:26:48
>>343の例だと$1に何も入らないから、とか?
345:名無しさん@お腹いっぱい。
07/04/04 01:00:44
>>344
あそっか、$1は""の外でした。。
awk '{system("grep \"^$\" "$1)}' input.file
本物は業務で使う予定だからコピペできないんだよね。
346:名無しさん@お腹いっぱい。
07/04/07 02:11:04
find /日本/関東/女/ mtime +7300でリダイレクトしたら彼女が出来た
347:名無しさん@お腹いっぱい。
07/04/08 22:55:59
>>345
ちゃんと伝わっていなかったようで。
awkの中にシェルの変数の$1入れてもawkがもっていっちゃうからダメなんだって。
348:名無しさん@お腹いっぱい。
07/04/09 22:22:34
>>347
そうか?普通に↓とか使えてるぞ?
awk '{sum[substr($0,a,b)]+=substr($0,c,d);}END{for(n in sum)print n,sum[n];}' input.txt
349:名無しさん@お腹いっぱい。
07/04/10 20:40:57
なんかかみ合わないんだけど、
>>343や>>345の例だと、$1をシェルがもっていっちゃって動かないだろうから、
本来やりたいことである
>awkのsystem関数に与えるコマンド文字列の中で「"」や「'」って使える?
の問題とは違ったところでハマっているでしょ、ってことを書いただけなんだけど。
($1にはinput.txtを入れたいのだろうと推測)
それに対して、$数字は awkで使用できるよ、と書かれても困っちゃうんだが。
350:名無しさん@お腹いっぱい。
07/04/11 06:22:32
>>349
言いたいだろうことは理解するが、347がそれが伝わる書き方とは思えなかったぞ。
例えば、何を誰がもっていっちゃうと書いたか、347と349を比較してみ。
351:名無しさん@お腹いっぱい。
07/04/13 00:00:33
ふいんき(なぜか略)を悪くしたようで正直スマンカッタ
352:名無しさん@お腹いっぱい。
07/04/13 01:37:02
awkは読み込んだレコード全体を$0で参照できて、
フィールドセパレータ(デフォルト空白文字)で区切られたn番目のフィールドを
$nで参照できるんだよな。
awk '{system("grep \"^$\" "$1)}' input.file
で$1はinput.fileから読み込んだカレントレコードの1番目のフィールドを
参照すると。
$数字がawkで使えるのは良いとして結局"や'は
system関数の引数の中で使えるのかどうか?
353:名無しさん@お腹いっぱい。
07/04/13 16:02:04
DebianとFreeBSDを使っていて、共通の.bashrcを参照しているのですが
Debianを使っているときにはUTF-8を、
FreeBSDを使っているときにはEUC-JPを
環境変数LANGに設定するようにしたいのですが
どのようにコードをかけばよいのでしょうか?
354:名無しさん@お腹いっぱい。
07/04/13 16:07:45
>>353
uname とか hostname あたり見るとか。
355:353
07/04/13 16:42:04
>>354
unameとif文を使えばできると思うんですけど
それでsourceコマンドを実行したときに
ちゃんとわりあたるかどうか・・・
356:名無しさん@お腹いっぱい。
07/04/13 16:54:07
>>355
おいおい、sourceなんて使わないよ。
あと、ifじゃなくてcaseを使うのが定石。
case `uname -s` in
Linux) export LANG=ja_JP.UTF-8;;
FreeBSD) export LANG=ja_JP.eucJP;;
esac
357:名無しさん@お腹いっぱい。
07/04/13 16:55:19
別に if 使ってもいいと思うけど、
なんで source が出てくるのかよくわからん。
358:名無しさん@お腹いっぱい。
07/04/15 15:34:49
>>356
Cとかだとswtichは敬遠される傾向にあるけどな。
359:名無しさん@お腹いっぱい。
07/04/15 17:19:24
お前の周りだけだろ。
360:名無しさん@お腹いっぱい。
07/04/15 17:33:16
ifを使うとすると、
if [ `uname -s` = Linux ]; then
export LANG=ja_JP.UTF-8
elif [ `uname -s` = FreeBSD ]; then
export LANG=ja_JP.eucJP
fi
となって、unameの実行が2回になって無駄になる。
かと言ってunameを1回にしようとすると、
tmp=`uname -s`
if [ $tmp = Linux ]; then
export LANG=ja_JP.UTF-8
elif [ $tmp = FreeBSD ]; then
export LANG=ja_JP.eucJP
fi
となって、シェル変数1つが余分に要るので美しくない。
よって、caseを使うのがモストエレガント。
361:名無しさん@お腹いっぱい。
07/04/15 17:37:03
>>360
お前の美学はよくわかった。
362:名無しさん@お腹いっぱい。
07/04/15 17:41:22
で、source はなんで出てきたんだ?
363:名無しさん@お腹いっぱい。
07/04/16 19:45:58
そうっすねぇ…。
364:名無しさん@お腹いっぱい。
07/04/16 19:58:24
審議せずに却下
365:名無しさん@お腹いっぱい。
07/04/16 20:37:02
sh にそんなコマンドがないからか?
366:名無しさん@お腹いっぱい。
07/04/16 22:11:51
.があるじゃん。
367:名無しさん@お腹いっぱい。
07/04/16 22:42:57
. はあるけど source はないってオチなのかなと。
368:名無しさん@お腹いっぱい。
07/04/16 23:46:40
source がない sh ってたとえばどれ?
369:名無しさん@お腹いっぱい。
07/04/16 23:52:07
J
370:名無しさん@お腹いっぱい。
07/04/17 00:16:38
>>368
sh
371:名無しさん@お腹いっぱい。
07/04/17 00:41:10
>>370
どの OS の?
372:名無しさん@お腹いっぱい。
07/04/17 00:47:25
>>371
普通のbshなら.しか使えない。
HP-UXやAIXのshは中身がkshなんで。
373:名無しさん@お腹いっぱい。
07/04/21 02:11:17
zsh 4.3.4登場 - マルチバイト文字の対応を強化
URLリンク(journal.mycom.co.jp)
374:名無しさん@お腹いっぱい。
07/04/24 14:20:37
/bin/zsh
375:名無しさん@お腹いっぱい。
07/04/25 21:35:53
シェルいい本知りません?初心者向けで
376:名無しさん@お腹いっぱい。
07/04/25 21:45:15
UNIXプログラミング環境
377:名無しさん@お腹いっぱい。
07/04/25 21:50:11
マジレスをおねがいします
378:名無しさん@お腹いっぱい。
07/04/25 21:52:27
どのへんが冗談だと?
379:名無しさん@お腹いっぱい。
07/04/25 21:55:09
初心者向きじゃないし、内容が古い
380:名無しさん@お腹いっぱい。
07/04/25 22:01:27
対案を出してから批判しろ
381:名無しさん@お腹いっぱい。
07/04/25 22:06:43
「試験に出るシェルスクリプト」
382:名無しさん@お腹いっぱい。
07/04/26 00:34:12
>>381
その筋質問箱は付いてますか?
383:名無しさん@お腹いっぱい。
07/04/26 04:36:49
Z80は最強だから大丈夫
384:名無しさん@お腹いっぱい。
07/04/26 10:22:57
じゃあ「できるシゥルスクリプト」
385:名無しさん@お腹いっぱい。
07/05/02 17:38:53
英小文字からなる文字列の最初の一文字だけを大文字に変換するには
どうすればよいのでしょうか?
sedだと只それだけで一文字目の後ろに改行を挿入してホールドスペースに入れて、
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ てなことして
また連結して改行を削除みたいな、バカ手間が掛かるので投げ出してしまった。
もっと簡潔に出来たら良いなと思うのですが・・・
386:名無しさん@お腹いっぱい。
07/05/02 17:42:25
>>385
echo aaa | sed 's/\(.\)/\U\1/'
387:385
07/05/02 18:01:30
>>386
それは。どこのsedですか?
うちではそれはUaaaと出力します。\Uという正規表現はUそのものを表すようです。
388:385
07/05/02 18:42:47
ちょっと調べてみたらGNUのsedだと、>>385の動作が出来るようです。
しかし、なんでもコマンドを高機能なやつに入れ替えるのもどうかと思うし、
使っているOSがGNUツール群を標準装備していないのもそれなりに理由があるだろうし
高々文字列変換で新たなツールを使うのには、消極的になりますね。
389:名無しさん@お腹いっぱい。
07/05/02 19:11:07
echo "abc" | awk '{print toupper(substr($0,1,1))substr($0,2)}'
echo "abc" | perl -pe 's/(.)/\U\1/'
390:名無しさん@お腹いっぱい。
07/05/02 19:18:21
echo aaa | awk -v FS= -v OFS= '{$1=toupper($1);print}' はどう。
391:385
07/05/02 20:06:42
>>389
有り難うございます。
awkのsubstrで文字位置指定して、toupperで大文字に変換ということですね。
perlの方はgsedと互換な感じの構文ですね。(てかgsedが模倣した?)
>>390
済みません。
awk: illegal statement
input record number 1, file
source line number 1
と成ります。
いずれにしてもいろいろと勉強になります。
>>386,>>389,>>390の皆さん、ありがとうございました!
392:名無しさん@お腹いっぱい。
07/05/03 02:41:58
GNU の sed でも y/a-z/A-Z/ みたいな表現できないんだよね。
互換性維持のためなんだろうけど。
393:名無しさん@お腹いっぱい。
07/05/03 09:18:45
kshのコマンドヒストリで矢印キーが使いたいのだが、
emacsのCTRLキーはめんどい。
エロい人、設定のしかた教えてチョ。
394:名無しさん@お腹いっぱい。
07/05/03 10:08:20
>>393
くだらない質問はここに書き込め!Part 52
スレリンク(unix板)
395:名無しさん@お腹いっぱい。
07/05/03 18:24:22
>>393
bashつかえw
396:名無しさん@お腹いっぱい。
07/05/04 16:26:20
cshで変数の中に空白文字で区切られた複数のワードからなる文字列が代入されてる。
例:「aaa bbb ccc ...」
各ワードに接頭辞と接尾辞を付加したいが、sedでできるかな?
例:「prefix.aaa.postfix prefix.bbb.postfix prefix.ccc.postfix ...」
ちなみにワード数は不定。
置換後の文字列長はLINE_MAX以下でないと駄目?
397:名無しさん@お腹いっぱい。
07/05/04 16:44:54
はい、cshはスルー、次の方どうぞ
398:名無しさん@お腹いっぱい。
07/05/04 16:56:59
こんなんでよい? bashだけど
$ s="aaa bbb ccc"
$ echo $s | sed -e 's/\([^ ]*\)/prefix.\1.postfix/g'
prefix.aaa.postfix prefix.bbb.postfix prefix.ccc.postfix
399:名無しさん@お腹いっぱい。
07/05/04 23:17:48
Gnomeなどのデスクトップ環境でxxx.shに何らかのファイルをドロップしたとすると、そのファイル名はどういった変数に格納されているのでしょうか。
tex処理を簡単にしたいと考えたのですが、これが分からずにつまっています。
400:名無しさん@お腹いっぱい。
07/05/05 00:39:09
$1, $2, ...
401:名無しさん@お腹いっぱい。
07/05/05 06:17:46
>>398
$1,$2...って9個までしか使えないんじゃ?
396は「ワード数不定」って言ってるから、10個以上もありうるだろ。
402:名無しさん@お腹いっぱい。
07/05/05 06:21:09
↑gオプション付いてるやん。何かみついてんだコイツ
403:名無しさん@お腹いっぱい。
07/05/05 14:01:50
>>401
アホー
>>400は>>399へのレスだ。
404:名無しさん@お腹いっぱい。
07/05/05 23:04:16
>>399
多分、コマンドでこう起動したのと同じ扱いになっている思う。
$ xxx.sh < "abc.tex"
スクリプト側でリダイレクトされる前のファイル名を
取得する方法が分かれば、どうにかなるんじゃないかな。
405:名無しさん@お腹いっぱい。
07/05/06 01:12:45
画像変換するスクリプトを作っています。
スクリプ中で使用するコマンド(今回はmogrify)がインストールされているかどうか
調べるのに手っ取り早い方法ありますか?
今のところ思いつくのは、PATHから「:」で区切って1つづつ抜き出し、その直下に
mogrifyがあるか「test -x」する方法です。
406:405
07/05/06 01:26:07
ちょっと自己解決
whereis使えばいいか。
whereisって見つからなくても0返すんですね・・・
whereis -b mogrifya | grep -v ':$' > /dev/null
if [ $? ...
って感じかな
もっとスマートな方法ありましたらご教授ください。
407:名無しさん@お腹いっぱい。
07/05/06 01:47:14
whichは?
408:名無しさん@お腹いっぱい。
07/05/06 02:09:28
if which mogrify > /dev/null 2>&1 ; then
...
は?
409:名無しさん@お腹いっぱい。
07/05/06 02:18:36
>407,408
whichか、なるほど
解決しましたありがとうございました。
410:405
07/05/06 02:45:19
たびたびすいません
&&や||の後に複数のコマンドを書くにはどうすればいいのでしょうか?
見つからなかった場合、NGと表示しexitしたいのですが、
which mogrify > /dev/null 2>&1 && echo 'bc ok' || (echo 'bc NG'; exit 1)
としてもミニシェルから抜けるだけなのです
if文で書けばいいだけなのですが、勉強の意味でも知っておきたいのです。
411:名無しさん@お腹いっぱい。
07/05/06 03:18:41
function echo_exit() {
echo $*
exit
}
とか定義しちゃえば?