シェルスクリプト総合 その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/
0070名無しさん@お腹いっぱい。
2005/04/26(火) 23:02:10007156
2005/04/26(火) 23:28:34やっぱ余裕でできるんですね。
もっと勉強します。
ちなみにAIX4.3でperlないっすね・・・
0072名無しさん@お腹いっぱい。
2005/04/26(火) 23:45:02Command Line Editing
と
Using Interactive History
が入ってないんだろう?ドキュメントを加工するから texi ファイル
で全ドキュメントが欲しいんだけど
0073名無しさん@お腹いっぱい。
2005/04/26(火) 23:45:12ダブルクオートをシングルクオートにかえりゃいいじゃん。
どのシェルでもいけるだろ。
0074名無しさん@お腹いっぱい。
2005/04/26(火) 23:51:40egrepを使用して
「先頭にABCまたはDEFを含むが、それ以降文中にGHIを含まない」
処理を行いたいと以下の様にしました
egrep "^(ABC|DEF)" | egrep -v "GHI"
マッチしない:ABChogeGHI
マッチする:DEFhogefoo
が、grepを二回呼ぶのはかっちょ悪い気がします
うまい事grep一発でマッチさせる方法はあるんでしょうか
0075名無しさん@お腹いっぱい。
2005/04/27(水) 00:33:090076名無しさん@お腹いっぱい。
2005/04/27(水) 00:39:57sed -e '/^\(ABC\|DEF\)/{ /GHI/d; }'
007756
2005/04/27(水) 11:46:05iniファイルの特定のセクションを削除するというやつなんですが。
複数のiniファイルの複数のセクションを消したいのです。
例えば
/hoge/foo/test1.iniの[bar22]と[bar33]
/hoge/goo/test3.iniの[test51]と[tea312]と[write556]
/hoge/asdf.iniの[read52]
・・・
ってな感じなんです。
自分のイメージでは消したいiniとセクションをどっかのテキストに書いておいて
んでそれを読み込みながら削除するって感じになるんですかね。
是非教えてください
/bin/sh
0078名無しさん@お腹いっぱい。
2005/04/27(水) 11:54:37自分ではどこまでできたの?
0079名無しさん@お腹いっぱい。
2005/04/27(水) 12:36:270080名無しさん@お腹いっぱい。
2005/04/27(水) 13:02:00別にシェルスクリプトにこだわらなくてもいいんじゃないの。
Windowsのreg.exeみたいな単発ユーティリティ作ったら。
0081名無しさん@お腹いっぱい。
2005/04/27(水) 13:10:06使ってもいいというルールならどうかな。
内部コマンドだけではつらい。
bashならできるか。
0082名無しさん@お腹いっぱい。
2005/04/27(水) 15:14:31ini2 test1 test3
とか書きこんだファイルの名前を引数にして起動
#!/bin/sh
list=$1
exec < $list
while read LINE;do
for i in $LINE;do
if [ -z $file ];then
file=$i;
else
section=$i
ed $file <<EOF
/$section/
.,/^$/d
w
q
EOF
fi
done
file=""
done
0083名無しさん@お腹いっぱい。
2005/04/27(水) 18:43:01008456
2005/04/27(水) 23:44:330085名無しさん@お腹いっぱい。
2005/04/29(金) 05:20:17以下のようにすると、当然ながら $result に "func" という
文字列が代入されてしまいます・・・
func() {
return aaa
}
result=func
0086名無しさん@お腹いっぱい。
2005/04/29(金) 05:27:40% func() { echo aaa}
% result=$(func)
% echo $result
aaa
%
0087名無しさん@お腹いっぱい。
2005/04/29(金) 07:01:48やってみましたが、
bash: fg: %: no such job
bash: fg: %: no such job
:
と表示されてしまいます。
0088名無しさん@お腹いっぱい。
2005/04/29(金) 07:14:38% はプロンプトだから入力しないで良いよ
0089名無しさん@お腹いっぱい。
2005/04/29(金) 07:28:01↓これで試してみて。
#!/bin/sh
func() { echo aaa ;}
res=$(func)
echo $res
0090名無しさん@お腹いっぱい。
2005/04/29(金) 09:25:570091名無しさん@お腹いっぱい。
2005/04/29(金) 10:21:55func() {
ret=aaa
}
result=$ret
戻り値とは言わんけど。
0092名無しさん@お腹いっぱい。
2005/04/29(金) 10:51:09func ret
echo $ret
0093名無しさん@お腹いっぱい。
2005/04/29(金) 11:51:30それは、いろいろ応用が利きそうだね。
0094名無しさん@お腹いっぱい。
2005/04/29(金) 19:39:36効かない。
009585
2005/04/30(土) 06:03:43受け取れるわけですね。一般的な sh の処理かどうかは分かりませんが、
とりあえずコレでやってみようと思います。
func() {
echo aaa
}
result=`func`
0096名無しさん@お腹いっぱい。
2005/04/30(土) 11:42:40echo aaa
}
func
result=$?
0097名無しさん@お腹いっぱい。
2005/05/01(日) 11:10:30どうやってやるのが一番お勧めですか?
perlでなら出来るのですが、処理が大量に発生するので
もう少し軽い仕組みが出来ないかなと調べているところです。
0098名無しさん@お腹いっぱい。
2005/05/01(日) 11:33:550099名無しさん@お腹いっぱい。
2005/05/01(日) 11:34:370100名無しさん@お腹いっぱい。
2005/05/01(日) 11:45:19m9(^Д^)プギャー
0101名無しさん@お腹いっぱい。
2005/05/01(日) 13:06:44010297
2005/05/01(日) 13:59:04コピーじゃなくて切り取りをしたいのですがいい手ありますか?
0103名無しさん@お腹いっぱい。
2005/05/01(日) 14:06:22m9
010497
2005/05/01(日) 14:26:02検索するとスクリプトとは関係ないものばかりヒットして・・・
0105名無しさん@お腹いっぱい。
2005/05/01(日) 14:39:03m9(^Д^)プギャー
0106名無しさん@お腹いっぱい。
2005/05/01(日) 14:46:53ならperlで良いんじゃ?
0107名無しさん@お腹いっぱい。
2005/05/01(日) 15:17:57一時的にコピーするなり、mvするなりの処理がいる。
結局、読み書きopenのできるperlの方が効率よくなる、はず。
0108名無しさん@お腹いっぱい。
2005/05/01(日) 16:24:20コピーした後で
ed <<file> <<EOF
$
d
w
q
EOF
0109名無しさん@お腹いっぱい。
2005/05/03(火) 18:55:15(true | exit 0; exit 1); echo $?
(set -e; (false); true); echo $?
( (set -e; false; true) && exit 0; set -e; (false; true) && exit 1; exit 2); echo $?
0110名無しさん@お腹いっぱい。
2005/05/03(火) 21:20:180111名無しさん@お腹いっぱい。
2005/05/04(水) 12:34:43行毎に取り出すことは出来ないのでしょうか?
例えば
file1の1行目を取り出して別の関数に引き渡す
引き渡したら2行目を同様に別の関数へ引き渡す。
この繰り返しで3行目、4行目・・・
いった感じを考えているんですが、
shellでは可能でしょうか?
0112名無しさん@お腹いっぱい。
2005/05/04(水) 12:38:520113名無しさん@お腹いっぱい。
2005/05/04(水) 12:46:46ありがとうございます。
全くの初心者のものなので凄く悩んでしまいました。
もっと勉強します。
0114名無しさん@お腹いっぱい。
2005/05/05(木) 00:13:39ps ax | grep wine | kill `awk '{print $1}'`
0115名無しさん@お腹いっぱい。
2005/05/05(木) 00:19:17こうしようぜ。
0116名無しさん@お腹いっぱい。
2005/05/05(木) 00:53:390117名無しさん@お腹いっぱい。
2005/05/05(木) 05:26:070118名無しさん@お腹いっぱい。
2005/05/05(木) 20:45:030119名無しさん@お腹いっぱい。
2005/05/05(木) 20:47:22yes "A" | head -n 10 | tr -d "\n"
0120名無しさん@お腹いっぱい。
2005/05/05(木) 20:55:21ありがとうございます。
0121名無しさん@お腹いっぱい。
2005/05/05(木) 21:09:50ruby -e 'puts("X"*20)'
か
printf "%020d" 0|tr 0 X
0122名無しさん@お腹いっぱい。
2005/05/05(木) 21:25:242進数文字列の 00110 01010 のビットAND ORは?
0123名無しさん@お腹いっぱい。
2005/05/05(木) 21:58:480124名無しさん@お腹いっぱい。
2005/05/06(金) 15:48:57私のはなりません。
GNU bash, version 2.04.0(1)-release (i386-turbo-linux-gnu)
0125名無しさん@お腹いっぱい。
2005/05/06(金) 16:16:23負の値をbashで扱いたい時は $((-1)) とするか、明示的に typeset すべき。
0126名無しさん@お腹いっぱい。
2005/05/06(金) 16:27:38おお、ありがとうございます。
0127名無しさん@お腹いっぱい。
2005/05/06(金) 22:21:34aaa
bbb
EOF
とヒアドキュメントの値を変数に格納したいのですが、
どうやっていいのか分りません。あくまでリダイレクトである以上
変数への格納は無理なんでしょうか?
0128名無しさん@お腹いっぱい。
2005/05/06(金) 22:33:480129名無しさん@お腹いっぱい。
2005/05/06(金) 22:47:18$ VAL=`cat << 'EOF'
aaa
bbb
EOF`
$ echo $VAL
aaa bbb
ってことをやりたいの?
# 移植性は未調査だけど
0130名無しさん@お腹いっぱい。
2005/05/06(金) 22:50:08そうですね、マニュアル見たら全然別物でした。
>>129
そうです、それがやりたかったです。どうもありがとうございました。
0131名無しさん@お腹いっぱい。
2005/05/06(金) 23:02:08スペースになってしまいますね。
0132名無しさん@お腹いっぱい。
2005/05/06(金) 23:06:08改行コードに変換するのがいいみたいです。お騒がせしました。
0133名無しさん@お腹いっぱい。
2005/05/06(金) 23:53:03変数に当日の年月日を設定するのは簡単なんですが
前日を設定するにはどうしたらいいでしょうか?
0134名無しさん@お腹いっぱい。
2005/05/07(土) 00:19:50他の場合はどうするんだろ。
0135名無しさん@お腹いっぱい。
2005/05/07(土) 01:06:190136sage
2005/05/07(土) 01:25:070137名無しさん@お腹いっぱい。
2005/05/07(土) 01:26:590138名無しさん@お腹いっぱい。
2005/05/07(土) 01:42:280139名無しさん@お腹いっぱい。
2005/05/07(土) 03:24:35バカはどんなことでも自分が最高レベルと自負してくからこだわらずにいられない(藁
井の中のザコ、大海から逃げる。
0141名無しさん@お腹いっぱい。
2005/05/07(土) 10:32:18大海から逃げたザコ、井の中で大口。
0142名無しさん@お腹いっぱい。
2005/05/07(土) 10:37:210144名無しさん@お腹いっぱい。
2005/05/07(土) 12:26:22strftime(3) が %s を解すなら多分こんな感じ
$ date -r $((`date +%s`+86400))
>>132
IFSという環境変数について調べると幸せになるかもしれない。
0145名無しさん@お腹いっぱい。
2005/05/07(土) 13:35:580146名無しさん@お腹いっぱい。
2005/05/07(土) 16:55:39自分で作れよ( ゚ー゚)
0147名無しさん@お腹いっぱい。
2005/05/07(土) 18:05:330148名無しさん@お腹いっぱい。
2005/05/08(日) 01:07:08もうおまえしか見えない
0149名無しさん@お腹いっぱい。
2005/05/08(日) 10:57:36for i in $1;do
echo "ibase=10;obase=2;print $i, \".\""|bc
done
0150名無しさん@お腹いっぱい。
2005/05/10(火) 07:19:36IFS="."
for i in $1;do
echo "ibase=10;obase=2;print $i, \".\""|bc
done
$ sh cnv 127.1
1111111.1.$
0151名無しさん@お腹いっぱい。
2005/05/10(火) 14:28:15ibase=A を使え。
0152名無しさん@お腹いっぱい。
2005/05/10(火) 16:07:560153名無しさん@お腹いっぱい。
2005/05/11(水) 00:12:260154じゃこれでどう
2005/05/11(水) 00:47:25if [ $i -eq 0 ];then
num=00000000
elif [ $i -lt 2 ];then
num=0000000$num
elif [ $i -lt 4 ];then
num=000000$num
elif [ $i -lt 8 ];then
num=00000$num
elif [ $i -lt 16 ];then
num=0000$num
elif [ $i -lt 32 ];then
num=000$num
elif [ $i -lt 64 ];then
num=00$num
elif [ $i -lt 128 ];then
num=0$num
fi
}
IFS="."
j=0
for i in $1;do
if [ $j -gt 0 ];then
echo -n .
fi
num=`echo "obase=2;print $i;"|bc`
pad
echo -n $num
j=`expr $j + 1`
done
echo
0155名無しさん@お腹いっぱい。
2005/05/11(水) 00:52:520156名無しさん@お腹いっぱい。
2005/05/11(水) 08:10:11Version7では使えるけど。
0157名無しさん@お腹いっぱい。
2005/05/11(水) 18:41:13Version6では使えるけど。
0158名無しさん@お腹いっぱい。
2005/05/11(水) 20:53:29ご相談です;y=ー(゚д゚)・∵. ターン
[server_1.txt]
PC等,PCサロン,PCについて誰かが質問に答えるスレ
PC等,UNIX,全文エンジンEstraier
PC等,CG,モデラー silo
[server_2.txt]
PC等,モバイル,ID砲丸投げinモバイル
PC等,UNIX,全文エンジンEstraier
PC等,CG,ローポリスレ△3
ってあるテキストファイルがあるとして、
$ merge.sh server_1.txt server_2.txt
PC等,PCサロン,PCについて誰かが質問に答えるスレ
PC等,モバイル,ID砲丸投げinモバイル
PC等,UNIX,全文エンジンEstraier
PC等,CG,モデラー silo
とマージされるスクリプトを作りたいんです。要件としては
(1) #1,#2がキーでその後ろは自由項目
(3) #1,#2が同じ場合はserver_1.txtを採用
なんか簡単にsortとかでできそうな予感してたんですけど、
だめぽ・・・なんです。
どなたかいいスクリプトを・・・もしくは、スレ違いの
場合は誘導お願いします。
0159名無しさん@お腹いっぱい。
2005/05/11(水) 21:10:12すんません、#1, #2は$1, $2ってことです。
(CSVファイルの1列目、2列目ってことです)
0160名無しさん@お腹いっぱい。
2005/05/11(水) 21:32:46sortしてuniqじゃね?
uniqってカラムでなんか指定できたことね?
0161名無しさん@お腹いっぱい。
2005/05/11(水) 21:45:52Perl/Python 使った方が速そうだが
0162名無しさん@お腹いっぱい。
2005/05/11(水) 22:04:12出力される順番は不定。
#!/usr/bin/awk -f
BEGIN{ FS="," }
{ if(!($1 SUBSEP $2 in a)) a[$1,$2] = $0 }
END{ for(i in a) print a[i] }
0163名無しさん@お腹いっぱい。
2005/05/13(金) 00:50:37思うように動作しないため、質問させていただきます。
==============================================
1. 変数Aを用意する。
変数Bに時刻「05:30」と値が格納されている。
変数Cを用意する。
2. AとBを比較します。
(1)Aの方がBよりも時刻が前の場合、Cに"OK"と格納する
(2)Aの方がBよりも時刻が後の場合、Cに"NG"と格納する
==============================================
このロジックでキモなのは、時刻の比較です。
最初、比較条件を [$A < $B] としておりました。
辞書式のやり方をネットで調べたらありましたので。
ですが、こうすると、変数Bが名前のファイルが出来てしまい、
比較しているのかどうかも怪しいのです。
すみませんが、お知恵を貸してはいただけないでしょうか。
宜しくお願い致します。
0164名無しさん@お腹いっぱい。
2005/05/13(金) 00:55:44[ $A \< $B ]
0165名無しさん@お腹いっぱい。
2005/05/13(金) 08:53:06$B=`date +%H%M`
みたいな感じで。
そしたら普通に数値比較の方法でいけるよ
0166名無しさん@お腹いっぱい。
2005/05/14(土) 00:14:57time_tの値を返すコマンドを作れ。
0167名無しさん@お腹いっぱい。
2005/05/14(土) 02:12:30こんなの書いてみた
# 05:30 -> 530 数値に書き換える
function timeToInt() {
if [ x"$1" = x"00:00" ] ; then
echo "0"
return
fi
echo $1 | sed s/:// | sed s/^0*//
}
if [ `timeToInt $A` -lt `timeToInt $B` ] ; then
C="OK"
else
C="NG"
fi
0168名無しさん@お腹いっぱい。
2005/05/14(土) 08:34:04俺も
a=09:39; b=05:30; if [ $((10#${a/:/})) -lt $((10#${b/:/})) ]; then c=OK; else c=NG; fi; echo $c
0169名無しさん@お腹いっぱい。
2005/05/14(土) 09:07:10の言う通り。
”:”だけ削除するロジックを入れれば、変数文字列の先頭に0が残っていても、数字として比較できる。
0170名無しさん@お腹いっぱい。
2005/05/14(土) 09:17:460が残っていると8進数になるんじゃない。
■ このスレッドは過去ログ倉庫に格納されています