2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

シェルスクリプト総合@LINUX Part5

1 :1様:2009/04/03(金) 22:17:43 ID:0qFlvOW9
UNIX板のスレを見ている方も多数おられるかと思いますが、
まあそれはそれとして、BASHウゼーとか言われる心配なく
平和にLINUX的スクリプト談義しましょうよ。

初めての自作スクリプト、自信ないから見てください。な初心者から
トリッキーな技を駆使した作品を披露したい、蘊蓄を語りたい上級者まで
いろいろな人に参加して頂けると嬉しいです。

perlやらPythonやらの話が混ざっても良いんでない?

Part4 : http://pc11.2ch.net/test/read.cgi/linux/1210999497/
Part3 : http://pc11.2ch.net/test/read.cgi/linux/1184077033/
Part2 : http://pc11.2ch.net/test/read.cgi/linux/1154578200/
Part1 : http://pc8.2ch.net/test/read.cgi/linux/1121994321/

>>2-5あたりに色々と。

2 :1様:2009/04/03(金) 22:19:41 ID:pwv0zYsr
関連スレ
おまいら! sed の使い方教えて下さいm(_ _)m@linux板
http://pc11.2ch.net/test/read.cgi/linux/1067815570/
【Shell】どのシェル使ってる?【Script】@LINUX板
http://pc11.2ch.net/test/read.cgi/linux/1067330754/
シェルスクリプト総合 その14
http://pc12.2ch.net/test/read.cgi/unix/1233179688/
sed@UNIX板
http://pc11.2ch.net/test/read.cgi/unix/1085730992/
2ちゃん画像落としまくりスクリプト@UNIX板
http://pc11.2ch.net/test/read.cgi/unix/1003833552/
連番のH画像/動画を一気にダウンロードする2
http://pc11.2ch.net/test/read.cgi/unix/1135533382/

3 :1様:2009/04/03(金) 22:20:49 ID:pwv0zYsr
参考リンク
bashで始めるシェルスクリプト基礎の基礎 @IT
http://www.atmarkit.co.jp/flinux/rensai/theory08/theory08a.html
シェルスクリプト(Bash)入門 CYBERAM Documents Project
http://cyberam.dip.jp/linux_command/shellscript.html

IBM developerWorks
実例でわかるsed
http://www-06.ibm.com/jp/developerworks/linux/010202/j_l-sed1.html
http://www-06.ibm.com/jp/developerworks/linux/010216/j_l-sed2.html
http://www-06.ibm.com/jp/developerworks/linux/010223/j_l-sed3.html
実例でわかるawk
http://www-06.ibm.com/jp/developerworks/linux/010330/j_l-awk1.html
http://www-06.ibm.com/jp/developerworks/linux/010413/j_l-awk2.html
http://www-06.ibm.com/jp/developerworks/linux/010622/j_l-awk3.html
コマンドラインからのグラフィックス操作
http://www-06.ibm.com/jp/developerworks/linux/031031/j_l-graf.html
洗練されたPerl: MP3とPerlで遊ぶ
http://www-06.ibm.com/jp/developerworks/linux/040319/j_l-cpmp31.html
http://www-06.ibm.com/jp/developerworks/linux/040402/j_l-cpmp32.html

4 :login:Penguin:2009/04/03(金) 23:35:06 ID:VWAfe8sR
awk ファンクラブ
http://pc11.2ch.net/test/read.cgi/linux/1215431118/

5 :login:Penguin:2009/04/04(土) 01:01:09 ID:zPRKkUO8
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


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

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

6 :login:Penguin:2009/04/04(土) 01:02:10 ID:zPRKkUO8
□過去スレ:
シェルスクリプト総合 その13
http://pc12.2ch.net/test/read.cgi/unix/1224085718/
シェルスクリプト総合 その12
http://pc11.2ch.net/test/read.cgi/unix/1218277263/
シェルスクリプト総合 その11
http://pc11.2ch.net/test/read.cgi/unix/1211284684/
シェルスクリプト総合 その10
http://pc11.2ch.net/test/read.cgi/unix/1202725267/
シェルスクリプト総合 その9
http://pc11.2ch.net/test/read.cgi/unix/1187130302/
シェルスクリプト総合 その8
http://pc11.2ch.net/test/read.cgi/unix/1171517324/
シェルスクリプト総合 その7
http://pc11.2ch.net/test/read.cgi/unix/1157601611/
シェルスクリプト総合 その6
http://pc11.2ch.net/test/read.cgi/unix/1143302182/
シェルスクリプト総合 その5
http://pc11.2ch.net/test/read.cgi/unix/1137801629/
シェルスクリプト総合 その4
http://pc11.2ch.net/test/read.cgi/unix/1131026501/
シェルスクリプト総合 その3
http://pc11.2ch.net/test/read.cgi/unix/1124889646/
シェルスクリプト総合 その2
http://pc11.2ch.net/test/read.cgi/unix/1113664637/
シェルスクリプト総合 その1
http://pc11.2ch.net/test/read.cgi/unix/1101820646/

7 :login:Penguin:2009/04/04(土) 01:05:07 ID:zPRKkUO8
'Part4'のテンプレになってたから'その13'のテンプレも張っておいた。

8 :login:Penguin:2009/04/04(土) 01:12:36 ID:Tp2VlfaD
どうしてこのスレは忘れられてしまったのか!?

9 :login:Penguin:2009/04/04(土) 01:21:05 ID:zPRKkUO8
このスレは

「シェルスクリプト総合@LINUX Part14」

です。

10 :login:Penguin:2009/04/04(土) 01:24:17 ID:zPRKkUO8
違うよね。
UNIX版とごっちゃになっててごめん。

Part5であってる。

11 :login:Penguin:2009/04/04(土) 14:55:03 ID:or2+u8IA
(例えば)zshをシェルにしてて高度な機能とかつかっていると、"正規な"/bin/shで動かそうとした時にハマるってことだよね。

Linuxで各シェルの追加仕様とか機能とかつけずにsh相当の機能というか仕様で実行させるにはどうしたらいいの?

たとえばDebianとかはbashじゃなくってdashの方がいいのかな?

12 :login:Penguin:2009/04/04(土) 17:44:34 ID:2v8+JVJm
>>11
man bash

13 :login:Penguin:2009/04/04(土) 17:54:04 ID:0GvDrAb/
>>11
heirloom-sh か UNIX 板の方へいけばいいんじゃね?

14 :login:Penguin:2009/04/05(日) 14:22:18 ID:9jnUYPBK
>>12
なるほど。
#/bin/sh --posix
で始めればいいってことかな?

>>13
Heiroom shってぐぐるとPOSIX標準から外れているとかなんとか。
まcsh系みたいな論外系とは違うだろうし実用問題ないくらいには書けるそうなんだけど。

15 :login:Penguin:2009/04/09(木) 01:09:15 ID:fmCo0sq3
./resize input_img.png output_img.png 60
のような引数を渡すプログラムに

./resize img/*.png rlt_img/*.png 60
のように、ワイルドカードでファイルを読み込み、
そのワイルドカード部のファイル名で出力したいのですが
このようにするには、どのように記述すべきでしょうか?

16 :15:2009/04/09(木) 01:13:00 ID:fmCo0sq3
for file in *.txt
do
cp "$file" "$file.bak"
done

これで解決です、ありがとうございます

17 :login:Penguin:2009/04/09(木) 02:01:01 ID:sLNPV+qV
チョンプ

18 :login:Penguin:2009/04/12(日) 14:56:44 ID:zY73Wyps
シェルスクリプトで小数の比較って出来ないのでしょうか

if [ 1.1 -le 1.2 ];then

else

fi

ということをやりたいんですが。

19 :login:Penguin:2009/04/12(日) 15:20:16 ID:hHMEJJ0V
>>18
それはexprとかの外部コマンドを使わずに、ということか?

20 :login:Penguin:2009/04/12(日) 15:36:21 ID:zY73Wyps
>>19
いえ、外部コマンドの有無は特に気にしていないです
test コマンドは整数にしか対応していないとのことでしたので
別の方法でもあるのかなと

21 :login:Penguin:2009/04/12(日) 15:48:04 ID:Fl5RzaXW
echo "scale=1; 1.1 < 1.2" | bc

22 :login:Penguin:2009/04/12(日) 16:23:36 ID:zY73Wyps
>>21
なるほど。bc コマンドでも数値の比較が出来るのですね
ありがとうございました

23 :login:Penguin:2009/04/13(月) 17:38:44 ID:1oC+4w67
質問です。
カレントディレクトリ内のファイルの拡張子を ".m4a" から ".m4b" に
変更するスクリプトを作ろうと思いました。

#!/bin/bash




for oldName in `ls *.m4a`; do
 newName=`echo "$oldName" | sed s/\.m4a/\.m4b/`

 
mv "$oldName" "$newName"

done

しかし "ファイル 名.m4a" のようにファイル名に空白が含まれると、
"ファイル" と "名.m4a" の2つに分割して処理されてしまいました。
1つのファイルとして処理させるにはどうしたらよいでしょうか?
よろしくお願いします。

24 :23:2009/04/13(月) 17:40:46 ID:1oC+4w67
すいません書き込みに無駄な空行がたくさん入ってしまいました

25 :login:Penguin:2009/04/13(月) 18:05:27 ID:aG/DWGVb
rename コマンドじゃダメ?

26 :login:Penguin:2009/04/13(月) 18:40:55 ID:eDZK/GRn
>>23
for name in *.m4a; do
mv "$name" "${name%.m4a}.m4b"
done
でどうでしょうか

27 :23:2009/04/13(月) 21:05:06 ID:jrO4FfOZ
>>25
検索したところ使えるようですね。
ありがとうございました。

>>26
うまくいきました。変数の構文も参考になります。
ありがとうございました。

28 :login:Penguin:2009/04/13(月) 23:49:04 ID:HMXUAP3X
IFS=""とかじゃダメなんかな

29 :login:Penguin:2009/04/17(金) 09:02:35 ID:91/yURYl
rename -v 's/\.m4a$/.m4b/' *
これでいいじゃん。
スクリプトじゃないけど実態はPerlでevalしてるだけだし。

30 :login:Penguin:2009/04/18(土) 01:13:29 ID:6AHWtliB
BSD 系 (FreeBSD, OpenBSD のみ)と Linux 系で動く sh で1〜100までのループを表現したいんですが、どうすればいいんでしょうか?
妥協して、bash で書いてしまうのもありなんですが、Unix like OS 標準の s hで行きたいところです
また、CentOS の環境に /bin/awk は入っていたんですが、OpenBSD には、標準で入っていないんですよね
あと三番目の bash バージョンは、CentOS だと #!/bin/bash --posix でも #!/bin/sh でも動いてしまうんですが、正当な sh で動かすには、どうしたらいいのでしょうか?
/* c */
for(i=1; i<=100; i++){
printf("%d ",i);
n}
# sh with awk
for i in `awk 'BEGIN { for( i=1; i<=100; i++ ) print i }'`; do
echo -ne "$i "
done
# bash
for (( i=1; i <= 100; i++ ))
do
echo -ne "$i "
done


31 :login:Penguin:2009/04/18(土) 01:36:18 ID:6AHWtliB
自己解決しました
emacsテンプレートの馬鹿w

command-listがまだ慣れないっすね

32 :login:Penguin:2009/04/18(土) 05:46:37 ID:echGlS2v
>>30
forにこだわらないなら

i=1
while [ $i != 101 ]; do
printf "%03d " $i
i=`expr $i \+ 1`
done

こんなんのもアリかも。

33 :login:Penguin:2009/04/18(土) 08:32:44 ID:z+Q5Ng+G
seqでforを回す人が以前いたよね。

for i in `seq 1 100`

34 :login:Penguin:2009/04/18(土) 16:08:22 ID:Fbv8BZKW
for i in `seq 100`; do echo $i; done
俺この方法好き

35 :login:Penguin:2009/04/18(土) 16:40:49 ID:h9pcedkY
for i in `seq -w 100`; do echo $i; done
の方が好き

36 :login:Penguin:2009/04/20(月) 18:07:25 ID:nHdRbS/v
もまいら、なかなかうまいな

37 :login:Penguin:2009/04/24(金) 12:57:30 ID:b7e2t/yg
trapについて教えてください
------hoge.sh----
#!/bin/bash
trap '' INT
sleep 1
echo hoge
sleep 1
echo hoge
-----------------

上記のスクリプトを実行し、Ctrl+c を押しっぱなし
にしても正常に最後までechoし終了するのですが、最後にscpをいれると固まります
------hoge.sh----
#!/bin/bash
trap '' INT
sleep 1
echo hoge
sleep 1
echo hoge
scp hostname:file1 ./file2
-----------------
これの回避方法を教えてください。


38 :login:Penguin:2009/04/25(土) 18:13:43 ID:xpy/PYPF ?S★(614436)
ファイル名の一括変換なんかができたらなぁと思っています。

まいにちフランス語_4月13日放送分.mp3 → FR20090413.mp3
まいにちフランス語_4月14日放送分.mp3 → FR20090414.mp3
まいにちフランス語_4月15日放送分.mp3 → FR20090415.mp3
まいにちフランス語_4月16日放送分.mp3 → FR20090416.mp3
まいにちフランス語_4月17日放送分.mp3 → FR20090417.mp3

というルールでファイル名を一括変換したいのですが、
シェル・スクリプトでどう書けばいいのかさっぱり分かりません。
どなたかお助け願えませんでしょうか?よろしくお願いいたします。


39 :login:Penguin:2009/04/25(土) 19:52:53 ID:kvdAirHU
>>38
見習い中の者だけど、直接、mvするのは書けた

でも
cp
rm -iとしたいけど、適当な記述が思いつかない

雨がやんだっぽいので買い出しに行ってきます

40 :login:Penguin:2009/04/25(土) 19:58:44 ID:0GMAGDVv
>>38 自己レスです。
まいにちフランス語_4月13日放送分.mp3 → FR20090413.mp3
のうち、ttp://tinyurl.com/czxw5g を参考に、
まいにちフランス語_4月13日放送分.mp3 → FR2009413.mp3
までは自力でなんとか出来ました。4月を04と2桁にするのだけが分かりません。

現在のスクリプトは以下です。
for base_name in `find ./ -name "まいにちフランス語_*"`
do
rename=`(echo ${base_name} | sed 's/まいにちフランス語_/FR2009/g' | sed 's/月//g' | sed 's/日放送分//g')`
mv ${base_name} ${rename}
done
あとどう直せば希望通りの動作を実現できるのでしょうか。どなたかお助け下さい。お願いいたします。

41 :login:Penguin:2009/04/25(土) 20:39:12 ID:KQhyDGwp
sed -e 's/^[^0-9]*/FR2009 /' -e 's/月/ /' -e 's/日放送分/ /' | awk '{printf"%s%02d%02d%s",$1,$2,$3,$4}'

42 :login:Penguin:2009/04/25(土) 22:21:23 ID:gHQ99EuD
>>40
回答じゃないけど、なんか元ファイルに想定外なのがあって上書き、とかを避けるため、
mvじゃなくって同一driveの別ディレクトリにハードリンクのがオレは好み。

個数とか確認後に元を消すだけだし、容量的にも×2必要ってわけじゃねぇし。

43 :login:Penguin:2009/04/25(土) 22:37:34 ID:kvdAirHU
>>42
プログラムエラーがあるかもしれないぐらいの気合いの入っていないプログラムだと
ファイル操作に慣れていないと結構大変だね

mvじゃなくcpして、元ファイルは/tmpに移しておけばいいんかな
/tmpについてそこまで詳しく知らないけど、ある日数とtmpの容量がオーバーしたら
勝手に消えるんでしょ?
dfでマイナス表記をみた記憶があった気もするけど

HDDも安くなったから、事前にmkdir ~/tmpと作っておいて、ゴミ箱的に使うのがいい感じなのかな

44 :login:Penguin:2009/04/25(土) 22:46:19 ID:U0RjRCaW
>/tmpについてそこまで詳しく知らないけど、ある日数とtmpの容量がオーバーしたら
>勝手に消えるんでしょ?
(´・ω・`)・・・

45 :login:Penguin:2009/04/25(土) 23:29:31 ID:z0Vi8pSt
>>38,40
#!/bin/sh
find ./ -name 'まいにちフランス語_*' | while read line
do
mv -i "$line" `echo "$line" | sed \
-e 's/\([^0-9]\)\([0-9]月\)/\10\2/' \
-e 's/\([^0-9]\)\([0-9]日\)/\10\2/' \
-e 's/まいにちフランス語_/FR2009/' \
-e 's/月//;s/日放送分//'`
done

46 :login:Penguin:2009/04/26(日) 16:11:48 ID:NYZwuLsV
$ ls "*"
ls: cannot access *: そのようなファイルやディレクトリはありません

これって展開されないんだ?


47 :login:Penguin:2009/04/26(日) 16:46:19 ID:/3VhflV8
>>46
> $ ls "*"
それだと$ ls \*と同じじゃないの?
$ ls *なら展開される

試しに$ echo "foobar" > "*"とすると*というファイル名できるんだね
また$ echo "foobar" > "2*2=4"でもちゃんとできる
$ echo "hoge" > "2+2=4"としておいて
$ ls 2*2=4だと、2*2=4 2+2=4の二つが出てきますが

まあ、そういうことなんでしょ
ファイル名はShellにとって特殊文字の*?は使わないほうがいいんだっけ?

$ rm *とやったら、どうなるんだろ
こわくてできない

48 :login:Penguin:2009/04/26(日) 17:51:05 ID:NYZwuLsV
ダブルクォートだと展開されるような気がしてたけど
勘違いか、そっか。

> ファイル名はShellにとって特殊文字の*?は使わないほうがいいんだっけ?
頭に '-' とかもコマンドによってはオプションとして識別するからね。
$ date > --help

$ cat '--help'
使用法: cat [オプション]... [ファイル]...


$ cat -- '--help'
2009年 4月 26日 日曜日 17:49:26 JST


49 :login:Penguin:2009/04/26(日) 18:15:04 ID:6AxKKceD
>>46
ttp://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html#lbBE
> パターンマッチング
> 特殊パターン文字をその文字そのものにマッチさせるためには、クォートしなければなりません。


50 :login:Penguin:2009/04/26(日) 18:18:28 ID:cQuTU2RN
ダブルクォート中で有効なメタ文字は「$\`」

51 :login:Penguin:2009/04/26(日) 18:33:49 ID:/3VhflV8
>>48
対話インタプリタ(コマンドライン)のときとシェルスクリプトを実行するときに挙動に違いがあるってことかな
echo `*`だと二回出るのは、なんなんだろ
うーん
$ cat foo.sh
echo '[command] *'
echo `*`
echo '[command] ls *'
echo `ls *`
echo '[command] ls "*"'
echo `ls "*"`
echo '[command single-qoate] ls *'
echo `ls '*'`
echo '[command] ls \*'
echo `ls \*`

> > ファイル名はShellにとって特殊文字の*?は使わないほうがいいんだっけ?
> 頭に '-' とかもコマンドによってはオプションとして識別するからね。
そうだね
他人が作ったプログラムを動かすときに'-'は予期しにくい挙動しそうだから、控えたほうが良さそうだけど
でも、'*?'をファイル名に使っても良さそうに思えるなあ
実際、どうなんだろ

52 :login:Penguin:2009/04/26(日) 19:20:08 ID:4i92v2TV
echoと一口に言っても
coreutilsのechoやbashのビルトインecho
dashやzshのビルトインechoは挙動が違う

53 :login:Penguin:2009/04/26(日) 19:46:21 ID:/3VhflV8
>>52
>・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
> bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
> Linuxユーザは/bin/shの正体がbashなので特に注意。
とあるわけだし
zsh, dashは関係ないんじゃないの?
Linux板のスレというのもあってLinux依存に関することは、多少寛容なんでしょうけど
まあ、そういう自分はLinuxなんであれですが

あと「特に注意」とあるけど、環境明示なしの質問でsh関連の質問に答えるためにどういう環境があればいいの?
ここのスレと@UNIXスレの質問の答えになる程度の妥協した現実的な環境として

仮想OSなしでLinux上で整えることができるんでしょうか?
純正shと聞くOpenSolarisのshでちゃんと動けばいいの?
FreeBSD, OpenBSDでは満たせないんでしょうか?

54 :login:Penguin:2009/04/26(日) 20:05:49 ID:z35DirHv
(意図通りに)動けば正義

55 :login:Penguin:2009/04/26(日) 20:13:36 ID:IdxLO+dc
>>53
> >・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
> > bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
> > Linuxユーザは/bin/shの正体がbashなので特に注意。
> とあるわけだし
ID:zPRKkUO8 が UNIX 板と間違えて貼ったテンプレを持ち出して
なにがしたいの?


56 :login:Penguin:2009/04/27(月) 22:45:23 ID:zIUJH1+o
>>41
どうもありがとうございます。レスが遅くなって申し訳ありません。
大変長期に渡るアク禁を喰らっている者で、元の >>40 の質問もこの投稿も、
どちらも代行スレ経由で投稿してもらっております。
>>41 で教えていただいたスクリプトで確かに希望通りの動きをするのですが、
sed の部分も awk の部分も、どちらもどういう操作を命令しているのか、
イマイチ理解が出来ておりません。スクリプトの内容を、
簡単に解説していただけませんでしょうか?
>>45 さんもありがとうございます。


57 :login:Penguin:2009/04/27(月) 22:52:48 ID:doFZwSgR
>スクリプトの内容を、
>簡単に解説していただけませんでしょうか?
そりは、あーたの仕事ですがな。
調べて解らん部分を訊かんと。

58 :login:Penguin:2009/04/28(火) 01:07:02 ID:2xnVN10b
>>41 はどこも難しいとこないよ。
基本的なことしかしてない。

59 :login:Penguin:2009/04/28(火) 01:12:22 ID:7KxLupvN
awkは必要?
awk '{printf"%s%02d%02d%s",$1,$2,$3,$4}'のようにprintf文だけ理解していればいい?

60 :login:Penguin:2009/04/28(火) 03:06:53 ID:zC1qen3j
そんなことを他人に聞くようなら
初めからrubyやpythonなんかで書きなさい

61 :login:Penguin:2009/04/28(火) 12:10:33 ID:2xnVN10b
>>59
意味わかんないけど
目的が達成できれば何でもいいんじゃね。

62 :login:Penguin:2009/05/04(月) 01:16:30 ID:Z02vxYwi
∩゜∀゜∩

63 :login:Penguin:2009/05/08(金) 16:39:20 ID:/GOSAdyI
foo |
bar



foo | \
bar

って違いあるの?

64 :login:Penguin:2009/05/08(金) 20:18:40 ID:3ejrnY18
バックスラッシュ可愛いよ | \ァ | \ァ・・・

65 :login:Penguin:2009/05/09(土) 01:08:35 ID:unYbYLqh
>>63の上のように書けるなんて、俺ぁ始めて知ったよ。

66 :login:Penguin:2009/05/09(土) 02:44:39 ID:R823USQU
>>56
オライリーの詳説正規表現(ふくろう本)とsed&awk(めがねざる本)を
おまえの金で買って嫁。
まずはそこからだ。
>>57が言うように、まずは勉強してから聞いた方が良い。

67 :login:Penguin:2009/05/10(日) 23:02:29 ID:QXYPExpJ
命題=USB接続のストレージを全てumountする(サスペンド/ハイバネのハンドラで使う)
ls -l /dev/disk/by-path/ | while read DEV; do
DEV=${DEV#*usb*/*/}
case $DEV in
sd?[0-9])
echo "umount /dev/$DEV"
;;
esac
done

どんなもんでしょ?
もっと賢い方法ありますか?
諸兄に採点願いたい

68 :login:Penguin:2009/05/10(日) 23:09:18 ID:6t5VOjiz
>>67
目線が高い

69 :login:Penguin:2009/05/11(月) 07:09:17 ID:0Zy7nDFj
>>67
SATAのHDDもアンマウントされるよね?どうすんの??

70 :login:Penguin:2009/05/11(月) 17:10:02 ID:fWM1Begt
>>69
DEV=${DEV#*usb*/*/}
*usb*

71 :login:Penguin:2009/05/12(火) 23:16:06 ID:6EJpjlI0
シェルで出来るかなと考えず、
最初からrubyやperlでやっちゃう人も多いですよね。
現実問題として、ファイル処理やテキスト処理以外の大多数は
他の言語でやったほうが楽ですよね。

結局、シェルスクリプトってどんな時に便利なんですか?

72 :login:Penguin:2009/05/12(火) 23:20:01 ID:D0y0zjLK
>>71
パイプでガスガスコマンド繋ぎたいとき。

関数型言語のような気持ちよさ。

73 :login:Penguin:2009/05/13(水) 19:34:16 ID:V3jwSh7A
>>71
ファイル処理やテキスト処理のときに便利だと、自分で言うとるやないか。

74 :login:Penguin:2009/05/13(水) 22:24:14 ID:u0Eoo5tc
たとえばサスペンド/ハイバネのハンドラは一応クリティカルなので最小限で済ましたい
bashオンリー、sedやawkも控える
サスペンド/ハイバネ自体もbashをフロントエンドにして実装されてる

75 :login:Penguin:2009/05/14(木) 19:14:39 ID:VFAnBpU/
旧いノートにCentOSを入れて酷使してるんだが
もっと愛が必要だと思ったので作った。
もっと良い書き方あるかな

#!/bin/sh

THROTTLING=/proc/acpi/processor/CPU0/throttling
TEMPERATURE=/proc/acpi/thermal_zone/THM0/temperature
STATE_COUNT=8
THRESHOLD_TEMPS='75 70 65 63 62 61 60 0'

get_temperature() { sed -e 's/[^0-9]*//g' < $TEMPERATURE}
set_state() { echo -n $1 > $THROTTLING }

start() {
while(:); do
sleep 2
current_temperature=`get_temperature`
i=$STATE_COUNT
for threshold_temp in $THRESHOLD_TEMPS; do
let i--
if (( $threshold_temp < $current_temperature )); then
set_state $i
break
fi
done
done
}
#daemonにするにはデタッチが必要らしい
start &


76 :login:Penguin:2009/05/21(木) 14:21:38 ID:8Ph6oUED
時刻を利用したものを書きたいんですがどうもよくわかりません。
dateとgrepを利用するのはなんとなくわかるんですがさっぱりです。

<例>引数として与えた時刻になったときに‘wake up!’と表示する

どなたかお助けいただけませんでしょうか。お願いします。

77 :76:2009/05/21(木) 17:13:53 ID:ZE+yaPSj
大学から書き込んでます。
うちの教授がこのスレを見ているらしいです。

このスレの回答を課題として提出したら単位をくれないと思うので
質問を取り消します。


78 :login:Penguin:2009/05/21(木) 17:14:26 ID:8WrmPGB1
そうかそうか

79 :login:Penguin:2009/05/21(木) 17:23:51 ID:Ed3fgcAs
>>77
wikipediaでshのチュートリアルがあるんで、それ読めばだいたいのことは解決すると思う
あとmanを読む

80 :76:2009/05/21(木) 17:28:06 ID:ZE+yaPSj
>>79
ありがとう。でも読むのめんどくさいです。退散します

81 :login:Penguin:2009/05/21(木) 18:06:18 ID:YOkJVZm9
>>76=77=80
氏ね

82 :login:Penguin:2009/05/21(木) 18:19:28 ID:Ed3fgcAs
>>81
おれも思った

83 :login:Penguin:2009/05/21(木) 18:33:46 ID:X//3znla
>>76です。

今度はネットカフェから書き込んでいます。
>>77, >>80は僕ではありません。
信じてください ><

84 :login:Penguin:2009/05/21(木) 18:41:39 ID:W9MVWV0e
イエーイ、教授見てる〜?

85 :login:Penguin:2009/05/21(木) 18:45:00 ID:50DHcUbO
じつを言うと>>76は俺
信じてくれなくても良い

86 :login:Penguin:2009/05/28(木) 23:08:08 ID:MG6SQpHS
ディレクトリ構造を保持して特定のファイルをコピーするにはどうすれば良いでしょうか?
cp -a a/b/c/d.txt e/
とやると e/d.txt となってしまいます。
e/a/b/c/d.txt となって欲しいのですが。



87 :login:Penguin:2009/05/28(木) 23:14:48 ID:OYPHtyPP
>>86
tar cvz a/b/c/d.txt | tar xvzf -C e/ -

88 :86:2009/05/28(木) 23:50:32 ID:MG6SQpHS
>>87 Thx!

89 :login:Penguin:2009/05/29(金) 00:01:04 ID:rPFmiLnc
一方ロシアは--parentsを使った

90 :login:Penguin:2009/05/29(金) 01:25:22 ID:H2hlYKbU
出遅れた
echo a/b/c/d.txt|cpio -p e

91 :login:Penguin:2009/05/29(金) 20:09:43 ID:ZTU2Uga5
rsync -aR a/b/c/d.txt e/

92 :login:Penguin:2009/06/15(月) 15:03:52 ID:An1qKLCY
くだスレから移動してきました。

bashで
(for i in a b c d; do
X
done) | A | xargs B ;
C;

のような処理を行ったとき、B の処理をまだやっているうちに
Cの処理に移ってしまうのですが、Bの処理が終わるのを
待つようにするにはどのようにすればよいのでしょうか?

これまではそんな動作はありえない思っていたのですが、Cで
ps で確認すると、B がまだ動いています。

もしバグだとすると、bash,libc,kernelのどのあたりになるでしょうか。
その確認方法はなにかありますか?

93 :login:Penguin:2009/06/15(月) 15:51:41 ID:FRq6RhHc
>>92
bashが待つのはBじゃなくてxargsの終了だからその辺でなんかあるのかもしれんが、
とりあえずその状態のときの各プロセスの親プロセス番号を確認したいところだな。

94 :login:Penguin:2009/06/15(月) 17:00:15 ID:An1qKLCY
>>93
ありがとうございます。Bの親はinitになってました。
xargsが勝手に終了してしまうのが問題みたいですね。
その辺調べてみます。

95 :login:Penguin:2009/06/15(月) 20:49:11 ID:oAD3AKfh
初歩的な質問ですみません。readコマンドについてです。

#!/bin/bash

ls * | while read result
do
echo $result
done

と書くとカレントディレクトリの内容がechoで表示されます。

これを
ls * | read result ; echo $result
と書いても同じように出力されそうな気がするのですが、
空行がでて終わってしまいます。
何が違うのでしょうか?


96 :login:Penguin:2009/06/15(月) 22:25:53 ID:FILO8IMv
後者は1行しか読んでないんじゃない?

97 :login:Penguin:2009/06/16(火) 01:01:11 ID:nzUvvcuW
>>95
http://www.faqs.org/faqs/unix-faq/faq/part3/section-8.html

98 :login:Penguin:2009/06/18(木) 15:45:23 ID:dQ4OojSv

#!/bin/sh

for FILE in "$@"
do
if [ -f $FILE ]; then
echo "$FILE is a file"
fi
done

だと、$FILE変数には、引数の記述により、相対パスも絶対パスもありえます。
$FILE変数を絶対パスに変換する方法はあるでしょうか?


99 :login:Penguin:2009/06/18(木) 15:53:07 ID:s3sHtQVu
>>98
あれば realpath

100 :login:Penguin:2009/06/18(木) 15:59:02 ID:dQ4OojSv
>>99 ないっす。

101 :login:Penguin:2009/06/18(木) 16:21:59 ID:0zcffroC
>>98
readlink -f


102 :login:Penguin:2009/06/18(木) 16:44:51 ID:dQ4OojSv
>>101 古いLinuxでreadlinkはシンボリックリンクのときのみ動作でした。

#!/bin/sh

W_PWD=`pwd`

for FILE in "$@"
do
if [ -f $FILE ]; then
cd $W_PWD
abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE)
echo "$abpath is a file"
fi
done

しょうがないので、プログラムしてみた。
これで、$abpath に絶対パスが入るようになった。
シェルスクリプト暦浅いのだが、ベテランから見て問題なさそう?

103 :login:Penguin:2009/06/18(木) 17:05:37 ID:aPpB1FUW
kshだとrealpathはビルトインなのね

104 :login:Penguin:2009/06/18(木) 17:09:36 ID:aPpB1FUW
無かったスマソ

105 :login:Penguin:2009/06/18(木) 17:23:14 ID:dQ4OojSv
#!/bin/sh

for FILE in "$@"
do
if [ -f $FILE ]; then
abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE)
echo "$abpath is a file"
fi
done

これでいいんだ。

106 :login:Penguin:2009/06/18(木) 17:49:22 ID:S07Tjv1V
いや、ファイル名に空白あったらアウト

変数は基本""で囲む
お兄さんとの約束だ

107 :login:Penguin:2009/06/18(木) 18:59:36 ID:dQ4OojSv
なるほど。

ありがとうございました。

108 :login:Penguin:2009/06/18(木) 19:18:06 ID:dQ4OojSv
おっと、ひとつ質問良いですか?

abpath=$(cd $(dirname $FILE) && pwd)/$(basename $FILE)

この後、カレントディレクトリ変わらないのはなぜですか?

109 :login:Penguin:2009/06/18(木) 20:19:19 ID:S07Tjv1V
cdしているのはサブシェルだから

110 :login:Penguin:2009/06/18(木) 20:26:28 ID:dQ4OojSv
調べてました。
()の中はサブシェルによって実行されるんですね。

111 :login:Penguin:2009/06/18(木) 22:56:25 ID:dQ4OojSv
>>98 です。
諸兄のおかげで、無事目的通りのスクリプトが組めました。
今後かなり作業効率が向上します。

感謝


112 :login:Penguin:2009/06/23(火) 22:19:47 ID:c8G3nrDU
bashの勉強のために、JMの該当するmanページをw3mで見るスクリプトを書いています。
ダブルクォーテーションの使い方など、細かいところも添削お願いできますでしょうか。

#!/bin/bash
# @(#) man on linux.or.jp
#
COMMAND=`which w3m`
PAGE=
SECTION=
SECT=("on" "on" "on" "on" "on" "on" "on" "on")
SECTURL=
BASEURL="http://search.linux.or.jp/cgi-bin/JM/man.cgi?"
URL=
if [ \( ! -e "$COMMAND" \) -o \( ! -x "$COMMAND" \) ]; then
echo "not installed w3m"
exit 1
fi

while getopts S:h OPT
do
case $OPT in
S) SECT=("off" "off" "off" "off" "off" "off" "off" "off")
SECTION=$(expr $OPTARG - 1 2>/dev/null)
if [ $? = 2 ]; then
echo "secion number is invalid. exit."
exit 2
fi
SECT[$SECTION]="on";;
h | ?) printf "Usage: %s: [-S secion] page\n" $0
exit 2;;
esac
done

113 :112:2009/06/23(火) 22:21:09 ID:c8G3nrDU
shift $(($OPTIND - 1))
PAGE="$1"
if [ x$PAGE == x ]; then
echo "What manual page do you want?"
exit 1
fi

i=1
for onoff in ${SECT[@]}; do
if [ x"$onoff" = x"on" ]; then
SECTURL="$SECTURL"'&Sec'"$i"'='"$onoff"
fi
i=$(expr $i + 1)
done
URL="${BASEURL}"'Pagename='"${PAGE}"'&submit=Search%21'$SECTURL

$COMMAND "$URL"

よろしくお願いします。

114 :login:Penguin:2009/06/23(火) 23:37:11 ID:iNYrdW4A
120点

115 :login:Penguin:2009/06/23(火) 23:41:00 ID:9feAjnJ4
bash限定(shで使わない)なら、外部コマンドよりbashの内部コマンドを使った方が速くなりますよ。
i=$(expr $i + 1) → ((i++)) とか。

116 :login:Penguin:2009/06/24(水) 00:57:03 ID:23DWLrsu
for (( expr1 ; expr2 ; expr3 )) ; do list ; done

117 :112:2009/06/24(水) 01:41:57 ID:B7cQg4Om
>>114-116 ありがとうございます。
早速、(( ))を使って書き直しました。
10万までインクリメントしていくだけのスクリプトで
速度を計測してみたのですが、全然違うのですね!
./tmp.sh 4.64s user 0.10s system 99% cpu 4.788 total
./tmp.sh 92.07s user 111.03s system 96% cpu 3:31.31 total
exprの方(下の方)が遅いです。

それと一貫性が無いように感じたので、1行目のwhichの文を$(which w3m)としました。
また、bashを見てみると[[ ]]という組み込みの評価式があったので、
if [ \( ! -e "$COMMAND" \) -o \( ! -x "$COMMAND" \) ]; then
という部分を変更しました。
if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then
これも計測してみたら、若干ですが[[ ]]の方が速かったです。

>>116で挙げられた記法を使用したことで変数が1つ減りました。

こんな感じになりました。
#!/bin/bash
# @(#) man on linux.or.jp
#
COMMAND=$(which w3m)
PAGE=
SECTION=
SECT=("on" "on" "on" "on" "on" "on" "on" "on")
SECTURL=
BASEURL="http://search.linux.or.jp/cgi-bin/JM/man.cgi?"
URL=
if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then
echo "not installed w3m"
exit 1
fi

118 :112:2009/06/24(水) 01:45:08 ID:B7cQg4Om
while getopts S:h OPT
do
case $OPT in
S) SECT=("off" "off" "off" "off" "off" "off" "off" "off")
SECTION=$(expr $OPTARG - 1 2>/dev/null)
if [[ $? == 2 ]]; then
echo "secion number is invalid. exit."
exit 2
fi
SECT[$SECTION]="on";;
h | ?) printf "Usage: %s: [-S secion] page\n" $0
exit 2;;
esac
done
shift $(($OPTIND - 1))
PAGE="$1"
if [[ x$PAGE == x ]]; then
echo "What manual page do you want?"
exit 1
fi

for ((i=1; i<${#SECT[@]}; i++))
do
if [[ x"${SECT[i-1]}" = x"on" ]]; then
SECTURL="$SECTURL"'&Sec'"$i"'='"${SECT[$((i-1))]}"
fi
done
URL="${BASEURL}"'Pagename='"${PAGE}"'&submit=Search%21'"$SECTURL"
$COMMAND "$URL"
変数が空の場合だったらとかスペースが含まれていたらとか、その辺りをよく理解しておらず、
とりあえずダブルクォートしてたりするのですが、無駄な部分があったりしますでしょうか。
細かい部分でも構いませんので、訂正していただけると嬉しいです。長文失礼しました。

119 :login:Penguin:2009/06/24(水) 02:04:47 ID:aKYWDWvt
そのままでも全然いいと思うよ(^_^)

120 :login:Penguin:2009/06/24(水) 08:42:54 ID:CrOO7ztU
COMMAND=$(which w3m)

COMMAND=$(command -v w3m)
で外部コマンドはサヨウナラ

SECTION=$(expr $OPTARG - 1 2>/dev/null)
if [[ $? == 2 ]]; then
echo "secion number is invalid. exit."
exit 2
fi

let SECTION="OPTARG - 1" 2>/dev/null
case $SECTION in
[0-7]) :;;
*) echo "secion number is invalid. exit."
exit 1;;
esac
で外部コマンドはサヨウナラ

if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then

if [[ ! -x "$COMMAND" ]]; then
で十分だと思うが

121 :login:Penguin:2009/06/24(水) 09:19:46 ID:aKYWDWvt
>>120
> COMMAND=$(command -v w3m)
w3mがaliasされてたらwhichと結果がかわるよ

122 :login:Penguin:2009/06/24(水) 09:37:52 ID:BWmtmrUC
bashってtypeないの?

123 :112:2009/06/24(水) 13:57:32 ID:qAybS9Ki
>119-122 レスありがとうございます。
今回作ったスクリプトでJMのbashを見ながら、こんな風にしてみました。
INTERRUPT=0
COMMAND=$(
 if [[ $(builtin type -t w3m) != "file" ]]; then
   echo "may not installed w3m" >&2
   INTERRUPT=1
   exit 1
 fi
 IFS=' '
 set $(builtin type w3m)
 echo $3
)
if [[ $INTERRUPT == 1 ]]; then
exit 1
fi
unset INTERRUPT
こんなトリッキーなものを書いたのは初めてですが、これでエイリアスの場合も大丈夫でしょうか?
# .bashrcにalias w3m='ls -l'と書いてみたのですが、
# type -tの結果がaliasになりませんでした。何故なのでしょうか...

letは目から鱗でした。
「数字じゃない文字列が入力された時」(例えば"aaa"とか)
をキャッチするために$?==2を使いたかったので、敢えて$(( ))を使えず、$( )を使っていました。
ですが、「セクション番号以外が入力された時」とまとめてしまえば、もっと安全ですね。
一貫性持たせるためにletを使わずにSECTION=$((OPTARG - 1));case云々...esac;
とできるか、と思いましたが、letも数字から始まっている文字列("3aa"とか)
だったりすると標準エラーに吐くのですね。便利です。let。

ファイルテストの部分は仰る通りです。わたしの勘違いです。
ご意見ありがとうございます。

124 :login:Penguin:2009/06/24(水) 14:40:30 ID:BWmtmrUC
>>123
そんな面倒なことはせんでもええ

if ! type -P w3m >/dev/null; then
echo '(# ゚Д゚)'
fi

125 :112:2009/06/24(水) 17:05:52 ID:qAybS9Ki
何度もすみません。

Pオプションが、原文のman bashにしか書いようで、
書いてある英語がよく分からないのですけれど (-_-A;
こういうことが書いてあるんでしょうか?

pオプションは、エイリアスとか関数があったら何も返さないけれど、
そういう時でもPオプションは、ファイルだけを対象にしてそのパスを表示する。
間違ってたら恥ずかしいです。

if ! COMMAND=$(builtin type -P w3m 2> /dev/null); then
 if [[ ! -x $COMMAND ]]; then
   echo "not installed w3m" >&2
   exit 1
 fi
fi
ファイルテストと合わせて、COMMANDを取得するところはこんな感じになりました。
他は、>>117,118と同じです。

126 :login:Penguin:2009/06/24(水) 19:01:09 ID:h5ARTQfu
aliasにするには同シェルスクリプトファイル内に書くか.を使うか
例えばこう
shopt -s expand_aliases
. ~/.bashrc
type -t w3m

SECTURL="$SECTURL"'&Sec'"$i"'='"${SECT[$((i-1))]}"
みたいなのは
SECTURL="$SECTURL"\&Sec"$i"\="${SECT[$((i - 1))]}"
とエスケープ使ったほうが読みやすいかもな

127 :login:Penguin:2009/06/24(水) 19:29:28 ID:w4EkT5LC
>>126
俺は関数化して環境登録することが多いです。
function w3m() {
  ls -l
}
export -f w3m

128 :login:Penguin:2009/06/26(金) 01:44:08 ID:+M5S3VDp
質問です。前処理をして、
http://www.youtube.com/get_video?video_id=-AKQ6CUJa90&t=vjVQa1PpcFP1kWNkoPQ7xks6cfYQ2Ttsd-nzkuvfQsw=&el=detailpage&ps=
のようなURLを列挙したファイル(you.txt)を用意してあり、
yt=$(cat you.txt | sed -e "s/&t.*//g; s/^.*video_id=//g") && \
wget -O $yt.flv -c -i you.txt
で動作させた場合、
思惑通り一個目は、-AKQ6CUJa90.flv というファイル名で取ってこれるのですが、
二個目以降はファイル名の抽出が働かず、
ローカルに保存されるのは同名のファイル名となってしまいます。
どのようにすれば思惑通りファイルを取ってこれるのでしょうか?


129 :login:Penguin:2009/06/26(金) 02:55:31 ID:5uTursO/
for

130 :login:Penguin:2009/06/26(金) 03:43:24 ID:5uTursO/
for youtube_url in `cat you.txt`; do
wget -c -O "`echo "$youtube_url" | sed 's/video_id=\(.*\)&t\1/g'`.flv" "$youtube_url"
sleep 5
done
でどうでしょうか

131 :login:Penguin:2009/06/26(金) 06:18:01 ID:3RE4KePV
for youtube_url in `cat you.txt`; do
wget -c -O "`echo "$youtube_url" | sed 's/^.*video_id=\(.*\)&t.*$/\1/'`.flv" "$youtube_url"
sleep 5
done
…でどうでしょうか(^_^;)

132 :login:Penguin:2009/06/26(金) 06:31:57 ID:3RE4KePV
id変わってる…(^_^;;)

133 :128:2009/06/26(金) 11:30:36 ID:WtRHx5He
>>130, 131
お知恵を元にして、目的を果たせました。ありがとうございます。
感謝しています。
なお、自分の書き込んだ内容でも、いちおうファイル名の抽出には成功する模様?
試行錯誤してみるのも、面白いですね。ではでは。


134 :login:Penguin:2009/06/30(火) 11:41:15 ID:Iil9pev3
質問です。
現在、kshを使用してテストをしているのですが、
ステップが多すぎて(1k↑)カバレッジを求められてます。

カバレッジツールが無いかグーグル先生に聞いてみましたが
全く引っかからなく・・・

シェルのカバレッジを求めている人はどんな方法で求めていますか?


135 :128:2009/07/01(水) 04:20:50 ID:3OeIBl6N
echo "What terms?"; read terms; terms="${terms// /+}"
T="$HOME"
mkdir -p $T/${terms}
for n in $(seq 0 10); do w3m -dump_source \
"http://images.google.com/images?hl=en&lr=&safe=off&um=1&sa=1&q=${terms}&svnum=30&start=${n}" \
| sed -e 's/","http/\n","http/g; s/","/\n","/g' | grep -E -w "\",\"http:.*.jpg" | sed -e 's/^.*http/http/g' | wget -P $T/${terms} -r -l 1 --timeout=60 --tries=3 -c -e robots=off -U 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' -i -
done


136 :login:Penguin:2009/07/06(月) 22:31:23 ID:tHSUGfrq
( sleep 1h; echo "hello" ) > file

ってやると、fileは1時間openしっ放しになるンすかね?

137 :login:Penguin:2009/07/07(火) 09:03:43 ID:jQkxOO5Q
>>136
なるだろ。lsofとか使って観察してみるといい。

138 :login:Penguin:2009/07/08(水) 01:51:04 ID:SE49fktK
sleep 3600 > file でよくないか?


139 :login:Penguin:2009/07/08(水) 02:18:59 ID:VRCFK11t
お前は何を言っているんだ

140 :136:2009/07/08(水) 07:54:59 ID:77+BAR3B
>>137
だおうもありまとう
>>138
なんでもいいよ!!

141 :login:Penguin:2009/07/12(日) 10:36:19 ID:KKJfcIYB
質問があります.
直接スクリプトの話ではないんですが,
あるファイルに xxx という文字が含まれていなければ xxx を末尾に追記したい,
という場合みなさんどうされています?

grep とか使って条件分けすればできるのはわかるんですが,もっとスマートに
やる方法があれば教えてください.

142 :login:Penguin:2009/07/12(日) 10:37:35 ID:1p3v2qzF
sed

143 :login:Penguin:2009/07/12(日) 10:41:49 ID:1p3v2qzF
ああファイルの話だったか
じゃあ素直にgrep

144 :141:2009/07/12(日) 10:44:36 ID:KKJfcIYB
>>142
それよりは
% grep XXX file || echo XXX >> file
の方がわかりやすい気が.

質問の意図としては,下記のように記述できる nanika コマンドのようなもの
がないか知りたかったです.

% nanika XXX file

145 :login:Penguin:2009/07/12(日) 12:20:21 ID:2S8ITALR
ない

146 :login:Penguin:2009/07/12(日) 12:53:03 ID:VHWHiWuB
>>144
ない。
なぜ nanika XXX file がスマートなのか知りたい。

147 :login:Penguin:2009/07/12(日) 18:16:12 ID:elf51XSl
grep --creeping-deth

148 :login:Penguin:2009/07/12(日) 19:44:16 ID:o8qLTMAv
death
じゃないのか。

149 :login:Penguin:2009/07/12(日) 20:31:41 ID:elf51XSl
>>148
--orz


150 :login:Penguin:2009/07/14(火) 14:57:37 ID:gyyoowtT
nanika() {
while read line
do
case "$line" in
*$1*) return
esac
done <"$2"
echo $1 >>"$2"
}

151 :login:Penguin:2009/07/14(火) 15:44:41 ID:CH7bWn6s
つまらん。

152 :login:Penguin:2009/07/14(火) 21:42:07 ID:LzAZSljQ
:(){ :|:& };:


153 :login:Penguin:2009/07/20(月) 15:40:26 ID:K8L8w1qf
age

154 :login:Penguin:2009/07/20(月) 21:55:40 ID:ae6hxCnx
ps aux | grep processA
でグレップしたプロセスのIDを変数に格納するにはどうかいてやればいいでしょうか?


155 :login:Penguin:2009/07/20(月) 22:11:42 ID:ODKc/pMj
変数=`ps aux | grep processA | gawk '{print $2}'`

156 :login:Penguin:2009/07/20(月) 22:32:09 ID:ae6hxCnx
>>155 ありがとう
特定のプロセスAが起動したら、date >> /home/log
としたいと考えています。ただし、プロセスAは、 grep で把握できるとして、
複数の場合があります。
この場合方法ですが、 ps aux | grep processA | gawk '{print $2}'` | wc -l
でこの帰り値が、0でないとき として if 分で、制御すべきでしょうか?(Whileなどで無限ループしたなかにif を配置)

なにかもっとシンプルな方法ないでしょうか?

157 :login:Penguin:2009/07/20(月) 22:49:46 ID:ODKc/pMj
ああ、改めて見たら
>>154にレスしてるみたいに見えるな。

158 :login:Penguin:2009/07/20(月) 23:01:27 ID:iUvo3V7o
>>156
以下でできるかも

変数=`pgrep プロセスA`
[ -n $変数 ] && date >> /home/log

159 :login:Penguin:2009/07/21(火) 10:43:13 ID:BO90gQOW
>>156
変数に入れる必要あるの?
pgrep processA >/dev/null && date >> /home/log

160 :login:Penguin:2009/07/21(火) 23:11:34 ID:xGYTho7h
pidof
とか使わんの?

161 :login:Penguin:2009/07/23(木) 17:30:46 ID:WFggSjQ8
ここで聞くべきか若干怪しいかと思うのですが、
sudo 経由した場合のみ、特定コマンド(たとえばps)を
一般ユーザ権限で利用させる方法ってないでしょうか?

ps をパーミッション700にしておき、
root以外は使用できなくなる状態へしたいのですが、
sudo 経由した場合のみ使わせたいと思ってます。

162 :login:Penguin:2009/07/23(木) 18:06:19 ID:P+5ig7CA
くだ質池

163 :login:Penguin:2009/07/26(日) 07:44:48 ID:FW8uMlXc
ttaファイルを再生するスクリプトを作ってみました。
一応ちゃんと動くのですが、、、

バックグラウンドで動かしているttaencがエラーで死んだ場合に
(単純な例では$1のファイルがない、とか)
playコマンドが入力を待ち続けてしまうのです。
何かよい方法ないですか?

#! /bin/sh -e

WAV=`mktemp -t $$.wav`
rm -f $WAV
mknod $WAV p
trap "rm -f $WAV" 0
ttaenc -o $WAV "$1" > /dev/null 2>&1 &
play -q $WAV > /dev/null 2>&1



164 :login:Penguin:2009/07/26(日) 08:26:44 ID:BwoYtVgZ
>>163
ifで$?を判定すればいいんじゃないかな

165 :login:Penguin:2009/07/26(日) 09:00:23 ID:VmbGTICm
>>164
コア吐いたらダメっしょ。

trapしたほうがよくね?

166 :163:2009/07/26(日) 09:07:33 ID:FW8uMlXc
>>163 自己レス

playとttaencを両方ともバックグラウンドにし、
ttaencをwaitすることでエラーを捕捉、必要ならplayを停止。
これで解決しました。


#! /bin/sh -e

WAV=`mktemp -t $$.wav`
rm -f $WAV
mknod $WAV p
trap "rm -f $WAV" 0
ttaenc -o $WAV "$1" &
DECODE_PID=$!
play -q $WAV > /dev/null 2>&1 &
PLAY_PID=$!
exec 2> /dev/null
wait $DECODE_PID || (kill -10 $PLAY_PID)

>>164
$?について調べたのですが、バックグラウンドプロセスには効かないようです。
でも、調べる過程で解決の発想を得られました。ありがとう!



167 :login:Penguin:2009/07/30(木) 18:32:54 ID:8kF2jsLv
シェルスクリプト初めて数日ですが、ファイルの書き換えやなんかは検索すると出てくるんですが
選択肢形式の作り方がいまいちわかりません。
lokkitやsystem-config-networkみたいな選択形式を作りたいのですが
何かヒントをいただけないでしょうか?

168 :login:Penguin:2009/07/30(木) 18:37:48 ID:3Jkdy3aR
>>167
whiptail とか?

169 :login:Penguin:2009/07/30(木) 19:33:48 ID:1ZQVAEXh
dialog

170 :login:Penguin:2009/07/30(木) 19:43:13 ID:fH5JNdXj
$ lokkit
bash: lokkit: command not found
$ system-config-network
bash: system-config-network: command not found
$ whiptail
bash: whiptail: command not found
はう??

$ xmessage -button 'nipple,ass' 'which?'

171 :login:Penguin:2009/07/30(木) 20:01:21 ID:3Jkdy3aR
>>170
何が言いたいんだ?

172 :167:2009/07/30(木) 20:08:32 ID:8kF2jsLv
>>168-169
ありがとうございます。
両方とも試してみましたがどちらもライブラリを追加しないと機能しないっぽいですね。
はじめて数日の私にはなかなか敷居が高いようです。
うーん・・・今さわってる環境でライブラリ追加させてもらえると大丈夫だと思いますが
ダメって言われたらアウトっぽいですね・・・。

173 :login:Penguin:2009/07/30(木) 20:10:01 ID:3Jkdy3aR
引き数で渡すとかじゃだめなん?

174 :167:2009/07/30(木) 20:21:04 ID:8kF2jsLv
引数で渡してもいいんですが
項目が少し多いので引数を渡すまでに選択肢で絞りたかったというのがあります。
関連ライブラリがいまいちまだ特定できないですが、道のりは遠そうです・・・

175 :login:Penguin:2009/07/30(木) 20:37:05 ID:w4YhvOQC
>>172
両方とも試してみたって、どうやって試したん?

176 :login:Penguin:2009/07/30(木) 21:09:43 ID:neY1QnOU
シェルスクリプトに詳しいみなさんに聞きたいのですが、
ユーザ追加して第三者に利用させるときに
これ禁止させておけばよい、といったコマンドありますか?
例えば find などです。


177 :login:Penguin:2009/07/30(木) 21:17:05 ID:otd/7QOf
>>176
シェルの内部コマンドだけで相当できるから考えるだけ無駄。

178 :login:Penguin:2009/07/30(木) 21:17:21 ID:uCTsIRNg
なんでfindはだめなの?
TOMOYO入れたら?

179 :login:Penguin:2009/07/30(木) 21:25:06 ID:wVBjHvC9
>>174
コマンドラインに収まらなくてもいいのなら、zenityは?

echo -e "選択肢1\n選択肢2\n選択肢3" | zenity --list --column="項目"

180 :login:Penguin:2009/07/30(木) 23:35:05 ID:zSR6vlNV
>>174
bash 限定でいいなら、
select i in "Yes" "No" "Cancel"; do
[ -n "$i" ] && break
done
case "$i" in
Yes) echo "$i, we can.";;
No) echo "$i, it's so hard.";;
Cancel) echo "...";;
esac


181 :login:Penguin:2009/07/31(金) 00:19:11 ID:eB5hWQQH
$(ls)

`ls`
は同じと考えていいの?

182 :login:Penguin:2009/07/31(金) 01:07:21 ID:dqFrtp13
よくない

183 :login:Penguin:2009/07/31(金) 08:21:07 ID:Q0h6j6GB
同じじゃないのか?

184 :174:2009/07/31(金) 10:38:52 ID:unqMPfm1
>>179
zenityもcommand not foundって言われてしまったので入ってないようです。
ですが選択肢としていろいろと勉強になりました。
ありがとうございます。

>>180
サンプルありがとうございます。
大変勉強になりました。
bash限定ならこのあたりが限界っぽいですね。せめて項目の文字を色分け出来るくらいはしたかったですが
モジュール追加出来ないからって事で先方にはあきらめてもらうようにします。

185 :login:Penguin:2009/07/31(金) 10:47:53 ID:dFOhVUdW
>>182
どう違うの?

186 :login:Penguin:2009/07/31(金) 11:03:30 ID:JVm6T/2T
Bashで設定を変更するものを作ってるんですがCtrl + C とかでプロンプトに抜けられないようにするにはどうすればいいんでしょうか?



187 :login:Penguin:2009/07/31(金) 11:08:16 ID:dFOhVUdW
>>186
trap

188 :186:2009/07/31(金) 11:16:14 ID:JVm6T/2T
>>187
ありがと。

出来ました。

189 :login:Penguin:2009/07/31(金) 16:40:28 ID:YezVKpJb
コンフィグ情報から
DEVICEとIPADDRだけを抜き出したいのですが下記だとDEVICEの行が5行表示され
ます。
構文が間違っているからだと思いますがアドバイスもらえないでしょうか。

eth0=/etc/sysconfig/network-scripts/ifcfg-eth0
while read eth0
do
echo $eth0 | sed -n '/DEVICE/p' /etc/sysconfig/network-scripts/ifcfg-eth0
done < /etc/sysconfig/network-scripts/ifcfg-eth0

190 :login:Penguin:2009/07/31(金) 16:49:00 ID:Q0h6j6GB
sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0

191 :login:Penguin:2009/07/31(金) 16:51:37 ID:dFOhVUdW
なんで何度も /etc/sysconfig/network-scripts/ifcfg-eth0 を書いてんだろ。

192 :login:Penguin:2009/07/31(金) 16:52:11 ID:sKGfGulX
>>189
答え先に書かれちゃったか。

1行目のeth0はどこで使ってるの?とか、whileでループさせる意味は?とか
ちょっと落ち着いて考えた方が良い

193 :login:Penguin:2009/07/31(金) 16:56:53 ID:IvZ7j8yJ
>>189
今後の為に基礎から勉強しなおしてきた方がいいよ

194 :login:Penguin:2009/07/31(金) 16:57:14 ID:6mUE4jrQ
> 1行目のeth0はどこで使ってるの?とか、whileでループさせる意味は?とか
> ちょっと落ち着いて考えた方が良い

落ち着いて考えてもわかんねーよ
1行目のeth0がどこにも使われてないのはわかるけど

195 :189:2009/07/31(金) 17:37:11 ID:YezVKpJb
みなさん回答ありがとうございます。
改めて見ると意味わからないことしてました。
下記のコードで意図する事ができました。
ありがとうございました。

while read
do
echo | sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0
break
done < /etc/sysconfig/network-scripts/ifcfg-eth0

196 :login:Penguin:2009/07/31(金) 17:45:29 ID:sKGfGulX
>>195
全力で釣られてやる。

>>190 さんが書いてるように、sed1行でいける
sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0

whileしたあげくに無条件でbreakとか意味わからん。
各行で何をしているのかもう少し考えよう

197 :login:Penguin:2009/07/31(金) 20:49:41 ID:M2gWEg8T
>>195
まずその「よく分からないけどとにかく丸写しでそれらしく作っとけばいいだろう」
という思想を改めるべきだな。

198 :login:Penguin:2009/07/31(金) 21:59:52 ID:JVm6T/2T
何やら上でもsedの質問出てますが質問させてください。
sedでtet.txt内にあるhogeをhogehogeに書き換えるものをつくりました。

sed -i 's/hoge/hogehoge/g' /tmp/test.txt

次にhogeとhogehogeの部分を変数にしたのですが今度は書き換わってくれません。
$aにはhoge
$bにはhogehoge
sed -i 's/$a/$b/g' /tmp/test.txt

test.txtを見ると更新はされているので何らかのアクションがあるみたいなんで
すが何か指定方法間違ってますでしょうか?




199 :login:Penguin:2009/07/31(金) 22:03:23 ID:Y1b6fdMF
sed -i "s/$a/$b/g" /tmp/test.txt

200 :login:Penguin:2009/07/31(金) 22:06:26 ID:Gbr9waoH
>>199
""だとシェル変数展開されないっすか?

201 :sage:2009/08/01(土) 01:27:09 ID:2gkCvOw5
シェルでリスタートとかかけると
活性化しますとか表示されるんですが、これ表示させないようにする方法ありますか?
/dev/nullとかしても表示されたので表示させない方法あれば教えてください。

202 :login:Penguin:2009/08/01(土) 01:38:27 ID:MXySzGMG
>>201
使ってるディストリのスレへ。

203 :login:Penguin:2009/08/01(土) 02:29:31 ID:SZCdXM7k
>>198
$ a='hoge'
$ b='hogehoge'
$ cat >/tmp/test.txt
hogepiyo$a$b$c
$ sed -i 's/$a/$b/g' /tmp/test.txt
$ cat /tmp/test.txt
hogepiyo$b$b$c # hogeはそのまま、$aは$bに。
$ cat >/tmp/test.txt
hogepiyo$a$b$c
$ sed -i "s/$a/$b/g" /tmp/test.txt
$ cat /tmp/test.txt
hogehogepiyo$a$b$c # hogeがhogehogeに、$aはそのまま。

204 :login:Penguin:2009/08/01(土) 04:42:15 ID:SZCdXM7k
>>181
入れ子のとき注意がいる。
$ echo $(echo a:$(echo b:$(echo c:$(echo d))))
a:b:c:d
$ echo `echo a:`echo b:`echo c:`echo d````
a:echo b:c:echo d
$ echo `echo a:\`echo b:\\\`echo c:\\\\\\\`echo d\\\\\\\`\\\`\``
a:b:c:d

205 :login:Penguin:2009/08/02(日) 01:23:15 ID:tM/nSNrk
画面を切り替えたりするとselect文が数行表示されない(実際には選択は出来る)ことが
よくあるんですが、データの受信が表示までに間に合ってないような感じです。
これを避ける方法などはあるんでしょうか?
使用しているターミナルはPoderosaになります。

206 :login:Penguin:2009/08/03(月) 09:09:05 ID:J0mTyN5X
今までbashでスクリプト組んで表示はExiteで翻訳とか適当にコピペってたのですが
シェルスクリプトって日本語表示出来ますか?
お偉いさんが英語じゃわからんとかぬかしやがったので・・・

207 :login:Penguin:2009/08/03(月) 09:14:24 ID:+8DYA08E
>>206
文字コード決めうちでよければ比較的簡単だな。

問題はそれで表示できるかどうかは実行する人が
使ってるターミナルに依存するということだ。一般的に
やろうとするとロケール見て切り替えみたいなことを
しなきゃならないが結構面倒だね。

ま、お偉いさんの環境に合わせておけばいいんじゃね?

208 :206:2009/08/03(月) 09:29:50 ID:J0mTyN5X
>>207
やっぱりそうですよね。
アクセスしてきたターミナルの文字コードを判別してとか切り替えられればいいんですが
さすがに無理ですよね。

お偉いさんだけじゃなくてユーザーも使うんで文字コードって混在してるんですよね。
標準的な文字コードってどんなの使われてるのかはよくわかりませんが
まぁ無理って方向で進めていこうかと思います。

ありがとうございます。

209 :login:Penguin:2009/08/03(月) 09:57:12 ID:pu8sCNil
ローマ字でいいんじゃね。

210 :login:Penguin:2009/08/03(月) 10:31:49 ID:3RzsW8i/
exciteのわけわからん翻訳貼り付けるのは
ユーザーが可哀想だろw
自分の英語に自信が持てないなら、いっそ日本語の方がいいんじゃね。

そのディストリビューションで日本語選んでインストールしたとき
デフォルトになる文字コード選んどけば
誰も文句いわないんじゃね?
自分でLANGいじるようなやつは、文字化けのなおしかたぐらい知ってるだろ。

211 :login:Penguin:2009/08/03(月) 10:52:42 ID:3RzsW8i/
なんか変だ。
ユーザー作ったときデフォルトでなってる文字コードにしとけばいいんじゃね、だ。
LANGとかLANGUAGEとかいじるやつは文字化けの直し方ぐらい知ってるだろ。
デフォルトがCとかenとかなら…シラネ

212 :login:Penguin:2009/08/04(火) 12:15:50 ID:OyyR8ocQ
動けばいいって程度で作ってたものをどうやら他にもリリースするとかで見栄えをよくしろと言われました。
bashで文字を寄せたり全体を中央寄せにしたりするコマンドとか関数ってありますか?

213 :login:Penguin:2009/08/04(火) 12:53:29 ID:h5jokg18
COLUMNS見て計算する。

いっそwhiptailやdialog使うとかな。

214 :login:Penguin:2009/08/04(火) 21:45:57 ID:1cLNSoFd
printf ?
あとよく知らないけど fmt とか groff とか?

215 :212:2009/08/04(火) 22:25:14 ID:OyyR8ocQ
>>213
文字数はじき出して何とか出来ました。

あとスクリプトの中で
/etc/rc.d/network restart
といれているんですが、手動で/etc/rc.d/network restartすると大丈夫なんですが
#!/bin/bash
/etc/rc.d/network restart
とかで実行するとshould not be world writeable users cannnot control this device
と表示されて実行されていないようです。
権限の問題かと思い色々と変えてみましたがダメでした。
なにか他に注意すべき点があればご教示いただければと思います。

216 :login:Penguin:2009/08/04(火) 22:32:07 ID:ACq2bWOB
> 色々と変えてみましたがダメでした。

そりゃダメだろうな。


217 :login:Penguin:2009/08/04(火) 22:49:56 ID:p9z/5JkD
もしかして: should not be world writable users cannot control this device

218 :212:2009/08/05(水) 09:09:45 ID:Sso6+/38
>>217
すいません
スペル間違えてました。
217で記述されている内容が表示されておりました。

219 :login:Penguin:2009/08/05(水) 09:38:19 ID:gztfuFMV
いろいろgrepしたけどうちのマシンには
そのメッセージを吐くプログラムは入ってないようだ。

ディストリビューションと、どのプログラム/スクリプトが
そのメッセージ出してるか書けば?

ちなみにそのスクリプトはrootで実行してるんだよね?

220 :212:2009/08/05(水) 10:47:05 ID:Sso6+/38
>>219
すいません。
CentOS5.3 です。スクリプト内容は膨大なのですがエラーが出る場所は
/etc/rc.d/init.d/network restart
の部分になります。
実行しているのは別のユーザーでてっきりrootで実行してるもんだと思ったら別ユーザーで実行していたようです。
ファイルは
-rwxr-xr-x 1 root root 1234 7月 31 00:00 test.sh
実際に実行していたログインユーザーはtestというユーザーでした。
上記の事とエラー内容から権限がないために出ていると思います。
testユーザーでもrestartをかけれる権限を付与するか、testユーザーを
rootのグループに入れるような事が出来れば出来そうな気もしますが自分には少しレベルが高そうですね。

221 :login:Penguin:2009/08/05(水) 13:12:18 ID:gztfuFMV
のりピーが心配で仕事が手に着かない。

init.dのスクリプトは一般ユーザーが使うようには出来てない。
仮にパーミッション緩めまくって実行できるようにしても、
インターフェースの設定はuid=0じゃないと出来ないので
どこかで権限を昇格するかrootのプロセスに引き継ぐかしないと行けない。

具体的な実装方法の話に入ると、
そもそも一般ユーザーがインターフェースupdownする必要が
本当にあるのかという事から検討したくなって
長くなりそうなのでとりあえずがんばれと言っておく。

222 :219:2009/08/05(水) 13:35:06 ID:Sso6+/38
>>221
ありがとうございます。
ネットワークの設定を一般ユーザー(といっても特定のユーザーのみですが)
が出来るようにしたいと思っております。
そんなに頻繁にあるわけではないのですがroot権限を持ったものが常駐しているわけでは
ないということもありましたのでネットワーク周りだけを触るスクリプトを組みました。
権限の昇格やrootのプロセスをシェルスクリプトで引き継げるようであれば行いたいと思います。
ご存じのかたおられましたらアドバイスいただけると助かります。

223 :login:Penguin:2009/08/05(水) 14:02:44 ID:gztfuFMV
そのぐらいならsudoでどぞ。

224 :login:Penguin:2009/08/05(水) 21:35:22 ID:dz5dEKuL
>>222
ifcfg-eth0とかに「USERCTL=yes」でroot以外でもできそう
http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/ja/ref-guide/s1-networkscripts-interfaces.html

225 :login:Penguin:2009/08/08(土) 16:14:34 ID:Nnr+lme9
rebootやshutdownはrootでなくても使用できるんでしょうか?
試しにrootではないsampleユーザーで
#!/bin/bash
reboot
を実行させたら再起動かかったんですが、てっきり弾かれるかパスワード聞かれると思ってました。
上のほうで権限がどうのこうのって質問があったんですが、OSとかによって違うってことですかね。

226 :login:Penguin:2009/08/09(日) 11:26:19 ID:1P+Q9AS+
そんなのあんの?
rebootやshutdownは管理者権限だろ

227 :login:Penguin:2009/08/09(日) 11:34:22 ID:IkGSFCMm
sudoersに書いてたとしてもsudo rebootじゃないと駄目だろうし
何だろ

228 :login:Penguin:2009/08/09(日) 11:46:08 ID:0aZIEnpY
>>225
rebootはできてもshutdownはできないんじゃない?

229 :login:Penguin:2009/08/09(日) 12:55:17 ID:aaFRdfIZ
ディストリ次第じゃないんですか。Debian ではできないみたいだけど、Vine では
一般ユーザでも shutdown できる (Red Hat 系はみんなできるのかも)。Vine の場合、
/usr/bin/shutdown はシェルスクリプトで、中で halt や reboot を呼び出している。
そして、この halt や reboot はリンクで、実体は /usr/bin/consolehelper。
あとは、man consolehelper ですね。

230 : ◆Zsh/ladOX. :2009/08/09(日) 14:01:11 ID:/ZeBm1qf
んーできない。

% cat /etc/redhat-release
CentOS release 5.3 (Final)
% id
uid=500(hage) gid=500(hage) 所属グループ=500(hoge) context=user_u:system_r:unconfined_t
% /sbin/shutdown -r now
shutdown: you must be root to do that!
% /sbin/reboot
reboot: must be superuser.


231 :229:2009/08/09(日) 14:18:48 ID:PRPNML+y
>>230
CentOS の場合、/sbin/shutdown じゃなくて、/usr/bin/shutdown はないんですか。
だとしたら、Vine だけなのかな。たしか、「一般ユーザに電源をぶち切られるより、
shutdown を許した方がマシだ」という考えだったと思います。

232 : ◆Zsh/ladOX. :2009/08/09(日) 14:27:23 ID:/ZeBm1qf
% /usr/bin/shutdown -r now
zsh: そのようなファイルやディレクトリはありません: /usr/bin/shutdown
% locate shutdown|grep bin
/sbin/shutdown
/usr/bin/pm-shutdown

なんで無いね。


233 :login:Penguin:2009/08/09(日) 16:35:29 ID:CB8fkMOP
# ながいこと Vine しか使ってないから他のディストリのことはわからない。

>>225
シェルスクリプトの "reboot" を
/sbin/reboot とか /usr/bin/reboot とかに書き換えてみると動作に違いがでると思う。

> 権限
pam って仕組みで管理されてると思う。/etc/pam.d/ 以下のファイル。

>>225-232
Vine だと usermode っていうパッケージに
/usr/bin/consolehelper
/usr/bin/halt
/usr/bin/poweroff
/usr/bin/reboot
/usr/bin/shutdown
/usr/sbin/userhelper
とかいったものが入ってる。usermode-gtk ってパッケージもある。

Description :
usermode パッケージには、一般ユーザが設定されたプログラムをスーパーユー
ザとして実行できるようにするユーザヘルパープログラムが含まれています。

234 :login:Penguin:2009/08/09(日) 22:04:40 ID:ivLlFzN/
シェルスクリプトでコマンド番号を選択したりIPを入力したりするツールつくったんですが、
ctrl+cやIP入力にコマンドを入れてみて実行されるかどうかといった確認はしてみましたが
それ以外にセキュリティやテストしてみるといいことなどあれば教えてください。


235 :login:Penguin:2009/08/09(日) 22:52:55 ID:C0J3iJDt
スクリプト晒して!

236 :login:Penguin:2009/08/09(日) 23:03:57 ID:IVuBeWRI
晒されても答えようがないような。
C-c が入れられたときの正しい処理とか本人でないと知らないし。

237 :234:2009/08/09(日) 23:20:52 ID:ivLlFzN/
>>235
IP以外の文字が入れられたらといった時の処理はまだいれてませんが
下記のような事を繰り返してconfを書き換えて再起動するという感じです。

read newip
$newip="IPADDR=""$newip"
sed -i "s/$oldip/$newip/g" /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/rc.d/init.d/network restart
menufunc


238 :login:Penguin:2009/08/10(月) 00:04:28 ID:CdStD5IJ
>>227
sidを知らんのか。

239 :login:Penguin:2009/08/10(月) 01:28:19 ID:qfqY90wM
a
b
c
...

と一語ごとに改行された一つのテキストファイルを
a b c d e f g h i j k
l m n o ...
と言うように10列ごとに改行するテキストにしたいと思い、
スクリプトを組んだのですが動作が遅く、重くなってしまって困惑しています
どなたかお知恵をお貸しくださると助かります。

#/bin/bash
FILE=$1
LINENUM=`expr 1`
OFILE=/dev/shm/hoge

while read line
do
if [ $LINENUM -lt 10 ];then
echo -n "$line" >> $OFILE
echo -n -e "\t" >> $OFILE
LINENUM=`expr $LINENUM + 1`
else
echo "$line" >> $OFILE
LINENUM=`expr 1`
fi
done <$FILE

240 :login:Penguin:2009/08/10(月) 01:50:52 ID:vmT7yJCz
#!/bin/sh
FILE=$1
OFILE=/dev/shm/hoge
LINENUM=1
while read line
do
if [ $LINENUM -lt 10 ]
then
echo -n "$line"
echo -n -e "\t"
LINENUM=$(( LINENUM + 1 ))
else
echo "$line"
LINENUM=1
fi
done <$FILE >$OFILE

241 :login:Penguin:2009/08/10(月) 02:00:08 ID:qfqY90wM
>>240
ありがとうございます! 処理が覿面に早くなりました!
いちいち書き出さないで最後に一括して書けばよかったんですね…

242 :login:Penguin:2009/08/10(月) 02:10:30 ID:vmT7yJCz
>>241
たぶんexprの呼び出しのほうがコストが高いよ

243 :login:Penguin:2009/08/10(月) 12:26:13 ID:5IcilgjJ
自分で動かすだけならこれでいいやと思ったら、そんだけで改善できたのか…
----
#!/bin/sh
FILE=$1
OFILE=/dev/shm/hoge

sed -e '$!N;$!N;$!N;$!N;$!N;$!N;$!N;$!N;$!N;s/\n/\t/g' <$FILE >$OFILE

244 :login:Penguin:2009/08/10(月) 15:31:57 ID:oeYkUDqx
数字の判定は[0-9]と正規表現使って判定してるんですが
IPアドレスかどうかの判定が出来るような正規表現ってあるんでしょうか。
無い脳みそひねってもいい案が出なかったのであれば教えてください。

245 :login:Penguin:2009/08/10(月) 15:41:18 ID:86RyWVEw
>>244
ググレばサンプルたくさんあるよ。

246 :login:Penguin:2009/08/10(月) 15:59:59 ID:BhLss4cE
お前ならどうするかを教えてやりゃーいいじゃん。

247 :login:Penguin:2009/08/10(月) 16:10:10 ID:sXOG+s90
PowerShell神すぎだろ。
このスレ見てると原始人が石斧振り回してるように見えてくるぜ。

248 :login:Penguin:2009/08/10(月) 17:33:20 ID:6xgY8KY4
僕には端末エミュとシェルの違いもわかってないマヌケが見えます。

249 :login:Penguin:2009/08/11(火) 00:20:03 ID:GKnhcfe3
>>247
型の概念が邪魔。
コマンドが無駄に長い。
重い。

250 :login:Penguin:2009/08/11(火) 00:27:50 ID:4esITO9l
Macのbashもここでいいんでしょうか…
OSは10.5.8です。

test.shを
----
#!/bin/sh

echo $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12
----

とします。
./test.sh 1 2 3 4 5 6 7 8 9 10 11 12
と実行すると素直に
1,2,3,4,5,6,7,8,9,10,11,12
となるのに
./test.sh 1.0 2 3 4 5 6 7 8 9 10 11 12
と小数を入れて実行すると
1.0,2,3,4,5,6,7,8,9,1.00,1.01,1.02
となってしまうのはなぜでしょうか。


251 :login:Penguin:2009/08/11(火) 00:35:21 ID:XDXqx0+D
./test.sh a 2 3 4 5 6 7 8 9 10 11 12
としてごらんなさい

252 :login:Penguin:2009/08/11(火) 01:01:07 ID:4esITO9l
>>251

な、な、な、なんでしかこりは!

はっ!そうか!…

$1,$2...って書いてあるサイトが多いからけっこうな個数使えるのかと思ってました。
ありがとうございました。

253 :login:Penguin:2009/08/11(火) 01:07:27 ID:e9ttEiKp
echo $1,$2,$3,$4,$5,$6,$7,$8,$9,${10},${11},${12}

254 :login:Penguin:2009/08/11(火) 02:19:40 ID:4esITO9l
>>253
$(10)は試したのに${10}は試してませんでした…orz
ありがとうございます。

>>251を受けてshiftを使う対処法を知りました。

10個以上の引数を扱いたいという目的においては、shiftと${10}の善し悪しはあるんでしょうか。


255 :login:Penguin:2009/08/11(火) 02:26:00 ID:MclIhwRq
こーいうトラップがあるからperlに逃げる人が多い

256 :login:Penguin:2009/08/11(火) 02:52:40 ID:e9ttEiKp
>>254
$ man bash
/位置パラメータ
2 桁以上の数値を含む位置パラメータを展開するときには、ブレース ({}) で
囲まなければなりません。

よって${n}が正解だと思います

257 :login:Penguin:2009/08/11(火) 05:29:40 ID:4esITO9l
>>255
僕はこのツンデレな感じが好きです。

>>256
やっぱりそうですよねw
正式名称は位置パラメータかー"引数"という呼び方しか認識してませんでした。


258 :sage:2009/08/11(火) 16:31:12 ID:ggsX9yQb
topコマンドの内容をテキストに書き出したいんですが
top >> /tmp/top.test
とした場合に延々と書き込まれていきます。1度だけtopの内容を取得したいんですが
どのように変更すればよいでしょうか?

259 :login:Penguin:2009/08/11(火) 16:36:53 ID:zgCywBrU
>>258
man top

260 :258:2009/08/11(火) 17:33:42 ID:ggsX9yQb
>>259
すいません。
manにありました。

現在topの内容をテキストに書き出して、テキストをsedで切り出して表示してるんですが
コマンドの戻り値を求めたいと思っておりますが
hogera=$(top -i -n1)
cpu=`sed -n '/Cpu(s)/p' "$hogera"`
こうすると「読み込めません: ファイル名が長すぎます」と出ます。
本来ファイル名の指定なのでうまくいかないのはあたりまえなのですが、
ファイルに書き出す事無くスマートに切り出す方法がありましたら教えてください。

261 :login:Penguin:2009/08/11(火) 17:42:23 ID:zgCywBrU
>>260
いまいちやりたいことがわからんが
cpu=`top -b -n1 | grep '^Cpu'`
か?

262 :258:2009/08/11(火) 17:54:30 ID:ggsX9yQb
>>261
ありがとうございます。
そうか、grepすればいいだけの事ですね。
どうやら無意味にテンパってしまってるようです。

すいません。最後に1つだけ疑問に思っていることがあるのですが
シリアルコンソールで見る画面は横70文字にしとけって言われたんですが
何かそういった規格かなにかあるんでしょうか。検索してみてもそられしいものが
引っかからなかったんですが、70文字だとなかなか厳しいものがあるので
特に根拠のない文字数であるなら超えても構わないのではないかと思っております。

たびたびの質問で申し訳ありませんが、識者の方でご存じの人いたら教えてください。

263 :login:Penguin:2009/08/11(火) 17:55:36 ID:zgCywBrU
>>262
スレ違い。

264 :258:2009/08/11(火) 18:03:42 ID:ggsX9yQb
>>263
解答ありがとうございます。
スレ違いとのことですが、これはどういったスレで質問するのがよろしいのでしょうか。
シェルスクリプトの表示だったのでこちらに投げさせていただいたのですが
どういった方面のスレかだけでも助言いただけないでしょうか。

265 :login:Penguin:2009/08/11(火) 18:07:41 ID:zgCywBrU
>>264
くだらねえ質問はここに書き込め! Part176
http://pc11.2ch.net/test/read.cgi/linux/1246986882/

266 :login:Penguin:2009/08/12(水) 00:03:08 ID:0UM4nevW
>>263
きびしー

267 :login:Penguin:2009/08/12(水) 00:05:03 ID:I1tOnENr
>>264
VGAとかSVGAとか解像度で違うっての聞いたことある。
もしかしたら全然違うかもしれんがそういうときはきっと誰か激しく突っ込んでくれるはず。

268 :login:Penguin:2009/08/12(水) 00:10:31 ID:u9/Em9/R
>>267
ぜんぜん違う話。

269 :login:Penguin:2009/08/12(水) 05:02:52 ID:0UM4nevW
$ cat<<<h$(cat<<<e$(cat<<<l$(cat<<<l)o)\!)

270 :login:Penguin:2009/08/12(水) 14:49:33 ID:/9MBM8gW
特定文字列が含まれてるかどうかの判断って出来ますか?
sedとかで文字の置き換えとか入れ替えが出来る程度のレベルです。
dg=`route | grep '192.168.24.1'`
でdgの中にug含まれているかどうかを確認したいと思ってます。


271 :login:Penguin:2009/08/12(水) 14:51:54 ID:u9/Em9/R
>>270
route | grep '192.168.24.1' | grep ug
ってこと?

272 :login:Penguin:2009/08/12(水) 14:59:52 ID:LZ159q8G
>>270
case "${dg}" in
*ug*)
# match
;;
*)
# not match
;;
esac


273 :270:2009/08/12(水) 15:13:57 ID:/9MBM8gW
>>271
そうでした。パイプでさらにgrepすればよかったですね。
こちらの方法でも出来ました。
ありがとうございます。

>>272
判定までしていただいて助かります。
こちらの方法で出来ました。
ありがとうございます。


まだまだよくわかってないですがここで質問しなくてもすむように勉強したいと思います。

274 :login:Penguin:2009/08/12(水) 18:46:07 ID:jKHDnL7q
シェルスクリプトでサーバーのチェックをしてます。
それ自体はcronで定期的に行ってますが、これと併せて定期的にデータを送信出
来ればと考えてます。
実際にはチェックして引っかかったサーバーにzipを送り、サーバーは時間が来
れば勝手に実行するという感じですが、シェルスクリプトでzipデータを別サー
バーに送るとかいうことが可能でしょうか。
可能ならどんな関数を使えばよいかアドバイスもらえないでしょうか。
初歩的な質問かと思いますが宜しくお願いいたします。



275 :login:Penguin:2009/08/12(水) 18:54:50 ID:8iPFdi1w
金玉 → >>274






。゜( ゜^∀^゜)゜。アーッハハハハノヽノヽノヽノ\ / \

276 :login:Penguin:2009/08/12(水) 21:03:12 ID:0s7n/+F7
>>274
sshの鍵交換してパスワードを聞かれないようにしておいて
scpなりrsyncなりで送れば良いと思う。

277 :login:Penguin:2009/08/12(水) 23:35:06 ID:tCsvaW+m
>>239

これはどう?

#/bin/bash
FILE=$1
OFILE=/dev/shm/hoge
xargs < $FILE -n10 | tr " " "\t" > $OFILE


278 :login:Penguin:2009/08/12(水) 23:40:23 ID:tCsvaW+m
>>277 じこれす

まちがった

xargs < $FILE -n10 | tr ' ' \\t > $OFILE

です。

279 :login:Penguin:2009/08/12(水) 23:56:35 ID:0UM4nevW
すげー

280 :login:Penguin:2009/08/14(金) 09:45:57 ID:vesWTwzQ
変数COUNTER の値が10より小さければ
MMF0009 と表示
100より小さければ
MMF0099 と表示
1000より小さければ
MMF0999 と表示
1000ならば
MMF1000 と表示
というスクリプトをcase 文を用いてすっきり書きたくて下記の通り書きましたが、
算術式及び、case の構文の違いでしょうか間違っています、ご教示願えないでしょうか。

#!/bin/bash
COUNTER=0
DIGIT3=000
DIGIT2=00
DIGIT1=0

while [ ${COUNTER} -lt 999 ]
do
case "$COUNTR" in
`expr ${COUNTER}` -lt 10) echo "MMF$DIGIT3$COUNTER";;
`expr ${COUNTER}` -lt 100) echo "MMF$DIGIT2$COUNTER";;
`expr ${COUNTER}` -lt 1000) echo "MMF$DIGIT1$COUNTER";;
`expr ${COUNTER}` = 1000) echo "MMF$COUNTER";;
esac
COUNTER=`expr ${COUNTER} + 1`
done


281 :login:Penguin:2009/08/14(金) 09:56:51 ID:HEs3iRVc
>>280
manpageより

case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
A case command first expands word, and tries to match it against each pattern in turn,
using the same matching rules as for pathname expansion (see Pathname Expansion below).

282 :login:Penguin:2009/08/14(金) 10:03:19 ID:GRUhI9LP
こういうこと?
seq -f 'MMF%04.f' 0 1000

283 :login:Penguin:2009/08/14(金) 15:19:52 ID:VHMVUNf7
>>280
すっきり書いてみた。

#! /bin/sh
COUNTER="$1"

DIGIT1=000
DIGIT2=00
DIGIT3=0
DIGIT4=
eval 'echo "MMF${DIGIT'"${#COUNTER}"'}${COUNTER}"'


284 :283:2009/08/14(金) 15:31:27 ID:VHMVUNf7
printfがあれば更にすっきり。

#! /bin/sh
COUNTER="$1"

printf 'MMF%04d\n' "${COUNTER}"


285 :login:Penguin:2009/08/14(金) 23:08:31 ID:vesWTwzQ
>>280 です
皆さんどうもありがとうございます。
C のswitch〜case構文のようなものかと勘違いし、case の使い方が全然間違ってましたし他にも細かなミスがありましたが、調べてこんな感じで期待通りの振る舞いができました
case $COUNTR in
?)
echo "MMF$DIGIT3$COUNTER"
??)
echo "MMF$DIGIT2$COUNTER"
??)
echo "MMF$DIGIT1$COUNTER"
1000)
echo "MMF$COUNTER"
esac
それから、seq とかeval の使い方も調べて見ます、どうもありがとう。

286 :login:Penguin:2009/08/14(金) 23:17:06 ID:vesWTwzQ
>>285です
もう一つお願いします。
シェルスクリプト というのは、そのような仕組みになってるんでしょうか?
単純にインタプリタ型の言語なのでしょうか、自分としてはそうではない気がします
なぜなら、sudo コマンドを使う場合、シェルスクリプトの場合、スイッチ を付加して実行しますが
それは直接、カーネルに対してオペレーションしているような気がするのですが?詳しい方が居られましたら教えてください。

287 :login:Penguin:2009/08/14(金) 23:19:32 ID:vesWTwzQ
×シェルスクリプト というのは、そのような仕組みになってるんでしょうか?
○シェルスクリプト というのは、どのような仕組みになってるんでしょうか?

288 :login:Penguin:2009/08/14(金) 23:40:04 ID:4UQz02FW
>>286
>それは直接、カーネルに対してオペレーションしているような気がするのですが?

気のせいです。
手始めにforkとかexecvとか調べたらいいんじゃね?


289 :login:Penguin:2009/08/14(金) 23:56:56 ID:cgRLII5a
インタプリタだよ。

sudoは、シェルとは別のプログラムです。
シェルスクリプト中で、シェルのビルトイン関数やらで無いコマンドを書くと、
シェルは、その名前のプログラムを探してそれを実行しようとします。

上に出てきた中で言うと、
while case echo evalはシェルのビルトイン関数(?)で
seq printf sudoは外部プログラムです。

「カーネルに対してオペレーションしている」云々は、
言っている意味が良く分かりません。
全ての意味のあるプログラムは、直接的にしろ間接的にしろ、
カーネルと相互作用するはずですから。

290 :login:Penguin:2009/08/15(土) 01:56:48 ID:niIslDjl
while, case と echo, eval はくくりが別だけどな。
type while とか type echo とかやってみ。

291 :login:Penguin:2009/08/15(土) 19:58:45 ID:4JYHgxvW
>>286 です
皆さんThxです。

292 :login:Penguin:2009/08/15(土) 23:51:22 ID:O3QLwBfx
read packetcount
read port
tcpdump -n -c$packetcount -s1500 -vvv -X port $port
こんな感じでパケット見てるんですが、1パケットごとに色を変えることは出来ますか?
文字色の指定方法はわかるんですが、そういった指定方法や手法があればおしえてもらえないでしょうか。
なければおとなしくあきらめます。


293 :login:Penguin:2009/08/16(日) 02:00:07 ID:kxH41sn/
>>292
色は無理。
portが読み込まれていない。

294 :login:Penguin:2009/08/16(日) 02:32:16 ID:m+r83sIL
>>292

C1="$(tput setaf 0)"
C2="$(tput setaf 1)"
tcpdump -n -c 10 -s 1500 -vvv -X | while IFS="" read l;do
if [ "$l" = "${l#$'\t'}" ]; then
echo -n "$C1"
A="$C2";C2="$C1";C1="$A"
fi
echo "$l"
done

こんな感じ?
>>293の言っている意味がわからないので外してるかも…。

295 :login:Penguin:2009/08/17(月) 09:43:35 ID:WnQqR0f7
#!/bin/bash
echo -e "|""`top -i -n1 | grep '^Cpu(s)'`""|";
ちょっとおおざっぱですが上記の方法でtopの内容を抜き取ってます。
Windows付属のハイパーターミナルで見ると普通に表示されるのですが、他のターミナルソフトで(tera termとか)で見ると
Cpu(s): 1.2%us, 1.2%sy, 0.0%ni, 96.3%id, 1.1%wa,erial8250: too much work for irq4
0m 0.1%hi, 0.2%si, 0.0%st|
こんな感じで途中にerial8250〜と表示されます。
これを検索してもそれらしいものも出てこず、何が原因かわからないでいます。
原因をご存じの方いましたらヒントかアドバイスもらえると助かります。

296 :login:Penguin:2009/08/17(月) 11:19:54 ID:Pf83pCV6
>>295

コピペ間違ってないかな?
「serial8250: too much work for irq4」なら
次のページが引っかかった。
http://eve-japan.co.jp/demos/linux-boot-demo.html

ターミナルソフトによって異なるのは$TERM の問題なのかな?
表示自体は 単に stderr へのメッセージが表示されてるのか
とおもうけど。「2>/dev/null」とかつけたら 変わるのかな

297 :295:2009/08/17(月) 11:55:51 ID:WnQqR0f7
>>296
文字コードとかの問題でsが抜けてるっぽいです。
ログを見たら同じ記述があったのでメッセージが画面に出てるっぽいですね。
方法としては破棄する(やり方調べないといけないけど)かserial8250: too much work for irq4をsedとかで
消し去るくらいでしょうか。
スマートではないですがとりあえず消し去る方向で行ってみます。
ありがとうございます。

298 :login:Penguin:2009/08/17(月) 12:12:38 ID:cm75eODq
シリアルコンソールだよね?
カーネルがprintkで出してるからsedとかじゃムリだと思う。

消したいなら/proc/sys/kernel/printkをいじるとか。

299 :297:2009/08/17(月) 12:52:29 ID:WnQqR0f7
>>298
ありがとうございます。
調べて6417を5417に替えようとしたら"printk" E667: Fsync failedとか出てきて
書き換えさせてくれませんでした。
解決方法はまだわかってませんがなかなかハードルが高そうです。

300 :297:2009/08/17(月) 13:10:38 ID:WnQqR0f7
補足です。

echo -e "|""`top -i -n1 | grep '^Cpu(s)'`""|";
の部分を消したら表示されなくなりました。
topした時だけ出てるみたいです。理由はわかりませんが。
top内容を >> top.datとかに書き出してそこから引っ張ってくれば
表示されないようになるかもしれません。
根本的な解決にはなってませんが・・・。

301 :300:2009/08/17(月) 17:13:08 ID:WnQqR0f7
さすがにスレ違かと思いますが、/proc/sys/kernel/printkというのはviでの編集は不可ですか?
ググってはいるんですが編集が出来ずに困っております。
もしかしたら凄い見当違いな事を行っているのかもしれませんが解決のヒントもらえると助かります。


302 :login:Penguin:2009/08/17(月) 17:20:05 ID:R0skv6Jz
>>301
さすがにスレ違い。

303 :300:2009/08/17(月) 17:30:37 ID:WnQqR0f7
>>302
すいません。
くだ質に行ってみます。

304 :login:Penguin:2009/08/18(火) 06:39:39 ID:elYCry/8
>>301
echoするもんでしょ。JK。

305 :login:Penguin:2009/08/18(火) 08:01:40 ID:8XgVhYMF
そうか?
sysctl -w kernel/printk=foobar

306 :login:Penguin:2009/08/18(火) 09:35:31 ID:BInCpQzK
もうくだ質に移動したよ。

307 :login:Penguin:2009/08/18(火) 18:39:48 ID:S4j+NJGU
moge.dat
testjama na moji

sakujo="jama na moji"
okikae=""
echo `more /tmp/moge.dat | grep '^test' | sed -i s/$sakujo/$okikae/g`

これでmoge.datの中からtestだけ表示出来るのではないかと思っていたのですが
sed: -e 表現 #1, 文字数 13: 「s」コマンドが終了していません
というエラーが表示されます。オプションで-eも使用していませんし構文的には大丈夫そうに思えたのですが
間違いがあればご指摘いただけないでしょうか。

308 :login:Penguin:2009/08/18(火) 19:03:56 ID:9vBuj+t/
sed 's/jama na moji//g' moge.dat

じゃいかんのか?
なぜechoしたりmoreしたりgrepしたりするのか意味わからん

309 :login:Penguin:2009/08/18(火) 19:12:00 ID:I/MV7qz2
sed の -i はなぜつけているんだい?

310 :307:2009/08/18(火) 19:31:44 ID:S4j+NJGU
>>308
単純にmoreで見た中身をgrepしてそこからさらに削ればいいのかなと思い
検索をしてパイプでつなげただけの状態です。
また説明が足りませんでしたがmoge.datは複数行あってtestから始まる行が
いくつかあったことから素人考えでこのようになりました。

>>309
すいません。
別の場所のsedをコピーしたときについたみたいです。
この場合は必要ないですね。

311 :login:Penguin:2009/08/18(火) 19:37:15 ID:9vBuj+t/
sed '/^test/s|jama na moji||g' moge.dat

312 :login:Penguin:2009/08/18(火) 19:43:42 ID:0jjNf9FI
>>307の直接の答えを言うと、

sed -i s/$sakujo/$okikae/g

sed -i s/jama na moji//g

sed -i 's/jama' 'na' 'moji//g'

と引数4つに解釈されるから。

313 :login:Penguin:2009/08/18(火) 22:00:14 ID:elYCry/8
>>306
マルチって死ねばいいと思う

314 :login:Penguin:2009/08/18(火) 22:23:21 ID:Df7zfcy/
スレ違いを指摘されて移動してるんだから、マルチとは言わないだろ

315 :login:Penguin:2009/08/19(水) 11:19:58 ID:zpPUbNQu
ログをとりたくてmessagesに内容を出すようにしたいのですが
echo "logtest" >> /var/log/messages
としても書き出されません。
このファイルとユーザー自体はrootではないので権限が問題かと思ってます。
このexampleユーザーはwheelに入れており、sudoで%wheel ALL=(ALL) ALLと念のため指定しましたがダメでした。
これは構文自体が間違っているということでしょうか。


316 :login:Penguin:2009/08/19(水) 11:38:22 ID:GJ3CGMhT
>>315
sudo echo "logtest" >> /var/log/messages
とかやったの?
これだと >> 以下は sudo の外にあるから効かない。
sudo sh -c 'echo "logtest" >> /var/log/messages'
とかやればいい。

つーか logger で書いたら。

317 :login:Penguin:2009/08/19(水) 15:03:44 ID:9fjqV7Pu
コマンドの実行結果を>>で適当なテキストに出力して見てみると
[H [J [0;10mtop - 20:06:35 up 51 min, 3 users, load average: 0.00, 0.00, 0.00 [0;10m [39;49m [K
いろんなコマンドでこんな感じになってるんですがこれは何なのでしょうか?
これはtop内容ですがなぜこうなるのかがわかりません。
表示されている文字だけをテキストに出したいのですがどうすればいいでしょう
か。

318 :315:2009/08/19(水) 15:07:02 ID:zpPUbNQu
>>316
素早いレスありがとうございます。
1個の命令として見られていなかったわけですね。
loggerでかけるところはそうしたいのですが、他にもいくつかファイルがあって
そちらでも追記したいと思っておりました。
まだ試してませんがこれでいってみたいと思います。


319 :login:Penguin:2009/08/19(水) 15:08:58 ID:yGi4QWIv
topの人はtopの何を切り出したいのだ?
ロードアベレージ?

320 :login:Penguin:2009/08/19(水) 15:09:49 ID:GJ3CGMhT
>>317
top なら -b で。
>>261 でも書いたはずだが。

321 :login:Penguin:2009/08/19(水) 15:16:10 ID:GJ3CGMhT
>>317
ファイルへの出力は
基本的にはただの文字を順に追記していくだけ。
画面への出力は文字を反転させたり色を変えたり
いったん書いたものを戻って書き直したりする。
画面用の出力をそのままファイルに出すとおかしなことになる。

322 :login:Penguin:2009/08/19(水) 21:31:13 ID:rKA7cUBO
echo "logtest" | sudo tee -a /var/log/messages

teeってマイナー?

323 :login:Penguin:2009/08/19(水) 22:00:23 ID:ZZH7H5sc
いやんバカんな事やってないで、きちんとloggerを使いなさい。

324 :login:Penguin:2009/08/19(水) 22:31:33 ID:S8kRS54+
シェルにloggerなんてあるの?

325 :login:Penguin:2009/08/19(水) 23:54:53 ID:Gto2VsIQ
------------------------- 今からこのスレは外部コマンド禁止になりました -------------------------

326 :login:Penguin:2009/08/20(木) 00:22:53 ID:z7LXRLpP
シェルの組み込みコマンドだけでやれってか?
厳しいな。。

327 :login:Penguin:2009/08/20(木) 10:46:36 ID:D2EfC5ES
>>324
それ言ったら sudo だってないじゃん。

328 :login:Penguin:2009/08/20(木) 11:47:57 ID:tKteNA5S
今、ネットワークカードを通過するトラフィック量をRRDToolを使用してグラフにしたくて
1秒あたりの送信・受信をバイトで求めるスクリプトを書いたつもりなのですが、
これでちゃんと値が求められているのか、自分ではよく分からないのです。
それっぽい感じの値は出てきてるんですが・・。

そこでなのですが「ここが違う」「そもそもそれじゃダメ」などということがありましたら、
教えていただきたく、ここに書き込まさせていただきました。
もし、お時間がありましたら添削していただけると嬉しいです・・・。

func_ethernet()
{
UserName="UserName"
AuthPass="AuthPassWd"
PrivPass="PrivPassWd"
HostName="localhost"
if [ $1 = "send" ]; then
 LogName="/tmp/log-send"
 LogOld=`cat ${LogName} | sed -n 2p`
 LogOldTime=`cat ${LogName} | sed -n 1p`
 date +"%Y-%m-%d %k:%M:%S" > ${LogName}
 /usr/bin/snmpget -a MD5 -A ${AuthPass} -l authPriv -u ${UserName} -x AES -X ${PrivPass} -v 3 ${HostName} .1.3.6.1.2.1.2.2.1.16.2 | awk '{print $NF;}' >> ${LogName}
 LogNew=`cat ${LogName} | sed -n 2p`
 LogNewTime=`cat ${LogName} | sed -n 1p`
 echo | awk '{print ( (newValue - oldValue) / (newTime - oldTime) );}' newValue=${LogNew} oldValue=${LogOld} newTime=`date -d "${LogNewTime}" +"%s"` oldTime=`date -d "${LogOldTime}" +"%s"`
elif [ $1 = "recive" ]; then
 略
fi
}
rrdtool update ${RRD_PATH}/ethernet.rrd N:`func_ethernet send`:`func_ethernet recive`

329 :login:Penguin:2009/08/20(木) 12:00:54 ID:3vJ7EKjF
文字色と背景色ついて質問です。
わかりやすく色をつけてみたのですがこの場合は文字の部分のみが緑文字と黒背景となります。
#!/bin/bash
echo -en "\033[32;40m";
select i in "123" "456"; do
[ -n "$i" ] && break
done
case "$i" in
123) func123;;
456) func456;;
esac
文字ではない部分も黒背景とする事は可能ですか?

330 :login:Penguin:2009/08/20(木) 19:05:04 ID:KNtykgpF
まずエスケープシーケンスを直接指定するのはよくない
端末によってサポートされている機能に違いもあるし

「文字ではない部分」の意味も不明

行単位ということなら

#!/bin/sh
tput setab 0
tput setaf 2
tput el
echo "Hello"

331 :login:Penguin:2009/08/21(金) 00:19:49 ID:F/0U9rwq
文字ではない部分ってのはその通りだろう。
文字の背景の色を指定は出来るが、文字以外のところの背景色はどうすってことじゃね?
\033[32;40mはせめて
ESC=\033[
midori=${ESC}32
とかにしたほうがいいと思う。もっといい方法あればえらい人が教えてくれるはず。



332 :login:Penguin:2009/08/21(金) 00:26:48 ID:korZcQ4D
>>331
tput使えよ。

333 :login:Penguin:2009/08/21(金) 00:34:42 ID:G/rWMdtH
すみませんが組み込みコマンドだけでお願いします

334 :login:Penguin:2009/08/21(金) 00:41:38 ID:korZcQ4D
>>333
busyboxにshとtputが入ってる場合はOK?

335 :login:Penguin:2009/08/21(金) 00:53:50 ID:hq/n18x3
>>331
> 文字の背景の色を指定は出来るが、文字以外のところの背景色はどうすってことじゃね?

だから, 画面全体をそうしたければclearすればいいんじゃね
文字を書き込んでいない*どの部分を*背景色にしたいんだ, って話

336 :331:2009/08/21(金) 07:39:21 ID:F/0U9rwq
tputなんてあるわけね。
シェルに標準でそういうのあるの知らなかったよ。

>>335
文字がかかれてない場所全部じゃね?
ようは画面全体の背景色を指定したいってことだと思うけど。
文字と文字の背景色は\033[32;40mで指定できるけど
それ以外の全体の背景色という意味だと思う。


337 :login:Penguin:2009/08/21(金) 07:45:26 ID:korZcQ4D
>>336
とある端末だとそうですね。


338 :login:Penguin:2009/08/21(金) 11:30:52 ID:90eN5uxA
そういうの意識するほどたくさんの機器がないからだとおもうけど
俺はVT100でだいたい表示されてればOKかな〜とか勝手に思ってる。
ネットワーク機器だとやっぱりまだANSIとかが標準になってたりするのかな?
さすがに最近のネットワーク機器でVT52が標準とかってことはないと信じたいけど。

339 :login:Penguin:2009/08/21(金) 17:12:14 ID:hq/n18x3
>>336
> ようは画面全体の背景色を指定したいってことだと思うけど。

>>335

行単位なら >>330
カーソル位置からscreenの最後までならelの代わりにed使えばいい

340 :login:Penguin:2009/08/21(金) 23:42:11 ID:korZcQ4D
所謂、ブルースクリーンを作りたい。

341 :login:Penguin:2009/08/22(土) 19:41:23 ID:iygx6FPk
# word.lst
あいうえお aiueo
かきくけこ kakikukeko
さしすせそ sasisuseso

#target.txt
なにぬねの
あいうえおキター
たちつてと
さしすせそ
キターかきくけこ

word.lst の区切文字はTAB 、またはSPACE とします
target.txt を一行ずつ読込み、word.lst のキーとなる単語があれば、
置換しdest.txt に出力するシェルスクリプトの書き方を教えて頂けないでしょうか。

#dest.txt
なにぬねの
aiueoキター
たちつてと
sasisuseso
キターkakikukeko

342 :login:Penguin:2009/08/22(土) 19:49:19 ID:+xcsiCNS
まず服を脱ぎます

343 :341:2009/08/22(土) 20:44:33 ID:iygx6FPk
while read line
do
  処理(TARGET=あいうえお、DEST=aiueo)
done < word.lst

例えばこのように、line で読込んだ
あいうえお aiueo
を変数TARGET、 DEST に格納する方法を教えてもらえませんでしょうか。


344 :login:Penguin:2009/08/22(土) 21:14:08 ID:+xcsiCNS
set $line
TARGET=$1 DEST=$2

345 :login:Penguin:2009/08/22(土) 21:44:23 ID:beHpftLf
すぐ書ける簡単なやり方で

#!/bin/sh
while read from to
do
    echo "s|$from|$to|g"
done <word.lst >program
sed -f program <target.txt >dest.txt

346 :login:Penguin:2009/08/22(土) 23:46:26 ID:m2+LmGIC
>>345さん、お世話になります
掲示していただいたスクリプトでの置換ですが、>>341 で掲示したファイルの置換は期待通りの結果になるのですが
下記のような内容のファイルだと全く置換できません、なぜなのでしょうか?

#target.txt
CREATE TABLE `利用明細` (
`伝票番号` INTEGER AUTO_INCREMENT DEFAULT NULL ,
`商品ID` INTEGER DEFAULT NULL ,
`数量` INTEGER DEFAULT NULL ,
PRIMARY KEY (`伝票番号`)
);

#word.lst
伝票番号 DENNPYOUBANGOU
数量 SUURYOU

347 :login:Penguin:2009/08/23(日) 00:31:10 ID:aCd7CupH
>>346 です
解決しました、文字コードを錯誤してました(^^;


348 :login:Penguin:2009/08/26(水) 02:39:26 ID:5uGOu/R4
1000文字ごとに改行を入れる簡単な方法を教えてもらえませんか

349 :login:Penguin:2009/08/26(水) 04:35:48 ID:aiWYMJf6
これ、俺は思いつかない、ラテン文字だけなのか、マルチバイト文字も混在してるのか
こういうのは、やっぱ、perlやrubyが得意だ

350 :login:Penguin:2009/08/26(水) 04:41:51 ID:r5TfqoXR
nkf -f 1000

351 :login:Penguin:2009/08/26(水) 14:07:13 ID:ehP4IQnp
abcdefgabcdefgabc ...
と続く文字列にn文字ごとに「,」を入れてcsvにするにはどうしたらいいですか?

352 :login:Penguin:2009/08/26(水) 14:24:34 ID:LXSFF2c5
echo abcdefghijklmnabcdefghijklmnh | sed 's/\(.\{5\}\)/\1,/g'

353 :login:Penguin:2009/08/26(水) 14:28:23 ID:z6vBIwzM
echo 'abcdefgabcdefgabc' | sed 's/\(.\{変数n\}\)/\1,/g'



354 :login:Penguin:2009/08/26(水) 14:29:09 ID:z6vBIwzM
重複スマソ

355 :login:Penguin:2009/08/26(水) 15:46:39 ID:ehP4IQnp
>>352 >>353
thanx!!

356 :login:Penguin:2009/08/26(水) 18:44:54 ID:whFI2cwY
list.txtのなかにURLが一行ずつあり,
そのURLをw3mでアクセスしてその結果を
URLからhttp://を除いたファイル名で保存したいのですが
#!/bin/sh
FILE=list.txt
while read LINE
do
$OUT=`echo $LINE |sed 's/http:////'`
w3m -dump $LINE > $OUT
done < $FILE

これだとダメになってしまいます.とりあえずlist.txtにはhttp://google.netを入れています.

357 :login:Penguin:2009/08/26(水) 18:54:19 ID:LXSFF2c5
s#http://##
とか区切り文字を変える。
$OUT=
の$は不要。

358 :login:Penguin:2009/08/26(水) 18:54:58 ID:CSCAGJKR
とりあえず$OUTはOUTのtypoだよな
あとはsedのマニュアルでも読んどけ

359 :login:Penguin:2009/08/26(水) 18:59:39 ID:z6vBIwzM
>>356
どうダメなのか具体的に書いてくれないと。
とりあえず sed 's/http:////' はダメ。
区切りに使う文字(ここでは / )はエスケープしないと。

あるいは、違う文字(例えば @)で代用する。
$ echo 'http://www.example.com/' | sed 's@^http://@@'
www.example.com/

360 :login:Penguin:2009/08/26(水) 19:00:34 ID:z6vBIwzM
また重複してしまった。吊ってくる。
λ..

361 :login:Penguin:2009/08/26(水) 19:01:21 ID:whFI2cwY
>>357-358
ありがとうございます.うまくいきました.$OUTはミスです.ありがとうございました.

362 :login:Penguin:2009/08/26(水) 19:03:00 ID:whFI2cwY
>>359
ありがとうございます.区切り文字を変えてうまくいきました.

363 :login:Penguin:2009/08/26(水) 19:03:13 ID:CSCAGJKR
やったね!

364 :login:Penguin:2009/08/26(水) 22:21:29 ID:AG79amBH
UTF-8 BOM が付いててもshスクリプトが動くシェルってある?

365 :login:Penguin:2009/08/26(水) 22:34:36 ID:aJjlwaDy
スレ違い。

366 :login:Penguin:2009/08/26(水) 23:27:14 ID:LXSFF2c5
>>364
別にスレ違いじゃないんじゃね?

カーネルで、ファイルの先頭2バイトが'#!'の場合をスクリプトと
しているのでBOMついてたら実行できない。

sourceしたときって意味なら…試したこと無いからわからん。

367 :login:Penguin:2009/08/27(木) 00:13:17 ID:99inMd3q
>>365
分からないことは全部スレ違いーw

368 :login:Penguin:2009/08/27(木) 00:14:49 ID:99inMd3q
>>366
シェルスクリプトってexecvできるってことか。てっきりsystemで動かしてると思ってた。

369 :login:Penguin:2009/08/27(木) 13:09:03 ID:1TOKv6MA
ファイルを読み込んで最後の5行だけ表示したいんだけど
最後の5行ってのをどうすれば計算できますか?
とりあえず
#!/bin/bash
while read LINE; do
echo $LINE
done < "test.file"
ってので行けると思うんですが、行数カウントとかどうすればいいでしょうか?

370 :login:Penguin:2009/08/27(木) 13:27:38 ID:bqfxDAXQ
tail

371 :login:Penguin:2009/08/27(木) 15:06:58 ID:g/ERTIS/
>>369
一番簡単なのは、tailコマンドに丸投げすること。

初心者だが、シェルスクリプトで書いてみた。
queueを使おうと考えたが、配列の添え字が循環するデータ構造にしてみた。
うまく動きましたよ。

372 :369:2009/08/27(木) 15:59:46 ID:1TOKv6MA
#!/bin/bash
dat=`tail -n 5 $logdat`
SAVE_IFS=$IFS
IFS='
'
CNT=0
for BUF in $(cat $logdat)
do
CNT=$(expr $CNT + 1)
done
IFS=$SAVE_IFS

こうしてみたら
cat : **************************** : そのようなファイルやディレクトリはありません
とか出るんだけど何故ここで「cat」とか「そのような〜」とか出るのかわからん。
書き方間違ってますか?

373 :login:Penguin:2009/08/27(木) 16:07:37 ID:GGkjBXca
よく見てみろ。7行目にcatがあるぞ

374 :372:2009/08/27(木) 17:02:32 ID:1TOKv6MA
うげっ!
めちゃめちゃ初歩的ミスやらかしてる

修正してうまく動くようになったです。
恥ずかし・・・

375 :364:2009/08/29(土) 04:48:03 ID:oAtS9pnj
レス遅れましたが、ありがとうございます>>366
bash等ではなくてカーネルに依るとは分かりませんでした。
winだとBOM付ける方がスタンダードっぽい
のでどうにかなるか、考えたもので。

376 :login:Penguin:2009/08/29(土) 09:39:58 ID:l0gsahaz
>>375
>winだとBOM付ける方がスタンダードっぽい

SJISだろSJIS。

377 :login:Penguin:2009/08/29(土) 10:52:08 ID:VmNW8gRO
http://www.youtube.com/watch?v=bYcF_xX2DE8
これは新しい

378 :login:Penguin:2009/08/29(土) 10:56:18 ID:l0gsahaz
while [ 1 == 1 ]

がキモイ。trueでええやん。

379 :login:Penguin:2009/08/29(土) 10:59:15 ID:Tfl9hfvi
while :

380 :login:Penguin:2009/09/10(木) 22:53:09 ID:io9H5fc4
grepは検索に一件もひっかからなかったら、何も返してきませんよね
if [grep ほげほげ !=  ""]
とnullと比較したいのですが、実行すると文句を言ってきます
grep -c ほげほげ = 0とすることもできますが、勉強のために書いているので
それはさけたいです
初歩的な事ですいません、ぜひエロい方に教えてもらいたい

381 :login:Penguin:2009/09/10(木) 23:27:42 ID:kkfd/kxq
>>380
くだ質の人?マルチポスト乙。
とりあえず、もっと基本的な事を勉強した方がいいと思うよ。

grep .......
if [ $? ]; then
  echo "マッチ成功"
else
  echo "マッチ失敗"
fi

382 :login:Penguin:2009/09/10(木) 23:35:17 ID:kkfd/kxq
>>380
あー、すまなかった。

>実行すると文句を言ってきます

どう文句言われるのかを書かないとね。
たぶん、[grep ほげほげ !=  ""] を [ grep ほげほげ !=  "" ] にすればうまく動くと思う。

'[' と ']' との間にはスペースを入れることに注意。
実は [ ] はコマンドだから、スペースを入れないと式が引数として扱われない。

こう説明すれば理解できるだろうか。
以下の(1), (2)は等価である。

(1) if test -f /etc/passwd; then 文; fi
(2) if [ -f /etc/passwd ]; then 文; fi

383 :login:Penguin:2009/09/10(木) 23:41:36 ID:kkfd/kxq
コマンドじゃねーや。間違い。

ところで全角スペースがあるのが気になるのだが、そこは大丈夫なのか?

384 :login:Penguin:2009/09/11(金) 00:14:43 ID:r5Zq4SIa
>>382
> 実は [ ] はコマンドだから、
[ がコマンド。(bash の内部コマンド)

> こう説明すれば理解できるだろうか。
かえって混乱するんじゃね。

385 :login:Penguin:2009/09/11(金) 00:53:31 ID:tUDxxMlL
[ は内部コマンドではない

386 :login:Penguin:2009/09/11(金) 00:55:26 ID:sW2bvbaU
>>385
help [

387 :login:Penguin:2009/09/11(金) 01:18:00 ID:1ovlFoMD
cshです。

a.cshの実行中にb.cshを実行したいです。
で、a.cshで宣言した変数をb.cshでも引き継ぎたいのです。
さらに、b.cshに引数を渡して実行したいのです。

a.cshの実行中に
csh b.csh だと引数をつけて実行できますが、変数が引き継がれないようです。
source b.cshだと変数は引き継がれますが、引数をつけて実行できません。

どうしたらいいのん。

388 :login:Penguin:2009/09/11(金) 05:26:58 ID:bKplMqH/
/usr/bin/[の方も、昔は/usr/bin/testへのハードリンクだったが
今は違うんだな。やっぱり日々勉強しないと…

389 :login:Penguin:2009/09/11(金) 07:46:22 ID:r5Zq4SIa
>>385
type [

390 :login:Penguin:2009/09/11(金) 08:15:42 ID:9DDccZ59
>>387
>source b.cshだと変数は引き継がれますが、引数をつけて実行できません。
引数をつけて実行できるんじゃない?
::::::::::::::
a.csh
::::::::::::::
#!/bin/csh -f
set val="hello"
echo "a.csh:$* $val"
source b.csh 1 2 3
echo "a.csh:$* $val"
::::::::::::::
b.csh
::::::::::::::
#!/bin/csh -f
echo "b.csh:$* $val"

% ./a.csh
a.csh: hello
b.csh:1 2 3 hello
a.csh: hello

391 :login:Penguin:2009/09/14(月) 22:11:59 ID:VDeHYP1G
#!/bin/bash
trap "logoutfunc_ctrl; logout" 1 2 3 15

最初の2行にこう記述してるんですが、logoutせずにプロンプト画面に戻る方法がありますか?
bashにこのシェルを書いているのでログイン後は必ずこのシェルが立ち上がるようになってます。
このシェルを実行するのは特定のユーザーのみで、他にこのシェルがあるサーバーにログインは出来ません。
(他のユーザーはrootを除いて全てログイン出来ないようにしてます)
プロンプト画面には触らせないようにしたいのですが、これでプロンプトに抜けれるという人がいるので
どういった方法があるのか教えていただけないでしょうか。


392 :login:Penguin:2009/09/14(月) 22:59:21 ID:SeJGwizk
なんかよくわからんけど
ログインシェルを変えちゃったら。

393 :login:Penguin:2009/09/14(月) 23:18:36 ID:DAW4cbiO
trapでlogoutしてるのにそんなこと出来るの?
おれも悪さされないようにtrapでlogoutしてるからもしそういう抜け道あるなら対策したいな。

394 :login:Penguin:2009/09/15(火) 23:31:19 ID:XlHfxREn
>>391
Ctrl+Z?

395 :login:Penguin:2009/09/16(水) 01:29:49 ID:N6PYBStw
SIGTSTPもそうだけど、普通にbash起動できたりしないの?

396 :login:Penguin:2009/09/17(木) 16:40:19 ID:y7kbSG6/
現在、/ 配下に次のディレクトリがある(CentOS 5.3)。

bin boot dev etc home lib lost+found media miscmnt net opt proc root sbin selinux srv sys tmp usr var

で、例えばの話なんだけど、/var以下と/etc以下のファイルで72時間以内に更新されたファイルだけを検索するために、
/var以下と/etc以下だけを検索するんじゃなくて、/varと/etcの両ディレクトリ以外を検索対象から除外した上で
/ を検索する、という手法をとる場合、次のようなワンライナーが考えられる(改行してるけど実際は一行)。

find / \( -path '/bin/*' -o -path '/boot/*' -o -path '/dev/*' -o -path '/home/*' -o -path '/lib/*'
-o -path '/lost+found/*' -o -path '/media/*' -o -path '/misc/*' -o -path '/mnt/*' -o -path '/net/*'
-o -path '/opt/*' -o -path '/proc/*' -o -path '/root/*' -o -path '/sbin/*' -o -path '/selinux/*'
-o -path '/srv/*' -o -path '/sys/*' -o -path '/tmp/*' -o -path '/usr/*' \) -prune -o
-type f -mtime -3 -print

で、これを

find / $OPT -type f -mtime -3 -print

と書くために、

OPT=\( -path '/bin/*' -o -path '/boot/*' -o -path '/dev/*' -o -path '/home/*' -o -path '/lib/*'
-o -path '/lost+found/*' -o -path '/media/*' -o -path '/misc/*' -o -path '/mnt/*' -o -path '/net/*'
-o -path '/opt/*' -o -path '/proc/*' -o -path '/root/*' -o -path '/sbin/*' -o -path '/selinux/*'
-o -path '/srv/*' -o -path '/sys/*' -o -path '/tmp/*' -o -path '/usr/*' \) -prune -o

とシェル変数を定義する(改行してるけど実際は一行)。で、次を実行するとエラーとなる。

# find / $OPT -type f -mtime -3 -print
find: パスは評価式の前におかなければならない
Usage: find [-H] [-L] [-P] [path...] [expression]

これ、エラーになる原因と対策方法分かる人いたら誰か教えて。

397 :login:Penguin:2009/09/17(木) 16:45:22 ID:HEpWOKWA
ここでも読んどけ

業務でラクするためのUNIXテクニック集
ttp://codezine.jp/article/corner/211

398 :login:Penguin:2009/09/17(木) 16:53:55 ID:zpBnmmE6
>>396
とりあえずecho $OPTして良く考える。

でも目的からいって find /etc /var ... でいいと思うんだがなんでそんなめんどくさいことするの?

399 :login:Penguin:2009/09/17(木) 16:57:51 ID:ih+TQz/f
次のようなワンライナーが考えられる、って書いてあるし
宿題じゃないの

400 :login:Penguin:2009/09/21(月) 16:40:00 ID:nYMA5TsQ
>>396の方法の是非は置いといて、
一気に難しい事やろうとしてダメな場合にそのままデバッグしようとする姿勢からして間違ってるのね
最も確実にできる単純な所からOKなのを確認しつつ、少しずつ複雑化していけばいいのにね
単純化もせずにここにポストしちゃうのもダメなのね

401 :login:Penguin:2009/09/22(火) 01:02:32 ID:CsobNaX3
>>396
> エラーになる原因

> OPT=略 -prune -o
-prune と -o は、OPT= って式の右辺とは認識されていない。

402 :login:Penguin:2009/09/22(火) 21:32:32 ID:tUDMNFi9
WinでSJISだろSJISって言った人は誰ですか
無知はレスしなくていいと思うぞ

403 :login:Penguin:2009/09/24(木) 23:42:28 ID:SAfgo/2/
shでプロセス置換をすることはできますか?

404 :login:Penguin:2009/09/25(金) 07:39:03 ID:DPMjFFBq
exec ?

405 :login:Penguin:2009/09/25(金) 08:28:22 ID:Kq0dBVoG
bashの<(hoge)のようなやつです

406 :login:Penguin:2009/09/25(金) 09:10:47 ID:fabAV8W5
普通のshにはないんじゃないかな。実はshという名前でも実体はbashという
こともよくあるが。ないときはmkfifo使えばなんとかなりそう。

407 :login:Penguin:2009/09/25(金) 09:28:37 ID:Kq0dBVoG
>>406
mkfifoを使ってみます。
ありがとうございます。

408 :login:Penguin:2009/09/25(金) 09:49:07 ID:7/BCzuXv
>>403
sh って、どの sh?

409 :login:Penguin:2009/09/25(金) 19:55:47 ID:Kq0dBVoG
>>408
shって何種類もあるんですか?

410 :login:Penguin:2009/09/26(土) 16:08:50 ID:Jy0DLp0d
>>409
約2000種類くらいある。

411 :login:Penguin:2009/09/26(土) 16:27:53 ID:XBVVzvrd
一行目の
#!/bin/sh
みたいな表記ってなんていうんだけ?

412 :login:Penguin:2009/09/26(土) 16:29:13 ID:Jy0DLp0d
>>411
マジックナンバー

413 :login:Penguin:2009/09/26(土) 16:58:06 ID:v336ZdvP
ホラ吹きはやめなはれ

414 :login:Penguin:2009/09/26(土) 17:36:19 ID:pX1JKn/Q
shebang

415 :login:Penguin:2009/09/27(日) 18:09:06 ID:251MLAqQ
あるフォルダの中のフォルダのうち中身が空のフォルダをまとめて削除するにはどうすればいいですかね?

416 :login:Penguin:2009/09/27(日) 18:14:24 ID:Co+mxy4N
find あるフォルダ -type d -empty かな

417 :login:Penguin:2009/09/27(日) 18:17:18 ID:bShqvf/m
find . -type d -exec rmdir --ignore-fail-on-nonemytp -p {} \;

418 :login:Penguin:2009/09/27(日) 18:36:06 ID:251MLAqQ
>>417
rmdir: failed to remove `.': 無効な引数です
とのことでした。。

>>416
rm -r `find . -type d -empty`としたら期待通りの動作をしてくれました!

有難うございました。

419 :login:Penguin:2009/09/27(日) 18:44:30 ID:ZlHSYQ4N
何も言うまい

420 :login:Penguin:2009/09/27(日) 21:31:53 ID:qHK4F1Gh
ストリームから特定のバイト数分だけ読み出すことは出来ますか?
例えば標準入力の先頭1024バイトだけ読みたいのですが、readやらheadでは
できないみたいでつ。

外部の処理系に投げるしかないのでしょうか。

421 :login:Penguin:2009/09/27(日) 21:33:25 ID:qHK4F1Gh
すみません

head -c 1024

で事故解決しました。

422 :login:Penguin:2009/09/28(月) 12:47:00 ID:VZAZLgKn
Bash で並列処理はできますか?

バックグラウンドでプロセスを実行する方法が考えられますが
標準出力を変数に代入できません。

スレッドみたいなものがあればいいのですが。
アドバイスよろしくです。

423 :login:Penguin:2009/09/28(月) 13:23:09 ID:RgE5Se+Y
>>422
凝ったことやりたいならちゃんとした言語使った方がいいんじゃないの。

424 :login:Penguin:2009/09/28(月) 14:19:04 ID:I6g/kNjx
>>422
標準出力の代わりにファイルを利用するだけでいいと思うけれど
何か制限とかあるの?

425 :login:Penguin:2009/09/28(月) 22:19:09 ID:mq5nI+Gq
>>422
waitとかって使えなかったっけ?

426 :422です:2009/09/28(月) 22:48:49 ID:ZC7KG7rU
>>424
それも考えたのですが、ちょっとアレゲな文字列を渡したいので
なるべく標準入力経由で流し込めたらいいなーと。

>>425
waitするのはいいのですが、
s=`sleep 10; echo hi` &

これだと、確かにバックグラウンドで実行されますが、出力が変数sに代入されません。

とりあえずtmpfile作ってお茶を濁すか、
スレッドをサポートしている他の言語で書いてみます
ありがとうございました。

427 :login:Penguin:2009/09/29(火) 09:01:16 ID:PNFzix6B
アレゲな文字列だとなぜ標準入力にしたいのだろう??

428 :login:Penguin:2009/09/29(火) 22:03:38 ID:to/uYF9s
fifoが使えれば便利なんだけどな。

429 :login:Penguin:2009/10/23(金) 00:04:27 ID:wj32ZQ75
bash@sygwinです。

echo -e `hoge.exe`
みたいなスクリプトを書いて実行した場合、
hoge.exeの出力(標準出力へ出力)が改行されないのですが、
開業して表示されるようにするにはどうしたらいいですか?

430 :login:Penguin:2009/10/23(金) 00:06:21 ID:fL6bmEfB
hoge.exe


431 :429:2009/10/23(金) 00:07:47 ID:wj32ZQ75
サンプルとして hoge.exeとしましたが、
実際は引数をとるプログラムであり、そのためにスクリプトを書いています。

432 :login:Penguin:2009/10/23(金) 00:08:01 ID:egc7pXKl
printfでおk

433 :EriFWUWPcvxE:2009/10/23(金) 00:26:28 ID:o9S12OWs
In the case of a clock it is, of course, infinitely unlikely. ,

434 :login:Penguin:2009/10/23(金) 01:18:00 ID:lIwBP5a7
>>429
| と nkf か iconv かなんか使って
改行コードを変換すればいいかと。

435 :login:Penguin:2009/10/23(金) 07:31:49 ID:sqWecNL1
要するに、
$ echo `ls`
で改行されないと言ってるんじゃないの?
素直に
$ ls
と打てカス じゃ駄目か。

436 :login:Penguin:2009/10/23(金) 07:52:35 ID:fL6bmEfB
>>435
>>431を読むに、ダメなんだろう。

437 :login:Penguin:2009/10/23(金) 10:22:31 ID:iTZCWKBJ
echo "`ls`"

438 :veylKBAi:2009/10/23(金) 22:03:01 ID:t9W+SBEv
And you get to travel to interesting places and talk to interesting people about interesting questions. ,

439 :login:Penguin:2009/10/23(金) 22:40:25 ID:fL6bmEfB
Yes I like rice ball.


440 :login:Penguin:2009/10/25(日) 05:44:06 ID:nuWGLSpK
This is a Tom

441 :login:Penguin:2009/11/04(水) 22:54:27 ID:MYi0pRqJ
Bash シェルスクリプトで、
実行後にコマンドラインに文字列を入力した状態にするのは
可能ですか?

$ ./x.sh
$ abc ←'abc' が入った状態にする

シェルスクリプトでなくて、C とかでもよいですが。


442 :login:Penguin:2009/11/05(木) 10:53:31 ID:yUF/IyOA
>実行後にコマンドラインに文字列を入力した状態にするのは
set ?

>$ ./x.sh
>$ abc ←'abc' が入った状態にする
read ?

443 :441:2009/11/05(木) 19:29:56 ID:gkVZzLQn
x.sh が終了した後に、
コマンドラインにキーボードで 'abc' と入力した状態になっている
という意味あいです。


444 :login:Penguin:2009/11/05(木) 19:59:20 ID:NZnr/6iR
それ、もしできるのなら
セキュリティ的にマズーくないか?

445 :login:Penguin:2009/11/06(金) 00:09:34 ID:eRT3M+Ha
>>443
なんでそんなことしたいの?

446 :login:Penguin:2009/11/06(金) 08:33:57 ID:mW6ePEE5
小数点第三位くらいの数値を1000で割りたいのですが、bcで計算すると0.123456が.123456にされてしまって正しくrrdtoolに値を渡せなくて困っています。
どなたか対策をご存知の方がいらっしゃいましたらご教授頂けないでしょうか。


447 :login:Penguin:2009/11/06(金) 12:03:55 ID:eRT3M+Ha
>>446
sed 's/^\./0./'

448 :441:2009/11/06(金) 19:41:15 ID:/t9QHrwg
>445
ctrl-r で、history のリストから検索して、
ctrl-e とすると、実行ではなく編集になりますよね、
あれがやりたかったんです。

ただ、その検索の部分を(例えば)grep で検索したり、
選ぶ部分をメニュー形式というか対話型にしたり、(その他もろもろ)
結果を実行ではなく、編集にしたい。
なので、シェルスクリプトとかで実行した結果をコマンドラインに
入れられないかなと思ったんです。
ちと無理だったかな。

>>442,444,445 どうもです。

449 :login:Penguin:2009/11/06(金) 19:45:45 ID:q+Z8sAfI
eshell使えば

450 :login:Penguin:2009/11/06(金) 19:46:49 ID:eRT3M+Ha
>>448
コマンドラインに戻す必要あるのかな。
そのアプリの中で編集させて実行しちゃえば?

451 :login:Penguin:2009/11/06(金) 21:42:41 ID:ebfIAKEi
>>448
bashなら、↓で実現できないかな?

$ cat hoge.sh
echo `date` >> ~/.bash_history

$ sh hoge.sh

$ history -r
$ history | grep 2009
15 2009年 11月 6日 金曜日 21:37:38 JST
16 history | grep 2009
$ shopt -s histverify
$ !15
2009年 11月 6日 金曜日 21:37:38 JST
(histverifyがonだとカーソルはコマンドラインの行に位置したままで、編集可)

# 嘘書いてるかもしれんので、間違ってたら指摘求む

452 :login:Penguin:2009/11/06(金) 21:57:06 ID:ebfIAKEi
最初に
HISTFILE=/tmp/.bash_history
とかして一時ファイルにしたほうがよいかも

453 :login:Penguin:2009/11/06(金) 22:03:08 ID:CfRBFuVC
質問。環境はbashです。

URLをテキストファイルに溜め込むスクリプトを作りたくて
弄りはじめたんですが、詰まってしまったので‥ 他力本願!

希望する結果: 
$echo ${URL} > url.txt

$cat url.txt

http://aaaa.co.jp
http://bbbbaaa.com
としたい。

#!/bin/bash
NUM=0
while [ ${NUM} -lt 5 ]
do
URL=`zenity --entry "$1"`
NUM=`expr ${NUM} + 1`
done

URLに複数の文字列を溜め込みたいのですがどうするべきでしょうか?
ググってみると配列?というやり方があるようなのですが、まだ理解できません

教えてください。

454 :login:Penguin:2009/11/06(金) 22:17:20 ID:wQA60fmy
>>453
zenityって何のこっちゃ。配列を使うとこうなる。

$ URL=("foo" "bar")
$ for url in ${URL[@]}; do echo ${url}; done
foo
bar

…が、単に${URL}に空白区切りのURLを入れておいて、
sedなりtrなりを通して1行ずつ出力すれば良いだけの話ではないのか?

$ URL="foo bar"
$ echo ${URL} | sed 's; ;\n;g'
foo
bar
$ echo ${URL} | tr ' ' '\n'
foo
bar

455 :login:Penguin:2009/11/06(金) 23:02:57 ID:CfRBFuVC
>>454
>zenityって何のこっちゃ。
なんか便利そうだなぁと思ってw
zenity使わんでもいいんだけど、常に端末開いてるわけじゃないから操作的に楽かなぁと‥
んで、溜め込むURLは決まってるわけじゃなくて、ブックマーク的な感覚で使うつもり。


$ URL=("foo" "bar")
は、わかったけど
$ for url in ${URL[@]}; do echo ${url}; done
は、${URL[@]} を 一行づつ url に代入して、それを一行づつ出してるってこと?

ってことは、って考えた結果

while [ ${V_NUM} -lt 5 ]
do
URL=("${URL[@]}" `zenity --entry "$1"`)
V_NUM=`expr ${V_NUM} + 1`
done

echo "${URL[@]}"

a b c d e と順に打っていったら

$ echo "${URL[@]}"
a b c d e
と返ってきた。

結果だけみると動作してるように見えるけど、合ってますか?
なんとなく配列のイメージはわかったような気がする・‥
# sed とか 正規表現 とか覚えたら色々出来そうだ。。。と夢見てる段階w

456 :login:Penguin:2009/11/07(土) 00:24:25 ID:27rGR1FA
>>455
配列の話をしているからbash前提で話すが、

・zenityが返す値(URL)を""でエスケープしておかないと、URLにスペースが含まれていたときにハマる。
・単純に5回繰り返すだけならwhileとカウンタを使うよりもforを使ったほうがいい。

for i in {1..5}; do [処理]; done
for i in `seq 5`; do [処理]; done

457 :login:Penguin:2009/11/07(土) 01:39:27 ID:CteOVE+c
>>456
なるほど。わざとスペースを入れて試してみました。
単純に5回繰り返すつもりなので、アドバイス通りにfor文でもやってみたいとおもいます。

>>454 >>456
どうもありがとうございました。

458 :login:Penguin:2009/11/11(水) 00:08:25 ID:ISVpZi0Z
bashの配列なのですが

# ls
お宝動画 有名女優の秘部大百科

というファイルがあって

files=(`ls`)
echo "${files[0]}"

とすると「お宝動画」しか表示されませんよね

これをちゃんとしたファイル名、空白を含む値を代入するには
どうすればいいのでしょうか?




459 :login:Penguin:2009/11/11(水) 10:05:24 ID:FBEaA7LT
>>458
IFSがデフォで空白・タブ・改行になってると思うので
IFSから空白を除く




460 :login:Penguin:2009/11/11(水) 13:32:06 ID:OlX5y2f2
そのファイル名の部分をもっと当たり障りの無いファイル名に変えて書けよww

461 :login:Penguin:2009/11/11(水) 19:26:47 ID:h7rzLTxQ
Bachで条件付バックアップスクリプトを組みたいのですが
どう書いて良い物か分からなくなってしまったのでご教授
お願いします。

< やりたい事 >
任意のフォルダ配下でタイムスタンプがN日経過したものをtar.gzで
圧縮して、そのファイルを削除したい。

たとえば、/home配下に test1・test2・test3と言う3つのフォルダがあって
最終アクセス(ファイル操作)が30日以前のファイルを/home/backupに
タイムスタンプ.tar.gz形式で保存し、バックアップ後そのファイルを削除する。

test1フォルダ内
-rw-rw-r-- 1 root root 10K 10月 09 00:00 /home/test1/hoge.txt
-rw-rw-r-- 1 root root 10K 10月 10 00:00 /home/test1/higetxt

tes21フォルダ内
-rw-rw-r-- 1 root root 10K 10月 11 00:00 /home/test2/hoge.txt
-rw-rw-r-- 1 root root 10K 11月 01 00:00 /home/test2/higetxt

test3フォルダ内
-rw-rw-r-- 1 root root 10K 11月 09 00:00 /home/test3/hoge.txt
-rw-rw-r-- 1 root root 10K 11月 11 00:00 /home/test3/higetxt

n日後のファイルを検索するところまで調べて下記のようなコマンドを
使うのだろうと思っているのですが、それ以降どうしてよいものか・・・・。
find /home -type f -daystart -mtime +30 |fgrep -v /.

長くなりましたがご教授お願いします。

462 :login:Penguin:2009/11/12(木) 00:26:46 ID:VaDsQREP
教授は外出中です

463 :login:Penguin:2009/11/12(木) 00:42:44 ID:MDFmvAz9
バッハねぇ。

464 :login:Penguin:2009/11/12(木) 23:09:37 ID:ou+qWNnh
>>461
TARGET=`find /home -type f -daystart -mtime +30 |fgrep -v /. `
tar cvzf `date +%Y%m%d`.tar.gz $TARGET && rm $TARGET

465 :login:Penguin:2009/11/13(金) 10:24:58 ID:WdvDAtlm
>>464
有難う御座います。
やってみます!

466 :login:Penguin:2009/11/13(金) 11:55:23 ID:YoLOfEvP
test=/var/www/.htaccess-log
という風にしても-logのみが認識されているようでうまく機能しません。
最初に.がある場合のファイルを変数に入れるにはどうすればいいのでしょうか?


467 :login:Penguin:2009/11/13(金) 11:58:11 ID:U8ZA18uC
$ test=/var/www/.htaccess-log
$ echo $test
/var/www/.htaccess-log
$

認識してるが。

468 :466:2009/11/13(金) 12:09:11 ID:YoLOfEvP
>>467
すいません。
testの部分がtest-logでした。
$ test-log=/var/www/.htaccess-log
$ echo $test-log
-log
となります。
申し訳ないです。

469 :login:Penguin:2009/11/13(金) 12:33:52 ID:veh/HZx5
>>468
変数名に-(ハイフン)は使えないと思ったが

470 :466:2009/11/13(金) 12:45:36 ID:YoLOfEvP
>>469
すいません。
そうなんですか。
最近WEB関連からシェル叩くことがあって作ってたんですがシェルでは変数にハイフン使えないんですね。
修正したらうまくいきました。
ありがとうございます。

471 :login:Penguin:2009/11/13(金) 15:23:15 ID:mmBbeV5d
区切りたいなら _ 使え。

472 :login:Penguin:2009/11/13(金) 20:07:30 ID:csbg7Gm/
>>466

>>5
>・思い通りに動かないときは、まずは sh -x でトレースしましょう。

473 :login:Penguin:2009/12/07(月) 12:06:33 ID:XdJnANaN
[ string ] と、[ -n string ] の違いについてお尋ねします。
[ $(cat /dev/null) ] が偽になるのに対して、[ -n $(cat /dev/null) ] は真になってしまうのですが、何が違うのでしょうか。
[ -z $(cat /dev/null) ] は真になるので、なんだか -nだけが仲間外れな気がします。


474 :login:Penguin:2009/12/07(月) 13:25:47 ID:OGpjrFHy
>>473
それだと $(cat /dev/null) が消えて引き数がなくなって
[ ]
[ -n ]
[ -z ]
になる。
なんでそういう挙動になるかは bash の test.c でも読んでもらうとして、
その挙動を避けるには
[ "" ]
[ -n "" ]
[ -z "" ]
にすればいい。

475 :473:2009/12/07(月) 13:46:33 ID:5UzhKh29
>>474
なるほど納得です。
そう言えば変数が空文字列になってしまう場合を考慮してクォートしろと聞いた記憶があるような気がします。
素早いお返事ありがとうございました。ソースもあとで読んでおきます。


476 :login:Penguin:2009/12/13(日) 00:31:23 ID:h59G/AZL
よくダウンロードとかすると何%まで完了してるかみたいなのを
動的に出力するのってどうやんの?

477 :login:Penguin:2009/12/13(日) 01:45:44 ID:k2yGj3y5
普通に wget でいいんじゃない?

478 :476:2009/12/13(日) 02:23:19 ID:h59G/AZL
>>477
ダウンロードに限らず
yumとかbuildするときに%を示す数値が動的に変わっていくじゃないですか。
あれ、どうやって実装してんのかなぁと。


誰かわかる?

479 :login:Penguin:2009/12/13(日) 02:27:41 ID:/qP8xinl
yumってpythonだっけか
そういうライブラリがあるんでないの

シェルスクリプトでやりたいならこういうのがある
http://www.theiling.de/projects/bar.html

480 :login:Penguin:2009/12/13(日) 03:38:56 ID:s0ebrxv6
>>478
バックスペースを然るべき回数売って表示し直し

481 :login:Penguin:2009/12/13(日) 11:14:43 ID:45+rg1Ww
画面制御の話題だったの?
このスレ的には tput あたりでやるのが正しいのだろうか。

482 :login:Penguin:2009/12/13(日) 11:23:29 ID:1bGElD/p
>>478
$ man console_codes

483 :login:Penguin:2009/12/13(日) 11:50:06 ID:k2yGj3y5
このスレ的には dialog とか whiptail じゃないの。

484 :login:Penguin:2009/12/13(日) 18:57:54 ID:7EV0TAof
普通の文章を書いた平文テキストをxtermに関連付けして開くと
実行権もないのにxtermがいくつも開いてフリーズします。

なぜですか?

485 :login:Penguin:2009/12/13(日) 19:25:45 ID:VEJMKGLd
「関連付けして開く」ってどういう概念?

486 :login:Penguin:2009/12/13(日) 19:31:32 ID:7EV0TAof
普通は表示とか端末で実行とか聞かれるので、右クリメニューに入れました

487 :login:Penguin:2009/12/13(日) 19:38:48 ID:8kXkcLfR
Ubuntu使ってるの?

488 :login:Penguin:2009/12/13(日) 22:54:17 ID:u+Xt7Oyd
>>486
ごめん。尋ねておいて悪いけど、
「関連付けして開く」や「右クリメニューに入れ」るってのが判らない。
なので助言できない。

489 :login:Penguin:2009/12/13(日) 22:58:13 ID:X8Bwu1bm
>>484
Windowsの関連づけの感覚?
GNOMEであれば、プロパティから開くアプリ指定してるとかってことか?

試しにユーザーを新しいの作って再現するかどうか試してみたら?
もし再現できなければ ~/.gconf* ~/.gnome* とか退避して削除してログインしなおしてみるとか。

内容からして、くだ質のほうがアドバイスもらえると思うよ。

490 :login:Penguin:2009/12/13(日) 23:54:09 ID:3DX9cdGt
>>484
「xterm を起動できるかどうか」は
「xterm を実行する権限があるかどうか」で決まることだから、
「平文テキストを実行する権限」とは関係ない。

$ xterm /tmp/hoge.txt とかやると、
No absolute path found for shell: /tmp/hoge.txt
とかいったメッセージは出るけれど、xterm が起動する。

関連付け はよくわからないけれど、
テキストファイルをまとめて開こうとすれば、
ファイルの数と同じだけ xterm が一気に起動する ってことは想像できる。
CPUとか メモリ/swap とかが足りなければ、フリーズみたいな状況になるかもしれない。

491 :login:Penguin:2009/12/14(月) 00:20:50 ID:SmNokk3G
>>484
シェルスクリプトの話じゃないでしょう。
こっちで。
くだらねえ質問はここに書き込め! Part 179
http://pc11.2ch.net/test/read.cgi/linux/1257056891/

自分の環境もちゃんと書くこと。
http://www12.atwiki.jp/linux2ch/pages/5.html#id_d2fb2105

492 :login:Penguin:2010/01/05(火) 20:34:00 ID:nuI9c99Q
bashで手軽にオブジェクト指向モドキする方法ってありませんか?
とりあえず試みたのですが、スッキリしません。
#!/bin/bash
gal(){
eval "$1"_name="$2"
eval "$1"_age="$3"
eval "$1"_sex="$4"
}

aisatsu(){
eval echo "私は\"\$"$1"_name"、\"\$"$1"_age"歳です。よろしく
ね。"
}

hanasu(){
eval echo "\"\$"$1"_name\"に何の用?"
}

gal "yuka" "由佳" "16" "女"
aisatsu "yuka"
hanasu "yuka"

493 :login:Penguin:2010/01/05(火) 20:45:01 ID:kbriKfoG
>>492
http://emasaka.blog65.fc2.com/blog-entry-379.html

494 :login:Penguin:2010/01/05(火) 20:48:20 ID:nuI9c99Q
>>493
すごいものがあるんですね。
ありがとうございました。

495 :login:Penguin:2010/01/07(木) 18:16:37 ID:wAYEJTZp
テキストファイルで、指定した文字列を含む最初の行を開始位置とし、先とは別の
文字列を含む行が見つかるまでを削除するにはどうすれば良いでしょうか?

496 :login:Penguin:2010/01/07(木) 18:20:32 ID:D02SG01g
>>495
sed '/xxx/,/yyy/d'

497 :login:Penguin:2010/01/08(金) 10:03:28 ID:KgmcRvHm
>>495
ありがとうございます。
sedというのは強力なんですね。

498 :login:Penguin:2010/01/08(金) 12:52:11 ID:zGQxNXrb
>>497
これで「強力」ってどういう意味?

499 :login:Penguin:2010/01/08(金) 16:04:10 ID:/auv4CfE
>>498
文字/行削除程度しか知らない初心者にとっては、超強力。

500 :497:2010/01/08(金) 23:16:45 ID:KgmcRvHm
shの変数を>>496の/xxx/に使いたい場合についてお伺いします。

path=/aaa/bbb
sed "/$path/,/yyy/d"

の様にしても$pathが展開された時点で区切り文字がエスケープされておらず上手く
いきません。
前処理が必要なのか、それともスマートな方法が用意されているのでしょうか?

501 :login:Penguin:2010/01/08(金) 23:33:25 ID:awvr0YeL
ファイル名はNUL文字以外なら全て使えるんだよね。
ということは、前処理の段階で区切り文字をエスケープする必要があるのかな。

502 :497:2010/01/08(金) 23:38:17 ID:KgmcRvHm
やはり自前で前処理するわけですね。
sedで簡単に出来そうですね。

503 :497:2010/01/08(金) 23:51:05 ID:KgmcRvHm
下でできました。

#!/bin/sh -x

var=/aaa/bbb
esc=$(echo $var | sed -e 's/\//\\\//g')

$()の代わりに``を使うとパイプがあるせいか上手くいきませんでした。
実際はどうなのでしょう?
教えて頂けると嬉しいです。

504 :login:Penguin:2010/01/08(金) 23:52:38 ID:r+fu5lRJ
sed "/\\$path/,/yyy/d" はどうなの?

505 :login:Penguin:2010/01/08(金) 23:53:13 ID:aqeo86VH
区切り文字を変えるんだよ!

sed '\@foo@,\@bar@d'

506 :497:2010/01/09(土) 00:07:36 ID:WfSq+WCG
>>504
それだと$pathの先頭にのみ区切り文字がある場合にしか対応していないと思います。

>>505
そういうときに使うのですね。
なるほど。
ありがとうございました。

507 :login:Penguin:2010/01/10(日) 12:29:36 ID:jRBDc3XG
com1 | com2 | com3

の様なとき、どこかでエラーが起こった場合に、それを知ることはできないでしょうか?
bash3.0以降だと${PIPESTATUS[@]}で可能なようですがshでなんとかならないかと。

508 :login:Penguin:2010/01/10(日) 12:37:23 ID:E5a795Pl
subshellを使って、
(( com1 判定)| com2 判定 )| com3
みたいな事を見た憶えがするけど、定かでない。

509 :初心者:2010/01/13(水) 23:30:52 ID:9IUNZoL1
run.shファイルの中で、script_file.shをsourceした場合。
sourceされているscript_fileの中でscript_file自身の絶対パスを得る方法を調べています。

bashの場合はscript_fileの中で$BASH_SOURCEから得られるが、他のシェル(zsh/tcsh/ksh)でscript_file.shのパスを得られる方法を
教えていただけませんか?

>>>>>>>>>>>>>>>>>>>>>>
script_file.shファイルのある場所
/path/to/script_file.sh
>>>>>>>>>>>>>>>>>>>>>>

実行例:
%./run.sh

期待結果:
/path/to/


ファイル <run.sh>の中身
-------------
#!/bin/(sh/zsh/tcsh...)
source $path/script_file.sh
-------------

ファイル script_file:
-------------
script_file_path=`******`
echo $script_file_path;
-------------

510 :login:Penguin:2010/01/13(水) 23:53:55 ID:rEuhDc/f
>>509
機能知らない分際で答えるとさ
単純に呼ぶんだからさ
source "$path/script_file.sh" "$path/script_file.sh"
とか引数として渡してecho $1とかしても
できちゃったりはするね

511 :login:Penguin:2010/01/13(水) 23:59:57 ID:rEuhDc/f
期待結果は/path/to/だったかorz
ならsource "$path/script_file.sh" "$path"
でまぁできるといえばできてるけど

512 :login:Penguin:2010/01/14(木) 00:01:40 ID:4xSyV+UX
/が抜けてたねorz

513 :login:Penguin:2010/01/14(木) 03:10:55 ID:4xSyV+UX
>>507
気になったので書いてみた
>>508氏が言ってるようにもっと楽にできるんだろうけど
ちなみに頭悪いので間違ってる可能性ありと
使い物になってないと思うから 一応動いてるかも程度

514 :login:Penguin:2010/01/14(木) 03:12:28 ID:4xSyV+UX
function perror(){
stdout=`mktemp`;stdout2=`mktemp`
first=on
until test 1 -eq $# #引数一個の場合は何もしないので注意
do
if test $first = on
then
first=off
$1 1>$stdout 2>/dev/null
judge=$?
fi
if test $judge -eq 0
then
if ! test 2 -eq $#
then
$2<$stdout 1>$stdout2 2>/dev/null
judge=$?
shift
else #最後は標準出力へ
$2<$stdout #最後のcommandの失敗は判定してないので注意
shift
fi
else
echo "$1" error 1>&2
break
fi
stdout_hold=$stdout # 入れ替え
stdout=$stdout2
stdout2=$stdout_hold
done
rm $stdout $stdout2;unset stdout stdout2 stdout_hold first judge
}

515 :login:Penguin:2010/01/14(木) 03:15:58 ID:4xSyV+UX
perror 'ls /usr/bin' 'sed 's/^/test/g'' 'grep gcc' less

perror 'ls /usr/bin' 'sed 's/^/test/g'' 'tar xf' less

まぁ一応動いてるのかな!?

516 :login:Penguin:2010/01/14(木) 17:27:09 ID:FVM4x3d9
sed -e '$-3,$d' file
とすると
sed: -e expression #1, char 2: unknown command: `-'
というエラーがでます。

versionは4.1.5ですが上記の使い方間違ってますか?

517 :login:Penguin:2010/01/14(木) 17:55:26 ID:EAAIjJ3h
vi じゃないんだからそんな指定できないよ


518 :login:Penguin:2010/01/14(木) 22:28:16 ID:dyjWaACs
>>507
エラーが起こったかどうか *見えればいい* ってだけならこんなやりかたも。

(com1 ; echo $?>/tmp/test.log) | (com2 ; echo $?>>/tmp/test.log) | 略
(com1 ; xmessage com1:$?&) | (com2 ; xmessage com2:$?&) | 略

519 :login:Penguin:2010/01/15(金) 09:27:35 ID:vHlv+w15
>>516
つhead -n -4 file

520 :login:Penguin:2010/01/15(金) 10:37:34 ID:0e3bcUwp
>>519
-nの値に負の数を与えられるんですね。

521 :login:Penguin:2010/01/15(金) 11:44:19 ID:exz65txq
ダブルクォーテーションで囲まれた文字列を抜き出すってどうやればいいんだ?
cutでもexprでも俺には無理だった、絶対サクッとできるはずなのに悔しすぎる…

522 :login:Penguin:2010/01/15(金) 12:29:58 ID:n61dnfY7
grep -o '"[^"]*"'

523 :login:Penguin:2010/01/15(金) 13:14:40 ID:exz65txq
>>522
今日一日崇めさせてくれ

524 :login:Penguin:2010/01/15(金) 20:34:53 ID:cwTkNqT3
1日限定かい。

525 :login:Penguin:2010/02/07(日) 15:35:53 ID:lbKDrfi6
$ df -h /tmp
Filesystem Size Used Avail Use% マウント位置
tempfs 512M 89M 424M 18% /tmp

の%の前の数字(ここでは18)だけ取り出したいんだけど、どうすればよいですか?

526 :login:Penguin:2010/02/07(日) 15:58:04 ID:vkq5/P4Z
awk使う

527 :login:Penguin:2010/02/07(日) 16:03:00 ID:U7v7s3zM
とても安直な方法なので最適解には程遠いと思いますが

df -P /tmp | grep '/tmp$' | awk '{print $5;}' | sed 's/%$//'

528 :login:Penguin:2010/02/07(日) 16:06:14 ID:lbKDrfi6
>>526,527
ありがとう。


529 :526:2010/02/07(日) 19:06:47 ID:dchTEc3Z
>>527
おまwww

df -h /tmp | awk '/\/tmp/ { print gensub("%", "", "", $5) }'

530 :login:Penguin:2010/02/07(日) 19:16:50 ID:U7v7s3zM
いやそれくらい知ってる

531 :login:Penguin:2010/02/07(日) 19:30:22 ID:Fd1qGpin
複数行のキーワードをfgrepする手はないスか?
キーワードの行数は不定。以下例では仮に2行とします。
$ cat -n text
1  abcdefg*******
2  [hijklmn-z]
3  abcdefg*******
$ fgrep 'abcdefg*******なんとか[hijklmn-z]' text
text:1:abcdefg*******
text:2:[hijklmn-z]
1と2行目のペアはヒットするが、3行目がヒットしてはいけない。

532 :531:2010/02/07(日) 19:32:00 ID:Fd1qGpin
ああっと。
上の検索コマンドはgrepファミリーでなくても良いですが、perlは駄目です。

533 :login:Penguin:2010/02/07(日) 19:58:16 ID:KEZIcPfj
宿題は自分でやれよ

534 :login:Penguin:2010/02/07(日) 21:03:26 ID:U7v7s3zM
#!/bin/bash
AWKFILE="/tmp/$0.$$"
trap "rm -f ${AWKFILE}" 0
KV=0
echo "BEGIN{s=0;h=\"\"};" > "${AWKFILE}"
for keyword in $*; do
echo "/${keyword}/{if (s==${KV}){s=s+1;h=h NR \"\\t\" \$0 \"\\n\";} else {s=0;h=\"\"}};"
KV=`expr ${KV} + 1`
done >> "${AWKFILE}"
echo "{if (s==$#){print h;s=0;h=\"\";}};" >> "${AWKFILE}"
awk -f "${AWKFILE}"

535 :login:Penguin:2010/02/07(日) 21:24:02 ID:U7v7s3zM
いろいろ残念な部分があるけど、そこは使う人が直してね

536 :login:Penguin:2010/02/07(日) 21:36:26 ID:5ZhdKpPZ
>>534
んー。やっぱりスクリプト生成みたいになりますか。
私以外の人が考えてもすっきり行かない事が解りました。ありがとうございます。

>>533
この手の宿題を出す学校はあまり無いんじゃないかな。

537 :login:Penguin:2010/02/07(日) 21:41:15 ID:U7v7s3zM
自分でできない部分だけ聞きなよ

538 :login:Penguin:2010/02/07(日) 21:51:00 ID:UYJWIskO
>>536
質問に答えようとしてない奴の発言にはいちいち反応するな。

「教えてくれ」ってやつと「宿題は自分でやれ」ってやつは
「歩み寄る可能性がない」からスルーしたほうがいい。
専ブラ使える環境なら、NGワードに「宿題」って単語を入れておいたほうがいいよ。

539 :login:Penguin:2010/02/07(日) 22:05:12 ID:U7v7s3zM
>>531はいろいろ引っかかる部分があるから正直俺も最初は回答しようかどうか迷ったぞ
返事を聞いて>>538も出てああやっぱりかと思ったし...

と戯言はここまでにしとく

540 :login:Penguin:2010/02/07(日) 22:36:33 ID:5ZhdKpPZ
>>537
>自分でできない部分だけ聞きなよ
すっきりと実現できなかったので尋きました。というか、
往々にしてこの手のことを実現すると車輪の再発明になってしまってる事が多い。
なので、他の人も決定的な車輪を持ちあわせていないという情報はとても大切で、
有難く思っています。

541 :login:Penguin:2010/02/07(日) 22:44:49 ID:qrQKR8fu
典型的なゆとり脳というか
なんでこんな上から目線なんだろ
そういうのは自分で書いたの張ってから言えよ

542 :login:Penguin:2010/02/07(日) 22:46:48 ID:U7v7s3zM
>>540
実現できたなら実現方法そのものを聞く必要はない
実現方法を提示してより良くするにはどこを直せばいいか聞けばいい
他人のコストは格段に違うだろうし、回答も違ったものになる

というかお前>>526だろ?


543 :526:2010/02/07(日) 23:05:32 ID:sirvd3yi
こらこらw
静観してる俺まで巻き込むなよ

544 :login:Penguin:2010/02/07(日) 23:09:51 ID:fkJC7wtF
>>542
そうですね。その点は気をつけたいと思います。

>というかお前>>526だろ?
いや違う。
むしろ、>>529(526)にしろあなたにしろ"/tmp"をマッチさせている時点で、要求条件から逸脱していると思っている。

545 :login:Penguin:2010/02/07(日) 23:30:09 ID:U7v7s3zM
ID変えながら大変ですね。元に戻せないの?

546 :login:Penguin:2010/02/07(日) 23:44:26 ID:sirvd3yi
どうやって戻すんだよw

547 :login:Penguin:2010/02/07(日) 23:49:53 ID:qVmLGOqM
昼間寝ていたら正規表現使う夢を見た気がする、なぜだ

548 :login:Penguin:2010/02/07(日) 23:56:03 ID:U7v7s3zM
同じIPが取れるまでトライ!(やったことないので同じになるのか知らん)

549 :login:Penguin:2010/02/08(月) 06:35:08 ID:wgsJNc2d
>>548
お前ちょっと黙れ。

550 :login:Penguin:2010/02/08(月) 08:30:32 ID:shLyrCGR
U7v7s3zMが取れるまでトライし続けてるのかなw

551 :login:Penguin:2010/02/08(月) 12:19:18 ID:2AE05UQA
答えてもらっておいて「まあそんなもんだよね」

これはひどい

552 :login:Penguin:2010/02/08(月) 17:02:25 ID:h/fx9poh
複数の数字に,同じ四則演算(+,−,*,/)を繰り返した計算結果を表示するシェルスクリプトを,cshシェルスクリプトで書け。
(基本仕様)
@ コマンドとして実行できる.(シェルコマンドである.)
A 入力した数字を計算できる.
B 入力できる数字の個数は2以上とする.
C 四則演算子(+,−,*,/)を選択,または直接入力して
数字1□数字2□・・・□数字N (□=+ or − or * or /,N≧2)
の計算結果を出力する.
D 四則演算子以外の記号が入力された場合,エラーメッセージを出力する.
(ポイント)
? シェルコマンドにするには,スクリプトの最初に(#!で始まる)おまじないを書く.
? 標準入力から文字列を入力するには $< を用いる.
? コマンドラインに引数を指定した場合は,その引数は変数$argvに格納されている.その各要素を参照するには,$argv[1],$argv[2](または$1,$2)などとする.
? 四則演算には @ コマンドが使用できる.(ただし,整数しか扱えない.)

誰かわかるひとおねがいします(今週中にお願いします!)

553 :login:Penguin:2010/02/08(月) 17:05:28 ID:llGt0cFK
何箇所でマルチしてんだよwww

554 :sage:2010/02/08(月) 17:06:29 ID:kDoV0MXx
宿題は自分でやろうね。

555 :login:Penguin:2010/02/08(月) 20:38:54 ID:Wyshj96C
後から読んで526にワロタ
カワイソスw

556 :login:Penguin:2010/02/19(金) 00:14:13 ID:c2ocdmWw
df -h /tmp | sed 's/.*\([0-9][0-9]*\)%.*/\1/'

557 :login:Penguin:2010/02/20(土) 23:34:54 ID:vDEbYPUT
以下の結果を出力するシェルを,bashスクリプトで書け.
(基本仕様)
・コマンドとして実行できる.(シェルコマンドである.)
・ユーザーが10000以上99999以下の5桁の数字を入力する.
・その数字を7で割って1余り,かつ13で割って2余った場合は Daikichiと表示する.
・それ以外で,13で割って2余った場合は Chuukichiと表示する.
・それ以外で,7で割って1余った場合は Shoukichiと表示する.
・それ以外の場合は Hazureと表示する.
・入力した文字が10000以上99999以下の数字以外の場合はエラーメッセージを表示する.
・できる人は,コマンドライン引数でDaikichiなどの文字を変更できるようにする.
(ポイント)
☆シェルコマンドにするには,スクリプトの最初に(#!で始まる)おまじないを書く.
☆標準入力から文字列を入力するには read を用いる.
☆コマンドラインの引数は,$@に格納されている.(その要素は $1 $2 ...)
☆四則演算には $(( )) コマンドが使用できる.(ただし,整数しか扱えない.)


誰かわかるひとお願いします

558 :login:Penguin:2010/02/20(土) 23:37:36 ID:8qh4FPc7
>>557
> 誰かわかるひとお願いします
まぁ、Linux使える人ならば、誰でも分かる
"学校" の課題ですわな(w
# "学校" は 大学 でない。

559 :login:Penguin:2010/02/20(土) 23:46:16 ID:WE3Utbg7
シェルスクリプトの課題を出す学校ってあるんだね。
ふつーは、CとかJavaを中心にやるものだと思ってた。

560 :login:Penguin:2010/02/21(日) 00:00:05 ID:WDiWxw8N
#!/bin/bash
read read
echo $((read%3))`echo 5p$(echo e$(echo l5b$(echo 6M5)q2)744$(echo GsCg$(echo =$(echo =))))|base64 -d`

561 :login:Penguin:2010/02/21(日) 00:16:12 ID:FUNRtF1w
死ねばいいのに

562 :login:Penguin:2010/02/21(日) 00:27:29 ID:R8eJDQx8
何をお願いされているのだろう。アンケートかな?
回答「わかります」


上から2桁目で四捨五入したい(例: 15 -> 20, 312 -> 300, 9432 -> 9000)
どうやるのが一番簡単かな?

563 :login:Penguin:2010/02/21(日) 00:39:34 ID:y6fTjKHz
10を底とした対数とって
1.5*10^1
3.12*10^2
9.432*10^3
仮数部を小数点以下で四捨五入する

564 :login:Penguin:2010/02/21(日) 01:05:26 ID:y6fTjKHz
全然対数じゃないや

565 :login:Penguin:2010/02/21(日) 01:20:23 ID:mOFZBUIZ
>>557
お前UNIX板のシェルスクリプトスレでも宿題は自分でやれって言われてただろ
マジで死ね

566 :login:Penguin:2010/02/21(日) 02:00:25 ID:y6fTjKHz
$ echo 'x=9432; beki=l(x)/l(10.0); scale=0; beki/=1; scale=10; y=x/(10^beki); y+=0.5; scale=0; y/=1; y*=(10^beki); scale=0; y/=1; y;' | bc -l
9000
一応、15, 312, 9432 については期待の値になった。

567 :login:Penguin:2010/02/21(日) 02:38:10 ID:ymcnTK5S
>>566
しかし4432613で矛盾が出た。

568 :login:Penguin:2010/02/21(日) 08:29:04 ID:y6fTjKHz
違うかね?
4432613 = 4.432613 * 10^6
→ 4.4*10^6 → 4.0*10^6 = 4000000
>>562 さんに聞いてみようか。
入力4432613での期待値は、
上から2桁目の"4"で四捨五入して、4000000 でよろし?
3桁目の"3"でして、4400000 ではなくて。

569 :login:Penguin:2010/02/21(日) 09:26:12 ID:y6fTjKHz
少しコメント入れました。ダメな場所はどなたか直してください。
echo 'x=4432613;
# x=y * 10^d 表現にする
d=l(x)/l(10);
scale=0; d/=1;
scale=1; y=x/(10^d);
# yの小数点第一位を四捨五入して整数に。
y+=0.5; scale=0; y/=1;
# 元の桁数に戻す。
z=y*(10^d);
z;
' | bc -l

570 :login:Penguin:2010/02/21(日) 11:49:45 ID:y6fTjKHz
アプローチを変えて文字列処理にしてみた
$ echo 4432613 | perl -npe 's/^(\d)(\d)(\d+)/$1+($2>4) . 0 . 0 x length($3)/e;'


571 :login:Penguin:2010/02/21(日) 12:23:46 ID:y6fTjKHz
$ echo 15 | perl -npe 's/^(\d)(\d)(\d*)/$1+($2>4) . 0 . 0 x length($3)/e;'


572 :login:Penguin:2010/02/21(日) 13:04:19 ID:y6fTjKHz
#!/bin/ksh
v="$1"
a=${v:0:1}
b=${v:1:1}
c=${v:2}
[ $b -gt 4 ] && a=$((a+1))
b=0
c=$(echo $c | tr 0-9 0)
echo "$a$b$c"

573 :login:Penguin:2010/02/21(日) 13:09:12 ID:7QPAwQGI
ん、よくわからんけど……
乙 w

574 :562:2010/02/21(日) 19:12:39 ID:R8eJDQx8
なんかすごいものがw

>>568
>入力4432613での期待値は、
>上から2桁目の"4"で四捨五入して、4000000 でよろし?
よろしです。

パッと見で>>571がスマートですね
シェルからこいつを呼ばせて貰おうと思います
ありがとうございましたm(_ _)m

575 :login:Penguin:2010/02/21(日) 20:33:49 ID:y6fTjKHz
>>507
ttp://sourceforge.jp/projects/sfnet_pipestatus/
ど根性に脱帽

576 :login:Penguin:2010/02/26(金) 00:26:14 ID:DYTaEvQS
自分自身(ファイル)をサーバにuploadするシェルスクリプトって可能ですか?

具体的には、ちょこちょこ定期的にレンタルサーバにuploadしたいファイル群があるのでシェルスクリプトを書きたいのですが、
そのシェルスクリプトファイル自身もuploadしたいのです。

577 :login:Penguin:2010/02/26(金) 00:29:09 ID:C/OfvsKM
まず、なぜ不可能だと考えたのか、そこから聞こうか。

578 :login:Penguin:2010/02/26(金) 00:37:26 ID:DYTaEvQS
今実行中のファイルを操作するってのがいけないことなのかなぁと…

579 :login:Penguin:2010/02/26(金) 00:39:36 ID:dGd2Emr5
自身のunlinkすら可能だというに

580 :login:Penguin:2010/02/26(金) 00:56:31 ID:7suOgZ+f
アップロードどころか実行中のスクリプトを編集することもできるよー

581 :login:Penguin:2010/02/26(金) 21:44:10 ID:ZUmR/bTp
以下の結果を出力するスクリプトを,UNIXシェルで書け.
(基本仕様)
・コマンドとして実行できる.(UNIXシェルである.)
・主人公、妹1名、両親、自分の友人数名(うち最低1名は女性、半数以上は男性とする)、妹の友人(女性)数名が登場する.
・主人公、妹、自分の友人、妹の友人はいずれも生徒もしくは学生とする.
・両親のうち、父は総合商社勤務のサラリーマン、母は専業主婦とする.
・主人公の言動やイベントの発生にともない、各キャラのパラメータを変化させる.
・病弱な妹を思いやる兄と妹の交流を中心に、他の登場人物との友情や恋愛を描写する.
・エンディングは妹、もしくは妹の友人のいずれかと深い恋愛関係になるか、誰とも親密に慣れないバッドエンディングになるようにする.
・妹と恋愛関係が深まる場合、病弱な妹への思いやりが徐々に、自然に恋愛感情へ変化するように描写する.
・ゲームの操作方法はコマンド選択式またはコマンド入力式とする.
・すべてUNIXシェル内部で処理し,外部コマンドは呼び出さないこと.
(ポイント)
☆UNIXシェルにするには,ファイルの最初に #!/bin/bashというおまじないを書く.
☆コマンド選択方式のゲームにする場合、select文を使用できる。
☆四則演算には $(( )) コマンドが使用できる.(ただし,整数しか扱えない.)


誰かわかるひとお願いします

582 :login:Penguin:2010/02/26(金) 21:49:36 ID:ueeczQLj
さようなら

583 :login:Penguin:2010/02/26(金) 22:36:07 ID:PyskErwP
>>581
UNIXシェルってなんだ?

584 :login:Penguin:2010/02/26(金) 22:53:51 ID:nq/ujwuR
>>581
いろいろ拡張されてきたなw


585 :login:Penguin:2010/02/26(金) 23:01:55 ID:UQaFhRqQ
自演ウザス

586 :login:Penguin:2010/02/27(土) 08:37:06 ID:dxtkbNS9
素直にワラタ

587 :login:Penguin:2010/02/28(日) 01:11:29 ID:oz3AO1O4
シェルスクリプトとVBA、どちらが簡単ですか?

588 :login:Penguin:2010/02/28(日) 01:13:35 ID:XA1Dii88
シェルスクリプト

589 :login:Penguin:2010/02/28(日) 01:20:34 ID:oz3AO1O4
>>588
シェルスクリプトと比較して、VBAはどこがどんな風に難しいのでしょうか?

590 :login:Penguin:2010/02/28(日) 01:37:41 ID:XA1Dii88
用途が全然違う

VBA=MS製品の補助、高度なことやろうと思ったらVBの型とか定数とかメソッドとかプログラミング言語として覚えないといけない
シェルスクリプト=普段から使っているコマンド郡の応用、データの流れとアルゴリズムさえ判れば外部プログラム呼び出して何でも出来る

591 :login:Penguin:2010/02/28(日) 01:52:34 ID:oz3AO1O4
>>590
疑問なのは、なぜアプリケーションの補助がそんなに難しいのか、
もっと簡単にできなかったのか、それでは普通の人に使えないのではないか、
という点です。
Linuxで表計算っぽいことができる言語というとawkがありますけど、
あれくらい簡単だったら誰でも使えると思うのですが。
マクロ言語がエンドユーザ言語として使われるためには簡単でなければならないはず。
それなのにシェルスクリプトより難しいというのは、その目的にそぐわないような気がするのですが。

592 :login:Penguin:2010/02/28(日) 01:55:02 ID:C3UADE41
VBAの質問ならよその板でやっとくれ。

593 :login:Penguin:2010/02/28(日) 01:56:36 ID:oz3AO1O4
>>592
VBAについて知りたいというよりも、
シェルスクリプトとVBAの違いというか、
際立った特徴のようなものがあれば、それを知りたいんです。

594 :login:Penguin:2010/02/28(日) 02:06:41 ID:B/kw3N2G
>>593
そもそも活用シーンが全然違うのに比較してどうする。根本が間違っている。
比較するならWSHとだろう。

595 :login:Penguin:2010/02/28(日) 02:12:43 ID:oz3AO1O4
>>594
WSHもWindows PowerShellも
エンドユーザにはあまり受け容れられていないように見受けられます。
Linux/UNIX/MacOSXのエンドユーザでもスクリプトを全く書かない人はいますが、
Windowsよりはそういう人が少ないと思います。
単純にWindowsのほうがヘビーユーザ率が低いというもあるでしょうが、
それだけでなく、Windowsで使われるそれらの言語が
そもそもエンドユーザに適さない欠点を有しているからではないのでしょうか?
とすると、逆にシェルスクリプトはどういう点でそれらより優れているのでしょうか?

596 :login:Penguin:2010/02/28(日) 02:20:34 ID:B/kw3N2G
>>595
だからさー比較する前提条件が間違っている。

597 :login:Penguin:2010/02/28(日) 02:24:04 ID:oz3AO1O4
>>596
WSHと比較するようにアドバイスされたので、そうしたのですが。

598 :login:Penguin:2010/02/28(日) 02:31:01 ID:v9A/VFIk
シェルスクリプトと比較するべきはバッチファイル。
君の質問は「バッチファイルとVBA、どちらが簡単ですか?」という事になるから
この板で聞く事じゃない。

599 :login:Penguin:2010/02/28(日) 02:33:03 ID:oz3AO1O4
>>598
バッチファイルなんて論外でしょう。
あれとシェルスクリプトを一緒にするのはやめましょう。

600 :login:Penguin:2010/02/28(日) 02:43:10 ID:v9A/VFIk
VBAと一口に言ってもWord、Excel、Access、Outlook…全然違うぞ?

601 :login:Penguin:2010/02/28(日) 02:44:34 ID:B/kw3N2G
っていうかスレチ。
いちいちageているし、これ以上続けるならレス乞食とみなしてあぼーんする。

くだ質いけ。

602 :login:Penguin:2010/02/28(日) 02:47:24 ID:C3UADE41
くだ質に来られても困るな。
ム板にでも行ってくれ。

603 :login:Penguin:2010/02/28(日) 02:52:42 ID:oz3AO1O4
WSH(VBScript)で「C:\TechEzo\Round23.txt」内の「ようこそ」を含む行を表示する

Set fso = CreateObject("Scripting.FileSystemObject")
Set regEx = New RegExp
Set tempFile = fso.OpenTextFile("C:\TechEzo\Round23.txt")

regEx.Pattern = "ようこそ"
Do Until tempFile.AtEndOfStream
tempLine = tempFile.ReadLine
If regEx.Test(tempLine) Then
WScript.Echo tempLine
End If
Loop

これを見て「オブジェクト指向だから素晴らしい」とか
「シェルスクリプトに比べて簡単」とか思う人はいないでしょう。
管理者や一般のエンドユーザなど、ノンプログラマも使う言語を
こんなふうに設計したMSは頭が悪いとしか思えないです。

604 :login:Penguin:2010/02/28(日) 03:01:02 ID:SsRM0ruv
マルチ相手によーやるな

605 :login:Penguin:2010/02/28(日) 09:04:34 ID:JCw0fVKj
>>603
Window Power Shellもしかり。ちょい使いするには厳格すぎる。
あまりハードルを下げるとMS専門鯖管にスキルが付いてLinuxに行っちゃうからじゃね?

606 :login:Penguin:2010/02/28(日) 11:13:46 ID:ZpjvZrys
指定したディレクトリ以下を再帰的に検索して
同じディレクトリに大文字小文字違いでファイル名が重複して存在してた場合
例)
ABC.txt
abc.txt
abc.TXT
どれか一つ(どれでもいい)を残してあと消去するってのをやりたいけどどうやんの

607 :login:Penguin:2010/02/28(日) 11:15:22 ID:wBfYi/JJ
>>603 見たら、ハードル高くしたらむしろ出来る奴こそLinuxに行ってしまいそうにオモタ

608 :login:Penguin:2010/02/28(日) 11:57:18 ID:C3UADE41
>>606
perl か何かで書いた方が楽じゃないかな。

609 :login:Penguin:2010/02/28(日) 11:58:42 ID:qTqfFliX
>>606
$ find /tmp/hoge* -type f
/tmp/hoge1/ABC.txt
/tmp/hoge1/abc.TXT
/tmp/hoge1/abc.txt
/tmp/hoge1/a b c.txT
/tmp/hoge1/a b c.txt
/tmp/hoge2/ABC.TXT
/tmp/hoge2/ABC.txt
/tmp/hoge2/DEF.txt
$ find /tmp -type f | uniq -i -d -D --all-repeated=prepend | perl -00 -a -F'\n' -ne '{foreach $i (1..$#F){print "$F[$i]\n";}}'
/tmp/hoge1/abc.TXT
/tmp/hoge1/abc.txt
/tmp/hoge1/a b c.txt
/tmp/hoge2/ABC.txt
ディレクトリの大文字小文字違いは考えてない。

610 :login:Penguin:2010/02/28(日) 14:28:15 ID:oz3AO1O4
>>609
それって答になってるの?
ただ表示させてるだけじゃん。
表示させるだけならもっと楽な方法あるし。

$ ls -R
.:
ABC.txt Aca.TXT abc.Txt sample.sh test2

./test2:
ABC.txt Aca.TXT abc.Txt test3

./test2/test3:
DDD.TXT aBc.tXt
$ find ./* -type f | grep -i 'abc.txt'
./ABC.txt
./abc.Txt
./test2/abc.Txt
./test2/ABC.txt
./test2/test3/aBc.tXt
$ find ./* -type f | grep -i 'abc.txt' | uniq -i
./ABC.txt
./test2/abc.Txt
./test2/test3/aBc.tXt




611 :login:Penguin:2010/02/28(日) 14:46:18 ID:qTqfFliX
>>609 では、重複を探して、最初のを除いて、2つめ以降を出力してる。
この出方を>>606の評価基準で見てもらい、不満なければ、
あと xargs rm につなぐ程度で済むべ。
>>610 の例だと、それは全部消していいものなの?

612 :login:Penguin:2010/02/28(日) 14:52:31 ID:qTqfFliX
もちろん>>609が最適解だなんて思ってないんだけど、
>>610 のやり方だと、abc.txt って人が与えてるよね。何百個かある時はどうするの?


613 :login:Penguin:2010/02/28(日) 15:10:05 ID:qTqfFliX
ちょっと修正する。
$ find /tmp -type f | sort -f | uniq -i -d --all-repeated=prepend | perl -00 -a -F'\n' -ne '{shift @F; print join("\0",(@F,""));}' | xargs -0 ls -l
大丈夫そうなら最後の ls -l を rm に変更で。

614 :login:Penguin:2010/02/28(日) 15:41:09 ID:oz3AO1O4
A=""
find . -type f | sort -f \
| while read F;
do
P=`echo "$F" | tr '[A-Z]' '[a-z]'`
Q=`echo "$A" | tr '[A-Z]' '[a-z]'`
if [ "$P" == "$Q" ]
then
echo "${F}を削除"
# eval rm "$F"
fi
A="$F"
done

615 :login:Penguin:2010/02/28(日) 15:47:27 ID:oz3AO1O4
すまん、evalはなくても動く。

616 :login:Penguin:2010/02/28(日) 15:59:45 ID:0w7cauqm
>>606 が良ければなんでもいいでしょうに

617 :login:Penguin:2010/02/28(日) 16:00:23 ID:diBS8T6m
>>614
いかにもシェルスクリプトらしい解決法だね
perl使うほうがメンドイ

618 :login:Penguin:2010/02/28(日) 16:32:44 ID:qTqfFliX
感心しました。なるほど、うまいですね。
僭越ながら少し手を入れてみました。(sh 対応、外部コマンド実行回数減らす)
#!/bin/sh
A=""
Q=""
find . -type f | sort -f \
| while read F; do
P=`echo "$F" | tr '[:upper:]' '[:lower:]'`
if [ "$P" = "$Q" ]; then
echo "${F}を削除"
# rm "$F"
fi
A="$F"
Q="$P"
done

619 :login:Penguin:2010/02/28(日) 19:19:20 ID:ZpjvZrys
勉強になります

620 :login:Penguin:2010/02/28(日) 19:46:12 ID:v9A/VFIk
別ディレクトリになった時 Q="" しなくていいの?

621 :login:Penguin:2010/02/28(日) 20:01:15 ID:qTqfFliX
>>620
>>609 で楽するためディレクトリの大文字小文字は考えないことにしたんだけど、
d/abc.txt と D/abc.txt を同一視しちゃってるので、本当ならダメ、なんでしょう。
find . -type d するループを外側につけるか、
ディレクトリ名見る if をつければ直せそう。改修頼みます >>620

622 :login:Penguin:2010/02/28(日) 20:11:12 ID:0w7cauqm
だからそういうのは>>606が決めることだって。勉強になります、じゃなかろうに

623 :login:Penguin:2010/02/28(日) 20:50:11 ID:v9A/VFIk
#!/bin/sh
A="."
find ./dir -type f | sort -f | \
while read F; do
P=`dirname $F`/`basename $F | tr '[A-Z]' '[a-z]'`
Q=`dirname $A`/`basename $A | tr '[A-Z]' '[a-z]'`
if [ $P = $Q ]; then
echo "rm $F"
fi
A=$F
done

624 :login:Penguin:2010/02/28(日) 22:25:55 ID:v9A/VFIk
書き直したので貼り直しますね。

#!/bin/sh
B="!"
find . -type f | sort -f | \
while read F; do
 T="`dirname $F`/`basename $F | tr '[A-Z]' '[a-z]'`"
 if [ $T = $B ]; then
  echo "rm $F"
 fi
 B=$T
done

625 :login:Penguin:2010/02/28(日) 22:43:51 ID:oz3AO1O4
>>624
スペースを含むディレクトリ作って実行してみ。

626 :login:Penguin:2010/02/28(日) 23:06:54 ID:v9A/VFIk
Windowsじゃあるまいし。

627 :login:Penguin:2010/02/28(日) 23:09:17 ID:Z6hm/tn2
空白や日本語を許すかで世代間のギャップが存在するなw

628 :login:Penguin:2010/02/28(日) 23:11:07 ID:0w7cauqm
用件的にsamba絡みと予想してたけどね。知らんけど

629 :login:Penguin:2010/02/28(日) 23:13:21 ID:1hHY9Dv5
linuxでフォルダ名に空白入れることはないな、色々面倒だし

630 :login:Penguin:2010/02/28(日) 23:15:53 ID:oz3AO1O4
>>626
シェル変数参照の際、値に含まれるスペースや*などの
パス名展開の文字が解釈されてしまうのを防ぐため、
ダブルクオートで囲むのは常識。

Windowsじゃないとかいう問題ではなく、
シェルスクリプトを書く際の常識。

631 :login:Penguin:2010/02/28(日) 23:50:39 ID:fdN9Zkx+
カラだったときエラーになっちゃうしね

632 :login:Penguin:2010/02/28(日) 23:53:35 ID:v9A/VFIk
わかった。わかった。次回からそうするよ。

633 :login:Penguin:2010/03/01(月) 00:59:23 ID:IaBmVUuE
>>610
>ただ表示させてるだけじゃん。

findでヒットした結果には任意のコマンドを適用可能。
馬鹿か?

634 :login:Penguin:2010/03/01(月) 01:09:07 ID:6uFj7AQh
俺は>>628だからそもそもどうでもいいけど、それかなりどーでもいいぞ

635 :login:Penguin:2010/03/01(月) 01:09:42 ID:QTdHsVxq
>>606
ファイル名を全部小文字に変えて、重複してたら上書きされて結果的に一つ残る。
ってやり方でも出来ると思う。(効率は良くない)

こんなスクリプト書いて /home/hoge/script/RENAME_lower.sh とか名前付けて chmod +x しておく。
#!/bin/bash
START_DIR="`pwd`"
while (test -n "${1}") ; do
if [ -d "${1}" ] ; then
cd "${1}" &&
(
pwd ; ls
for i in *\.[Tt][Xx][Tt] ;
do
if [ -f "${i}" ] ; then
mv "${i}" "`echo ${i} | sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/`"
fi
done
)
fi
shift
cd "${START_DIR}"
done

ディレクトリを find とかで検索して RENAME_lower.sh で処理。
$ find . -type d -exec /home/hoge/script/RENAME_lower.sh {} \+

636 :login:Penguin:2010/03/04(木) 23:43:06 ID:oO8XEq75
#!/bin/shと#!/bin/bashはどちらがおすすめなの?

637 :login:Penguin:2010/03/05(金) 00:16:06 ID:IlIr0pSM
#!/bin/bash

638 :login:Penguin:2010/03/05(金) 00:19:11 ID:FZm9BOvl
#!/bin/bashだろjk

639 :login:Penguin:2010/03/05(金) 00:56:20 ID:GiIL1sMg
用途次第。以下はsh
・shで書いても機能・速度が許容範囲で簡単に書ける場合
・shでないといけない場合(busyboxとか)

640 :login:Penguin:2010/03/05(金) 08:08:46 ID:CTq7Tclv
>>5

641 :login:Penguin:2010/03/05(金) 08:37:14 ID:GiIL1sMg
そいつはこのスレのお約束+α。YOUのオススメを書きなよ

642 :login:Penguin:2010/03/05(金) 09:01:18 ID:lZJ9zNnO
今どきのディストリなら sh -> bash が当たり前だろ

643 :login:Penguin:2010/03/05(金) 09:56:40 ID:y7mY4KkL
使い捨てなら深く考えずどっちでも OK。
別のマシンでも使うならよく考える。

644 :login:Penguin:2010/03/05(金) 10:20:23 ID:8QC8E4i2
>>642
Debian、Ubuntuはdash

645 :login:Penguin:2010/03/05(金) 12:02:50 ID:kHG21Qzt
ださw

646 :login:Penguin:2010/03/05(金) 14:24:04 ID:ixxT+8DA
>>641
それはUNIX板のシェルスクリプトスレと勘違いして貼られたもん
このスレのテンプレじゃあない
>>5-10を見ろ

647 :login:Penguin:2010/03/05(金) 15:49:37 ID:D7CZBw7a
bashの構文を使ってれば#!/bin/bash、使ってなくても#!/bin/bash

648 :login:Penguin:2010/03/05(金) 22:06:54 ID:1xo9OzwV
おとなもこどもも、おねーさんも#!/bin/bash

649 :login:Penguin:2010/03/05(金) 22:38:25 ID:t7X9IkaB
BSD系の人たちはどうすれば?

650 :login:Penguin:2010/03/05(金) 22:41:37 ID:IlIr0pSM
板違いです

651 :login:Penguin:2010/03/05(金) 23:39:40 ID:GiIL1sMg
$ sudo -i
# cd /bin;\rm -f sh;ln -s bash sh

652 :login:Penguin:2010/03/06(土) 00:07:36 ID:z+KgTZo4
>>651
sudo ln -fs bash /bin/sh
でいいんじゃね。

653 :login:Penguin:2010/03/06(土) 00:53:02 ID:zGIcPUED
コピペはできないようにしたかったから二行
ln -f は嫌い rm -f が好き

654 :login:Penguin:2010/03/06(土) 11:13:20 ID:8ckQdz96
・sh では、while中で代入した変数は、ループから抜けると使えなくなりますか?
・それがPOSIX仕様なら、一時ファイルを作る以外に、よい回避方法はありますか?

$ date | while read line; do last="$line"; done; echo "THE LAST: $last"
を Debian lenny の dash, bash, ksh で実行した場合、ksh 以外では値が残りません。


655 :login:Penguin:2010/03/06(土) 12:21:04 ID:zGIcPUED
POSIX仕様は知らない
シェル実装によって違いがあるけどパイプはサブシェルで実行される
$ date | (while read line; do last="$line"; done;echo "THE LAST: $last")
で回避になるならいいけど
$ date | while read line; do last="$line"; done
$ echo "THE LAST: $last"
ということをしてkshを正解としたいなら一時ファイルくらいしか思いつかない

656 :login:Penguin:2010/03/06(土) 19:57:46 ID:vEOUh0ms
dateをパイプでwhileに放り投げる目的は何?

657 :login:Penguin:2010/03/06(土) 20:01:13 ID:lSm8LSXx
ただの例題

658 :login:Penguin:2010/03/06(土) 20:12:35 ID:zGIcPUED
このスレで質問してるやつはほとんど約1名でただのキチガイだと思ってる
区別ができれば間違いなく回答しないんだけどねぇ

659 :login:Penguin:2010/03/06(土) 21:29:26 ID:U6pPRiRF
お前以外は全部俺の自作自演です

660 :login:Penguin:2010/03/06(土) 21:38:12 ID:zGIcPUED
質問者以外はどっちでもいいけど

661 :654:2010/03/06(土) 22:34:04 ID:8ckQdz96
>>655さん
> シェル実装によって違いがあるけどパイプはサブシェルで実行される
勉強になります。
[linux-users:96159] Re: [bash]whileループ内変数値の扱いについて教えてください。
ttp://search.luky.org/linux-users.9/msg06102.html
のような、3以上のfdを使う方向でいこうと思います。
ありがとうございました。

662 :login:Penguin:2010/03/07(日) 05:39:29 ID:qUDKVagf
使っているbashの制約事項はどこに書いてある?

663 :login:Penguin:2010/03/07(日) 15:21:22 ID:kzHmHVjG
日本語でおk

664 :login:Penguin:2010/03/07(日) 15:50:18 ID:BVZuVuVb
>>662
/usr/share/doc/bash-doc-*/COMPAT
かな。

665 :login:Penguin:2010/03/07(日) 15:58:04 ID:CtU/xHgd
俺の認識不足なのかもしれんが
dateコマンドを単独で使っても、1行しか出力しなくね?

$ date
2010年 3月 7日 日曜日 15:50:25 JST

whileにパイプでつなぐ意味がわからん。
もしlsみたく複数行で出力するコマンド実行したならわからなくもないけど、
それなら無理にパイプでwhileにつなぐ必要ないし。

$ ls
sample.sh sample2.sh xyz.txt
$ for i in `ls`; do X="$i"; done; echo "$i"
xyz.txt

別の方法で簡単に解決できることをどうして難しくするのか意味不明。

666 :login:Penguin:2010/03/07(日) 16:24:31 ID:/xXz4ARQ
>>665
おまえは質問者の質問意図がわかってない

667 :login:Penguin:2010/03/07(日) 16:27:22 ID:CtU/xHgd
>>666
わかるわけない。
whileにパイプでつないでサブシェルになるからどうとか、
そういうので困ったことないから。


668 :667:2010/03/07(日) 16:29:06 ID:CtU/xHgd
っていうか、
実用上、それをどうしても使わないと書けないものなんてあるの?
例を示せるなら示してほしいもんだね。

669 :login:Penguin:2010/03/07(日) 16:31:06 ID:lFJTxoe3
おい、誰かこの馬鹿をつまみだせ

670 :login:Penguin:2010/03/07(日) 16:33:48 ID:CtU/xHgd
>>669
だから、実用上どういう意味があるのか教えてくれれば
言われなくても出ていくけど。

671 :login:Penguin:2010/03/07(日) 16:42:38 ID:lFJTxoe3
変数の扱い方が知りたかっただけろ。
例としてとりあえず適当に思いついたdateを使ったんだろう。
ただの一例なんだから実用上は別に意味ない。

672 :667:2010/03/07(日) 16:47:13 ID:CtU/xHgd
catコマンドを使ってファイルの中身を出力してパイプでwhileにつないだとか、
そういうのならわかるんだがな。
もっとも、その程度ならパイプ使わないで書けばいいだけだが。
だから、どんなことをキッカケにそんな質問が出てきたのかよくわからん。

まぁ、興味本位で意味のないことする人ってのもいるんだろうけどさ。
ガソリン車に灯油を入れてみるとか、
トラックでレールの上を走ってみるとか。
俺から見ると、そういう変人と同レベルの質問に見えるのさ。

673 :login:Penguin:2010/03/07(日) 18:49:32 ID:kzHmHVjG
(キリッ

674 :login:Penguin:2010/03/07(日) 18:57:12 ID:T97Hz24h
頭の中でdateを適当なものに置き換えればいいだけじゃん。
質問する上での便宜かもしれないってのに
いちいち突っ掛かってくるヤツってなんなの?

675 :login:Penguin:2010/03/07(日) 19:44:39 ID:CtU/xHgd
>>674
dateだからダメとかだけじゃなく、それ以前に変な質問だろ。

>>654
>それがPOSIX仕様なら、一時ファイルを作る以外に、よい回避方法はありますか?
に対する答は「パイプを使うな」。

>>661
>3以上のfdを使う方向でいこうと思います。
に対しては「他に手段がないならさておいて・・・正気か?」。

676 :login:Penguin:2010/03/07(日) 22:20:17 ID:EI1vZsn/
だから、お前はそもそもまともなスクリプトも書けないのに、容喙せんでいい。

677 :login:Penguin:2010/03/07(日) 23:06:32 ID:qcuqADXg
>>676
あれほどアホな質問しない程度には書けるが。
質問者が何をやろうとしてるか知らんが
意地でもパイプでwhileに投げて実現しようとしてんだろ?
まともな神経してたら別の方法でやるのにさ。

っていうか、質問者を擁護してる君も質問者みたいな書き方すんの?
合理性を考えたほうがいいよ。

678 :login:Penguin:2010/03/07(日) 23:27:59 ID:s4PVEnib
見ない間に核心つかれてるし
ここのキチガイはLIFEも低そうだし
なむなむ

679 :login:Penguin:2010/03/08(月) 08:59:52 ID:/FTwkaX/
mkfifoでnamed pipe作って使う手もあるな。

mkfifo fifo;
date > fifo&
while read line < fifo ; do last="$line"; done; echo "THE LAST: $last"
rm fifo

680 :login:Penguin:2010/03/09(火) 20:30:43 ID:o5fd938a
command 2>file.log

で標準エラー出力をファイルに書き出しているのですが、
エラーでない場合も0バイトのfile.logが生成されてしまいます。

エラーでない場合はfile.logは生成しない方法などあるのでしょうか?

681 :login:Penguin:2010/03/09(火) 20:44:25 ID:NDaUm8+N
>>680
終了ステータスでエラーかどうかわかるじゃん。

682 :login:Penguin:2010/03/09(火) 20:47:03 ID:LVMm3tsD

ウォーニングは無視ですか?

683 :login:Penguin:2010/03/09(火) 20:48:59 ID:JIyb876K
0バイトなら削除したらええがな

684 :login:Penguin:2010/03/09(火) 20:50:37 ID:NDaUm8+N
条件後出しか…

685 :login:Penguin:2010/03/09(火) 20:52:24 ID:LVMm3tsD
条件を甘く見たお前さんが悪い。

686 :login:Penguin:2010/03/09(火) 20:57:40 ID:NDaUm8+N
居直られちゃったよ。

687 :login:Penguin:2010/03/09(火) 21:03:59 ID:o5fd938a
>>683
削除することにしました。

ファイル作らないで良い方法はないのかなー?


688 :login:Penguin:2010/03/09(火) 22:45:08 ID:wS8nnpNv
2>file.log でファイルが開かれるのは command が実行される前。
エラーがあったかどうか分かるのは、command の実行が完了した後。
file.log の中身が重要かどうかは、実行終了まで分からないのだから、
普通に考えて、後から削除するのが素直ですよね。

素直じゃない例。長くなっても大丈夫か分かりません。

#!/bin/sh

exec 3>&1
cmd='{ ./some.sh 2>&3 1>stdout.log 3>&- ; } 3>&1 | grep -v warning'
errout=`eval $cmd`
exec 3>&-
if [ -n "$errout" ]; then
echo "there were one or more error"
echo "$errout" >stderr.log
fi


689 :login:Penguin:2010/03/10(水) 20:15:59 ID:7RM74zt/
久しぶりにマニアックなコード見た。

690 :login:Penguin:2010/03/12(金) 00:36:34 ID:g58g7Khc
読み解けん;_;

691 :login:Penguin:2010/03/16(火) 06:49:42 ID:+KO51EwF
一回3に2の出力を出して、空ならthere were one or more errorを1に出力、空じゃなければstderr.logに出力


692 :login:Penguin:2010/03/16(火) 08:33:07 ID:L4OU7Nfk
>>688

だれか解説よろ

693 :login:Penguin:2010/03/16(火) 17:36:29 ID:7rwiLleU
グロブで /etc/pass* のリストを得たいのだが、
list=/etc/pass*
だと展開してくれない。

list=$(ls /etc/pass*) ならおkで、改行文字 '\n' 区切りのリストになる。
だが ls のために fork してしまうのが痛い。
どうにかならんのか。

お願いします m(_ _)m

694 :login:Penguin:2010/03/16(火) 17:41:09 ID:7rwiLleU
あっさり解決した。
printf "%s\n" /etc/pass*

これでいいのか。よくわからんが、printfは組み込みコマンドだったはず。。

695 :login:Penguin:2010/03/16(火) 17:55:59 ID:oDvWUAap
>>693
試したら展開できたけどな。

696 :login:Penguin:2010/03/16(火) 17:59:59 ID:jFL6NZ+y
昔はechoを使ったもんじゃ

697 :login:Penguin:2010/03/16(火) 18:00:18 ID:7rwiLleU
>>695
本当貝?bash?
$ list=/etc/pass*
$ echo "${list[@]}"
/etc/pass*

ダメなんだが。。これをパイプで他のコマンドに渡したいから、ギリギリで展開されても困る。

698 :login:Penguin:2010/03/16(火) 18:01:26 ID:oDvWUAap
>>697
echo $list で。

699 :login:Penguin:2010/03/16(火) 18:01:54 ID:7rwiLleU
>>696
echo だと改行文字 '\n' 区切りのリストにならない。
$ list=$(echo /etc/pass*)
$ echo "${list[@]}"
/etc/passwd /etc/passwd-

700 :login:Penguin:2010/03/16(火) 18:03:33 ID:oDvWUAap
>>699
そんな条件なかったじゃん。

701 :login:Penguin:2010/03/16(火) 18:05:27 ID:7rwiLleU
>>700
だからprintfを使うことにしたよ。
「一行ずつ」読むコマンドにパイプで渡さないといけないから。

702 :login:Penguin:2010/03/16(火) 18:06:01 ID:oDvWUAap
後出しで文句言われても……。

703 :login:Penguin:2010/03/16(火) 18:07:08 ID:7rwiLleU
>>702
いえ事故解決しました、と言った後であなたが展開できましたとおっしゃったので
私はレスをしただけです。

704 :login:Penguin:2010/03/16(火) 18:08:01 ID:7rwiLleU
あ、どうもありがとう(^^)

705 :login:Penguin:2010/03/16(火) 18:15:41 ID:m9fA5s2e
for i in /etc/pass*; do echo "$i"; done | command...

706 :login:Penguin:2010/03/16(火) 18:17:49 ID:7rwiLleU
>>705
すみません、また後出しですが、一応言っておきます。
わざわざ変数 list に格納しているのは、後で自分が参照するからです。

707 :login:Penguin:2010/03/16(火) 22:36:09 ID:vMRJlqrh
はいはい次どぞー

708 :login:Penguin:2010/03/16(火) 22:41:29 ID:7rwiLleU
え、いいんですか?次

709 :login:Penguin:2010/03/20(土) 00:18:55 ID:qKxWTBVf
ファイルから丸括弧(開く) "(" だけの行を読み込んだ際、
if [ \( "$LINE" = "$CHK1" -o "$LINE" = "$CHK2" \) -a \( "$A" = "$B" -o "$C" = "$D" \) ]; then
といったif文でエラーとなってしまいます。
何がまずいのでしょうか?

710 :login:Penguin:2010/03/20(土) 07:41:24 ID:SCWfCSZ4
>>709
if [ \( "x${LINE}x" = "x{$CHK1}x"
だと通りませんか。


711 :login:Penguin:2010/03/20(土) 12:14:57 ID:qKxWTBVf
>>710
早速の回答、ありがとうございます。
マシンが平日しか使えないので、火曜日に試してみます。

ところで、$LINE="("の場合だと、
if [ \( "$LINE" = "$CHK1" \) ]; then だとエラーとなりますが、
if [ "$LINE" = "$CHK1" ]; then だとエラーとなりませんでした。
何か書き方が間違えているのでしょうか?

712 :login:Penguin:2010/03/20(土) 12:17:45 ID:qKxWTBVf
連投すません。

どちらの書き方も、$LINE="(A"とかだとエラーとなりません。
"("の場合のみ、エラーとなります。
なんでだろ?

713 :login:Penguin:2010/03/20(土) 22:21:20 ID:7Z9+G9O/
例外処理ってどうすればいいだろうか。

for x in ...
do
  処理A && \
  処理B && \
  処理C && \
  continue

  # エラー?
  後片付け、そして次のアイテム
done

サブルーチン化するもの手だけど、それも大袈裟な場合ってどうやるのがスマートだろうか。
すべてを && を繋げる方法しか思いつかない。。

714 :login:Penguin:2010/03/20(土) 22:33:44 ID:SCWfCSZ4
>>713
ttp://www.unix.com/shell-programming-scripting/38127-exception-handling.html
に、
cleanup_script()
{
echo "Cleaning ..."
}
trap 'cleanup_script' ERR
set -e
ってコードがあったです。set -e が肝らしい。

715 :login:Penguin:2010/03/20(土) 22:43:49 ID:7Z9+G9O/
>>714
ありがとう。便利ですが、/bin/sh(DebianだとDASH)ではうまく動作しませんでした。
BASHなら問題ありません。

handler()
{
  echo "Trap ERR!"
  exit 1
}

set -e
trap ?handler? ERR
for x in $(seq 1 10)
do
  echo $x
  [ $x -eq 5 ] && false
done

実行結果:
1
2
3
4
5
Trap ERR!

716 :login:Penguin:2010/03/20(土) 22:47:11 ID:7Z9+G9O/
SIGUSR1 30,10,16 Term ユーザ定義シグナル 1
SIGUSR2 31,12,17 Term ユーザ定義シグナル 2

これを使うのもアリか...

717 :login:Penguin:2010/03/20(土) 23:28:40 ID:7Z9+G9O/
あともう一つ質問!

#!/bin/sh
echo $@
exit 0

というプログラムがあったとして(test.shとする)、

./test.sh 'hoge' 'fuga' > fileA
./test.sh > fileB 'hoge' 'fuga'

をすると、fileAとfileBの両方とも同じ結果になるんだけど、これはどう違うの?

718 :login:Penguin:2010/03/21(日) 01:59:46 ID:AC+zwoRf
シェルスクリプトで他のサーバにあるファイルを弄ることは可能ですか?

具体的には、
ローカルPC、サーバA、サーバBという3台のPCがありまして
サーバA上の特定のファイルを編集してサーバBにアップロードし、さらにAにある他のファイルをBにアップロードする
という処理をローカル上のシェルスクリプトで自動化したいのです。

しかしsshコマンドで他サーバに繋ごうとするとパスワードを聞かれる所で止まってしまいます。

719 :login:Penguin:2010/03/21(日) 02:04:15 ID:65tFCowN
つ公開鍵認証

720 :login:Penguin:2010/03/21(日) 02:11:15 ID:AC+zwoRf
なるほど…やはりそうなるのですね
公開鍵とやらを勉強することにします
mysql -u root -prootみたいに指定できればいいのになぁ

721 :login:Penguin:2010/03/21(日) 02:16:36 ID:AC+zwoRf
というか、仮にsshで繋げたとしても
実行環境が他サーバに移るわけじゃないし他サーバのファイルをいじるのは無理なのかな?
シェルスクリプトはcdコマンドの実行結果すら次の行に持ち込まないですよね
全ての実行行は独立したシェルで実行されるとか何とかで。

722 :login:Penguin:2010/03/21(日) 02:36:57 ID:65tFCowN
こんな感じで編集も転送もできる
ssh -i 秘密鍵A ユーザ名A@Aサーバ "任意のコマンド(編集ならsedとかawk)"
ssh -i 秘密鍵A ユーザ名A@Aサーバ "任意のコマンド(転送ならscp -i 秘密鍵B 編集したファイル ユーザ名B@Bサーバ:保存場所 )"

エラー処理とかちゃんとしたいならAサーバに編集、転送用のスクリプト置いてクライアントからは引数だけ渡せばいいし

723 :login:Penguin:2010/03/21(日) 06:55:40 ID:s8pDEsGz
>>721
expectは?

724 :login:Penguin:2010/03/21(日) 09:41:21 ID:oiz+h8tr
>>721
>シェルスクリプトはcdコマンドの実行結果すら次の行に持ち込まないですよね

#!/bin/sh
cd /tmp
./hoge.sh

上記は/tmpに移動して、/tmpにあるhoge.shを実行するけど?

725 :login:Penguin:2010/03/21(日) 10:09:43 ID:s8pDEsGz
ssh host cd /tmp
ssh host ./hoge.sh

こんなアホをやっていると予想。

シェルスクリプトを予めscpで送っておくとか、標準入力の内容をスクリプトとして実効できたり出来ないんかね。

726 :login:Penguin:2010/03/21(日) 17:30:12 ID:cuEg7ODK
echo "( cd /tmp ; ./hoge.sh )" | ssh host
でいいですよね。

727 :login:Penguin:2010/03/21(日) 17:55:39 ID:gIM4/doG
>>712

-x をつけて実行してみるとなんとなくわかるかも。

文字列の比較のときは710氏の方式で前後に固定文字を入れたほうが誤動作しにくい。


ただタイプミスだと思うけど、中括弧の位置が間違ってて
 if [ \( "x${LINE}x" = "x${CHK1}x"
だけどね。

728 :login:Penguin:2010/03/21(日) 20:47:12 ID:NvA+aKwG
>>727
ありがとう。
固定文字列を入れて比較するのは、いいアイディアですね。
(なんで思いつかなかったんだろう…)

729 :login:Penguin:2010/03/24(水) 01:16:09 ID:fusHHN2e
お願いします。

・forの入れ子構造ってOKなんでしょうか?

#!/bin/bash
#nekoneko.sh

for var in aaa
do

for fstype in fs
do
hogehoge=neko
done

echo $var/$hogehoge
done

#sh nekoneko.sh

aaa/neko

期待結果は得られているのですが、勉強中なのであっているかどうかがわかりません。


・forでテキストファイルの読み込みってできないのでしょうか?
dosのバッチで言うところの for /f %%a in (nekoneko.txt) do 〜のような方法です。

よろしくお願いします。

730 :login:Penguin:2010/03/24(水) 01:24:36 ID:KIBvvI04
>・forの入れ子構造ってOKなんでしょうか?
OK

>・forでテキストファイルの読み込みってできないのでしょうか?
DOSのforはしらんが
for a in `cat nekoneko.txt`
でいいのか?


731 :login:Penguin:2010/03/24(水) 10:02:51 ID:qcQ/2FhI
>>729
インデントしようよ。
全角空白で書くけど、半角空白に変換してくれ。

#!/bin/bash
for var in aaa; do
 for fstype in fs; do
  hogehoge=neko
 done
 echo $var/$hogehoge
done

ファイル読んで回すのは while read とか使うんじゃね。

732 :login:Penguin:2010/03/24(水) 12:47:43 ID:D4crZAMy
>>731
全角空白のインデントはやめろ!
半角空白のほうがいい
お前の専ブラ変えろ馬鹿


733 :login:Penguin:2010/03/24(水) 12:51:42 ID:D4crZAMy
#!/bin/bash
for var in aaa; do
for fstype in fs; do
hogehoge=neko
done
echo $var/$hogehoge
done

734 :login:Penguin:2010/03/24(水) 12:58:21 ID:pFOtZDrD
恥ずかしいね。

735 :login:Penguin:2010/03/24(水) 13:12:41 ID:D4crZAMy
http://usamimi.info/~linux/d/up/up0503.png
http://usamimi.info/~linux/d/up/up0504.png

生ログにはタブと半角空白はきちんと記録されてるから。
素直に表示する専ブラで見れば奇麗にインデントされる。

736 :login:Penguin:2010/03/24(水) 13:18:59 ID:pFOtZDrD
おいおい、pre要素以外では連続する空白文字は一つにまとめられるのだが。
2ちゃんねるのデータ書式はウンコだけど、連続する空白文字をそのまま
表示する仕様なんてないぜ?

そういうブラウザを押しつけるのはどうなの、って思うけど。

737 :login:Penguin:2010/03/24(水) 13:25:53 ID:qcQ/2FhI
>>732
うちの環境では半角空白でも見えるけど
相手の環境で見えるとは限らないから。

738 :login:Penguin:2010/03/24(水) 13:29:31 ID:pFOtZDrD
これはブラウザ依存だと思うね。

空白文字をそのまま扱うものもあれば、HTMLの仕様に準じて無視するものもある。
&nbsp; を使う手もあるのだが、これを同処理するかもブラウザ依存。
まあ2ちゃんねるがクソなんだが。

739 :login:Penguin:2010/03/24(水) 13:31:53 ID:KIBvvI04
おまいらスクリプトについても語ってやれよ・・・

740 :login:Penguin:2010/03/24(水) 13:37:19 ID:D4crZAMy
>>737
アンタ良い人だね。
でもな、コード貼る事が多いスレを見てるんなら閲覧者のほうでインデントするブラウザにしたほうがお互いに楽だぜ。
貼るほうもコピーする側もそのまま使えるんだから。うっかり全角空白入れたまま使う事もない。
スクリプトスレなら困る事少いかもだが、全角空白の入ったパッチ貼られたりしたら目もあてらんねぇよ?

741 :login:Penguin:2010/03/24(水) 13:39:50 ID:qcQ/2FhI
>>740
だから「変換してくれ」って書いたじゃん。
閲覧者の環境まで責任持てん。

742 :login:Penguin:2010/03/24(水) 13:40:45 ID:qcQ/2FhI
良い人とかってよりも、portability を重視しただけだよ。
書く環境と読む環境が同じとは限らない。
こういう配慮はスクリプト書きもいっしょ。

743 :login:Penguin:2010/03/24(水) 13:48:01 ID:D4crZAMy
とりあえず「全角空白を推奨」するのだけは勘弁してくれ。
それが無きゃ俺も黙ってさ。


744 :login:Penguin:2010/03/24(水) 13:53:55 ID:qcQ/2FhI
推奨なんてしてないよ。

745 :login:Penguin:2010/03/24(水) 14:04:24 ID:D4crZAMy
>インデントしようよ。
>全角空白で書くけど、半角空白に変換してくれ。

インデントは推奨してるが、改めて見直すと全角空白推奨ではないと言われたら確かにそうだな。
いきなり俺の言い方がきつかったのは謝る。数日前にム板で同じような事があってココでもか!と思ったもんだからついな。
すまんかった >ID:qcQ/2FhI

746 :login:Penguin:2010/03/24(水) 14:05:59 ID:eh1BmETO
 
藻前ら、モティツケ
     /\⌒ヽペタン
   /  /⌒)ノ ペタン
  ∧_∧ \ (( ∧_∧
 (; ´Д`))' ))(・∀・ ;)
 /  ⌒ノ ( ⌒ヽ⊂⌒ヽ
.(O   ノ ) ̄ ̄ ̄()__   )
 )_)_) (;;;;;;;;;;;;;;;;;;;)(_(


747 :login:Penguin:2010/03/24(水) 15:40:14 ID:8MgVQE42
全角文字やTABなどを記号で表示するようにしておけば、
そうそう事故はないのでは?jaspace.elとか便利だよ。


748 :login:Penguin:2010/03/24(水) 15:52:39 ID:c/AsI/YT
学習用のネタとかならともかくパッチを 2ch に貼んのはやめたほうがいいんじゃね
書き込み確認のとこに
投稿者は権利の何もかもを管理者に無償譲渡することを承諾しますみたいなこと書いてあるぜ

749 :login:Penguin:2010/03/24(水) 16:12:14 ID:o3qxm3DD
どうしたんだ突然

750 :login:Penguin:2010/03/24(水) 18:28:22 ID:JGtYY8P/
find -exec command {} +
はもっと知れ渡るべき
日経Linux

751 :login:Penguin:2010/03/24(水) 21:53:30 ID:LVpGQGYh
xargsに慣れちゃって、手が勝手に打っちゃうんだよな

752 :login:Penguin:2010/03/25(木) 00:42:02 ID:AS83wWPj
>>730
hww

753 :login:Penguin:2010/03/25(木) 05:46:35 ID:bk8Jf0RP
ちゃんと理解しながら読んでいればインデントなんて枝葉末節。
自分のコードならばこだわるかも知れないけどね。

754 :login:Penguin:2010/03/25(木) 07:38:08 ID:woPIYugI
>>728
UNIX板で知った
ttp://www.opengroup.org/onlinepubs/009695399/utilities/test.html
の、APPLICATION USAGE から先が勉強になったです。
-a や -o より && や || でつなぐ方がよいとか。お題の部分についてはこれ。
test "$1" = "bat" -a "$2" = "ball"
syntax errors occur if $1 evaluates to '(' or '!'.
One of the following forms prevents this; the third is preferred:
test "X$1" = "Xbat" -a "X$2" = "Xball"
test "$1" = "bat" && test "$2" = "ball"
test "X$1" = "Xbat" && test "X$2" = "Xball"

755 :login:Penguin:2010/03/25(木) 10:18:07 ID:Bu4gYkWT
>>750
man find
したら、-exec command {} +の下に
-execdir command
とか
-execdir command {} +
とかを見つけた。勉強になった。

こういう事があると電子辞書より紙の辞書の方がいいかもと思う。


756 :login:Penguin:2010/03/25(木) 23:03:23 ID:AS83wWPj
>>753
とかほざく輩に限ってテストパターンは無限大な開放系のソースを書いちゃうの。
要はモデル化ができてないと。愚直というか馬鹿正直と言うか。

757 :login:Penguin:2010/03/25(木) 23:09:11 ID:P4/zjZQS
>>745
お前いいやつだなw

758 :login:Penguin:2010/03/26(金) 03:02:23 ID:y6rsP+OO
>>756 読解力ないんだな(プ

759 :login:Penguin:2010/03/26(金) 07:00:58 ID:joqM+Eq0
>>758
より多くの人に読解できることを目的にしていないロジックはオナニーだろう。

760 :login:Penguin:2010/03/26(金) 07:13:10 ID:jyaRuxPh
つまり日本語はオナニー

761 :login:Penguin:2010/03/26(金) 07:49:22 ID:WwpVuIlf
セックスよりも気持ちいい

762 :login:Penguin:2010/04/02(金) 15:42:26 ID:la5bZF10
bashなどで標準出力はデフォルトで画面となっていますが、具体的にはどのファイルになりますか?
debianですと/dev以下にあるのだと思いますが。

763 :login:Penguin:2010/04/02(金) 16:00:38 ID:FvuB/nMw
>>762
ls -l /proc/$$/fd/1

764 :login:Penguin:2010/04/05(月) 20:18:53 ID:HX4Ssz6U
フラシュメモリ をマウントするとき
# mount /dev/sdb1 /mnt/usb
こんな感じでやると思いますが、
もし、フラシュメモリが挿されていて、かつ、マウントされていない場合これを実行し
その他の場合、実行しないという、シェルスクリプトを教えてください

765 :login:Penguin:2010/04/05(月) 20:31:37 ID:hbFmdj3V
>>764
問題点は
・フラッシュメモリがささってないことをどうやって判定するか
・マウントされていないことをどうやって判定するか
でしょ。
それシェルスクリプトの話じゃないよ。

766 :login:Penguin:2010/04/05(月) 21:02:20 ID:HX4Ssz6U
>>765
やはり無理ですか、
・フラッシュメモリがささってないことをどうやって判定するか
・マウントされていないことをどうやって判定するか
ここは、Cか何かで実装し、結果によって、振る舞いを決めるしかなさそうですね

767 :login:Penguin:2010/04/05(月) 21:12:06 ID:8DwAi4Rq
/dev/disk/by-uuid/ 見てそのUSBメモリがささってるか判定して
マウントは /proc/mounts とか /etc/mtab 見ればわかる

768 :login:Penguin:2010/04/05(月) 21:58:19 ID:HX4Ssz6U
>>767
できました、ありがとう。
それにしても
>それシェルスクリプトの話じゃないよ。
とは・・・・

769 :login:Penguin:2010/04/05(月) 22:26:27 ID:bIAGjuYt
え、どこがシェルスクリプト?

770 :login:Penguin:2010/04/05(月) 22:26:30 ID:V3kmV0qU
シェルの機能に全く関係ない話だから、スレ違いと言われても仕方ない

771 :login:Penguin:2010/04/05(月) 23:04:52 ID:10PWkAma
>>769-770
君たちはきっとUNIX板のシェルスクリプトスレのほうが馴染むよ
向こうに移ったら?

772 :login:Penguin:2010/04/05(月) 23:09:37 ID:Do3l7NFE
シェルの文法と組み込みコマンド以外は
スレ違い。

773 :login:Penguin:2010/04/06(火) 00:29:43 ID:cl/KUIMr
そこまでは言わないけどさ、
>>764 のスクリプトって

>>765 && mount /dev/sdb1 /mnt/usb

で終わりじゃん。
あとは >>765 の条件をどう書くかだけ。
そこはシェルスクリプトの話じゃない。

774 :login:Penguin:2010/04/06(火) 23:07:19 ID:hKo4mn1/
退屈すぎるんだよ
ただ手順を羅列していくだけの命題はこのスレではシェルスクリブトではない判定

775 :login:Penguin:2010/04/08(木) 12:37:33 ID:FdKyqazj
/path//mydirというディレクトリが確かに存在します。
rm -rf path/mydir
とすれば削除できるのに
if [-d /path/mydir ]; then rm -rf path/mydir
とすると削除できません。

何故でしょうか。

776 :login:Penguin:2010/04/08(木) 12:49:32 ID:BdM60+Gl
すばやくシェルスクリプトを作る方法を教えてください。

777 :login:Penguin:2010/04/08(木) 13:03:15 ID:ahHfR+UP
>>775
if [ -d /path/mydir ]; then rm -rf /path/mydir

778 :login:Penguin:2010/04/08(木) 13:11:54 ID:YRM82Sus
>>776
俺は指におもりをつけて毎日8時間訓練している。
だいぶ重いスクリプトも楽々書けるようになった。
でもやり過ぎには注意な。
知り合いに、焦点性ジストニアになってシェルスクリプターへの道を絶たれたやつが何人も居る。

779 :login:Penguin:2010/04/08(木) 15:13:49 ID:FdKyqazj
揚げ足はいいからさっさと答えろボケ

780 :login:Penguin:2010/04/08(木) 15:21:34 ID:0e8PS1D/
まず服を(ry

781 :login:Penguin:2010/04/08(木) 15:24:54 ID:rTqLBiaG
>>779
問いが支離滅裂なので回答不能です

782 :login:Penguin:2010/04/08(木) 15:27:17 ID:ahHfR+UP
>>779
ん? >>777 じゃ違った?
んじゃ権限まわりを確認。

783 :login:Penguin:2010/04/08(木) 16:01:31 ID:P25bssZd
いきなりifとrmまとめずに

if [-d /path/mydir ]; then echo hoge

がhogeを出力するかどうかぐらい切り分けしようぜ。

784 :login:Penguin:2010/04/08(木) 16:03:13 ID:ahHfR+UP
>>783
[ と -d は離さないとだめだよ。

785 :login:Penguin:2010/04/09(金) 16:33:43 ID:8l460jgK
最近の初心者は、[ も一つのコマンドであることすら知らんのか?

786 :login:Penguin:2010/04/09(金) 16:36:53 ID:wbxQcOPK
昔の初心者もそうだよ。

787 :login:Penguin:2010/04/09(金) 17:26:28 ID:ZKESoIes
おじいちゃん、乙!

788 :login:Penguin:2010/04/09(金) 19:57:43 ID:1H+gjPy/
[ ってコマンドだったの?

玄人だけど始めて知ったよ?orz

789 :login:Penguin:2010/04/09(金) 20:04:23 ID:5ssP89Ht
LPICレベル3coreに受かったばかりの素人だけど
[]はtestコマンドの略式じゃなかったかな

790 :login:Penguin:2010/04/09(金) 20:26:24 ID:wbxQcOPK
>>788
type [
help [

791 :login:Penguin:2010/04/09(金) 20:27:45 ID:i0zzyora
>>788
コマンドじゃないなら何なんだよ

792 :login:Penguin:2010/04/09(金) 22:04:47 ID:+RKMLUfB
>>791
構文。

C言語の == は関数ではないし。

793 :login:Penguin:2010/04/09(金) 22:06:05 ID:StH4VNmO
昔は、[ は test へのハードリンクと決まってたもんだが、
いま手元のFedora 12を見たらそうじゃなかった。(ファイルサイズも違うし…)
やっぱり日々勉強ですな。

794 :login:Penguin:2010/04/09(金) 22:10:28 ID:wbxQcOPK
>>793
coreutils の lbracket.c 読んでみ。

795 :login:Penguin:2010/04/09(金) 22:27:52 ID:StH4VNmO
>>794
読んだ。
面白いけど、Coolとは言えんなぁ…

796 :login:Penguin:2010/04/10(土) 23:41:09 ID:IGsQWo8s
grepで検索行以外の行を抽出する方法は無いでしょうか?

797 :login:Penguin:2010/04/11(日) 00:27:05 ID:eH4Novr7
grep -v '文字列'

798 :login:Penguin:2010/04/11(日) 00:34:34 ID:3KDsWIIS
>>797
ありがとう

799 :login:Penguin:2010/04/11(日) 16:13:06 ID:1yJmv1GD
初めてシェルスクリプトを加工としていまうs

サブルーチンを作る参考にしようと#!/bin/shなファイルを見ているんですが
関数を使ったスクリプトはほとんどありません
こういうものでしょうか?

任意の値を返せないのでグローバルな変数を介する必要があると思いますが
保守性が低下しないうまい定義の仕方というのはあるんでしょうか

あるいは関数を使わなくてもいいようなシェルスクリプトの特有のコンセプト
とか書き方があるんでしょうか

漠然とした質問ですいません

800 :login:Penguin:2010/04/11(日) 16:21:22 ID:ESnWs44w
漠然としてるねぇ。
もうちょっとスクリプト書きに慣れてから考えればいいんじゃないかな。

801 :login:Penguin:2010/04/11(日) 17:04:57 ID:btbPPhym
いやそれより、初心者向きの参考書でも買って
一からじっくり勉強した方が良いと思う。
>>799は、ここで質問して解決するスキルレベルに程遠い。

802 :login:Penguin:2010/04/11(日) 17:49:36 ID:O63F6ul8
>>801さんまじかっけー

803 :login:Penguin:2010/04/11(日) 20:21:58 ID:bAKRtVTC
>関数を使ったスクリプトはほとんどありません
>こういうものでしょうか?
いえ。
ただ、スクリプトは、
1) 手っ取り早く仕上げる事が多いので十分に最適化されない
2) 最適化されたスクリプトは必ずしも可読性がよくないので敢えて最適化しない
といったことはあると思います。

804 :login:Penguin:2010/04/11(日) 20:51:15 ID:eH4Novr7
わざわざ外部関数までつくって何でもシェルスクリプトでやるより多言語から単体のシェルスクリプト叩かせたほうが安心できる

805 :login:Penguin:2010/04/12(月) 01:55:25 ID:56zfLj4c
>>803
回答ありがとうございます

最適化というのがどういうものか具体的には分かりませんが、例えば関数を組み合わせようと
すると値をやり取りするグローバル変数が必要になるのではと考えました。しかし、必要に
なるごとに関数内で定義、参照するとそういった変数がどこでどう利用されているか確認しなければ
ちょっとした変更も危険になると思います。あるいはメインの手続き側に定義を羅列するとしても
どう利用するのかはコメントでもしないかぎり分からないし、そもそも構造内部を関数へと段階的に
隠蔽する目的を果たせなくなってしまい、やはり可読性保守性は低下します。一方でルールベース
の対策でこういった問題を解決できるようにも感じたので、そういったことについてベーシックな議論を
している人たちがいるのではと思い質問しました。

しかしこのスレッドを読んでいると>>803(1)や>>804にあるように、そういう道具だと割りきって使う
ものだという風にも思いました。シェルスクリプトの欠点を何千万人もの人があえて見なかったこと
にして使っているとすると、とても面白いことですね。それだけ目的を満足させる道具で、また知っ
て初めて分かる魅力があるということなんでしょうかね

(2)については一枚目から鱗が落ちました。習作のつもりでUTF8のテキストをEUC-JPに変換して
からa2psでポストスクリプトを生成するコードを再発明しているのですが、たしかに関数を使っても
全然読みやすくなっていない! いや、正確には処理の始点と大枠の処理の流れは把握しやすく
なっていますが、コード量は後付けでどんどん増加するし、ちょっとした読みやすさのために定義
したマクロ的関数は、それ単体でみるとなんとも得体の知れないものになっていました。

色々な機能を試したいというのもあるのですが、やはり簡潔で読みやすいコードを書くということを
前提にして、そのうえでシェルスクリプトらしい書き方を身につけるようにします

806 :799,805:2010/04/12(月) 02:02:53 ID:56zfLj4c
勢いでいい子ちゃんぶった嘘をつきました・・
たぶん動けば汚くてもいいやの精神でなんだかよく分からないコードを書き続けると思います
ゴメンナサイです

807 :login:Penguin:2010/04/12(月) 11:43:55 ID:Qe0ukjkj
/usr/binの中に'['とかゴミがあったので削除したら、起動しなくなったという
笑い話をよく聞いたな。

808 :login:Penguin:2010/04/12(月) 12:14:55 ID:Cm3bm4a3
>>807
ほう、それは初耳だ。
いまどきの sh は [ を内蔵しているので、
外部コマンドの [ を意図して呼ばないかぎり存在しなくても問題ない。
[ が外部コマンドだった昔は、[ は /usr/bin ではなく /bin にあった。
# つーか、/usr/bin/[ なんて今でも linux だけ。


809 :login:Penguin:2010/04/12(月) 13:13:25 ID:s3PYGw84
ここはLinux板ですから

810 :login:Penguin:2010/04/12(月) 13:31:44 ID:FrL0zKPd
「[ を消してうんぬん」は Linux 以前の時代の話だと思う。

811 :login:Penguin:2010/04/12(月) 18:27:16 ID:rk0wy3GT
プロプラの古いshを使ってないと通じないジョークだな

812 :799:2010/04/17(土) 23:26:31 ID:f4tmK5PF
先だっては大変お世話になりました
なんとか動くっぽいもの書けました

根本的に間違ってるところやイディオムに直すべきところなど多々あるんだろうと
思うんですが、身近に聞ける人がいなくて困ってます。ので誰かにレビューして欲しいです
なにとぞ、なにとぞー

http://up.af/015849

813 :799:2010/04/17(土) 23:38:16 ID:f4tmK5PF
すんません私のファイルはこっちでした
上のTシャツおっぱいは忘れてください^^
http://up.af/015867

814 :login:Penguin:2010/04/17(土) 23:41:35 ID:xq8djkPZ
わざ。わざ

815 :login:Penguin:2010/04/18(日) 13:57:11 ID:XFWJRzoK
献上品のTシャツおっぱいが404なので眺めるだけな

>#!/bin/sh
dashで動作確認したのなら素直に#!/bin/dash

> file_num=`expr $file_num + 1`
exprいらなそう
file_num=$((file_num + 1))

> local num=0
> for num in `seq 1 $file_num`; do
> source_files_get $num
> MESSAGE "converting: $file"
> cat "$file" | $NKF -e > "$temp_dir/${file##*/}"
> done
seqとcatいらなそう
local num=1
while [ $num -le $file_num ]; do
 source_files_get $num
 MESSAGE "converting: $file"
 $NKF -e "$file" > "$temp_dir/${file##*/}"
num=$((num + 1))
done

>local status=1
local使う意味なし&多分bashでコケる

816 :login:Penguin:2010/04/19(月) 01:23:48 ID:ZAvND9//
>>815
式展開というものが色々あるんですね
むやみに外部コマンドを呼ばないという発想もなかったです
マニュアルを引いてあれこれ確認したいと思います
レスありがとうございました

817 :login:Penguin:2010/04/21(水) 22:02:51 ID:CZfDlwcf
>>813
python風のループだな。
LLみたいに関数を使いたければ値をやり取りするフレームワークを書けばよいかも。

818 :login:Penguin:2010/04/22(木) 23:27:27 ID:eajRO0wt
commandA > file
commandB > file

{ commandA; commandB; } > file

はどっちの方がいいの?
後者の場合は、シェルによってはサブシェルが起動するって聞いたけど本当貝。

819 :login:Penguin:2010/04/22(木) 23:48:35 ID:sUoTjkov
>>818
上意味違うだろ。

820 :login:Penguin:2010/04/22(木) 23:52:47 ID:eajRO0wt
間違えた!
前者は

commandA > file
commandB >> file

821 :login:Penguin:2010/04/23(金) 00:01:08 ID:sUoTjkov
正直、目くそ鼻くそじゃね?


822 :login:Penguin:2010/04/23(金) 00:03:10 ID:4U7Ovp/A
そう?
じゃあ気にしないでいいか。

823 :login:Penguin:2010/04/23(金) 00:10:54 ID:Odx5g+6A
悩んでるうちに書いて実行した方が仕事は早く終わるだろ。

824 :login:Penguin:2010/04/23(金) 05:48:09 ID:0SL93pt/
>>818
後者のほうが効率いい

825 :login:Penguin:2010/04/24(土) 12:19:07 ID:uV1EwGDC
>>824
スクリプトの一文が長すぎる。
パイプラインもメンドイ。

826 :login:Penguin:2010/04/24(土) 22:06:24 ID:F/lhQSxk
>>818
前者の場合、commandAの出力はどうなるのかな?w

827 :login:Penguin:2010/04/24(土) 22:21:58 ID:loCBys/t

大丈夫かな、この人・・・

828 :login:Penguin:2010/04/24(土) 22:57:54 ID:XH+rWnSs
笑っとけ笑っとけ。

829 :login:Penguin:2010/04/24(土) 23:02:02 ID:/2NBYvX3
>>826
修正してるじゃないか、 >>820

830 :login:Penguin:2010/04/24(土) 23:03:08 ID:loCBys/t
恥ずかしいね

831 :login:Penguin:2010/04/24(土) 23:51:55 ID:ra/w56Dm
>>825
あれで長いって、普段どんなスクリプト書いてんだ?

832 :login:Penguin:2010/04/25(日) 09:35:32 ID:iXPvNLwg
>>831
いや、引数が100個とかになってきたら。

潰しが利かない。

833 :login:Penguin:2010/04/25(日) 09:37:17 ID:pW61wlqY
意味不明

834 :login:Penguin:2010/04/25(日) 09:39:20 ID:iXPvNLwg
>>833
脊髄じゃなく、脳で考えてください。

835 :login:Penguin:2010/04/25(日) 10:09:49 ID:ZtdJByaw
その価値のある文章を頼む。

引数とはどの部分の引数なのか?
潰しが利かないという主張の根拠は?

836 :login:Penguin:2010/04/25(日) 10:39:21 ID:MLqGsd45
これ以上この話を続けても有益な情報は得られないと思う。

837 :login:Penguin:2010/04/25(日) 11:27:46 ID:iXPvNLwg
>>818
commandA > file
commandB >> file

{ commandA; commandB; } > file

コマンドが100個になったのでwhileで省力化したい。

上の方
rm -f file 2>/dev/null

while read cmd;do
$cmd >> file
done < cmds.txt


下の方
xargsを使えば出来そうだけど{}が内部コマンドなのが気になる。
1行のコマンドラインの文字数制限があるシェルもある。
ので、汎用性が無い。



838 :login:Penguin:2010/04/25(日) 11:34:27 ID:iXPvNLwg
制御構造の使えないシェルスクリプトなんて、バッチファイルの如く、無価値である。

839 :login:Penguin:2010/04/25(日) 11:37:39 ID:GR3waYM0
>>837
よくわかんねえけど
そのcmd.txtって、事実上シェルスクリプトだよな

単に
sh cmd.txt >file
でいいんじゃねえの

840 :login:Penguin:2010/04/25(日) 11:46:22 ID:gQNuPSjh
wwww

841 :login:Penguin:2010/04/25(日) 11:49:42 ID:iXPvNLwg
>>839
そだな。それが最適解だ。

842 :login:Penguin:2010/04/27(火) 22:06:55 ID:HNWNlh/r
for((i=0; i<6; i++)){
array=("${array[@]}" "i")
}

echo "${array[@]}"

これを実行すると下記のように出力されます。
0 1 2 3 4 5

カンマ区切りで下記のように出力する方法ありますか?
0, 1, 2, 3, 4, 5


843 :login:Penguin:2010/04/27(火) 23:08:31 ID:3UTvz9hd
>>842
最後の出力を実現するのなら seq -s ', ' 0 5 で済むけど、
配列の各要素を任意の区切文字で繋げて出力する方法を知りたいということかな

zsh/ksh なら echo ${(j:, :)array} でできるけど、bash でどうなのかは知らない

844 :login:Penguin:2010/04/27(火) 23:18:40 ID:HNWNlh/r
>>843
説明不足で申し訳ないです。

配列の各要素をカンマ区切りで出力する方法です。

・訂正します
array=(1 2 a b 3 c )
echo "${array[@]}"

これを実行すると下記のように出力されます。
1 2 a b 3 c

カンマ区切りで下記のように出力する方法ありますか?
1, 2, a, b, 3, c


echo ${(j:, :)array} は使えませんでした。

845 :login:Penguin:2010/04/27(火) 23:37:13 ID:wOLuHHkh
>>844
IFS="," ; echo "${array[*]}"


846 :login:Penguin:2010/04/28(水) 10:15:03 ID:ttzp8AMm
echo "${array[@]}" | sed 's/ /, /g'

847 :844:2010/04/28(水) 11:26:50 ID:+626EOW1
>>845-846
できました!ありがとうございました。


848 :login:Penguin:2010/05/14(金) 14:01:50 ID:Lcs4j28l
bashを使っています。
echo hoge > /dev/tcp/192.168.0.10/5000
を実行したのですが、接続されません。
/dev/tcp/192.168.0.10/5000: No such file or directory
になってしまいます。なぜでしょうか。

192.168.0.10:5000にはサーバプログラムが存在してて
telnet等で接続可能な状態です。

849 :login:Penguin:2010/05/14(金) 15:54:19 ID:7jm5ABJn
> echo hoge > /dev/tcp/192.168.0.10/5000

そもそも,何がしたいの?

850 :login:Penguin:2010/05/14(金) 16:00:16 ID:7jm5ABJn
あ,何がしたいのか分かった.でも解決策は分からなかった.
すみません,無視して下さい.

851 :login:Penguin:2010/05/14(金) 16:17:18 ID:Lcs4j28l
すみません自己解決しました。

852 :login:Penguin:2010/05/14(金) 16:54:10 ID:toqyegKW
シェルスクリプト内でexpectを呼んで、リモートホストにログインし
コマンドを実行して実行結果を呼び出したシェルの環境変数に入れる事は出来ますか?

#!/bin/sh

PROMPT="\"\\\\$ $\""

expect -c "
spawn ssh リモートホスト

expect -re $PROMPT
send \"hostname\r\"
expect -re \"hostname\\r\\n\"
expect -re \"(\\[a-zA-Z\\.\\]+)\\r\\n\"
set TEST \$expect_out(1,string)
expect -re $PROMPT
send \"exit\r\"
expect eof
"

echo "result=$TEST" ←カラになってしまう

853 :login:Penguin:2010/05/14(金) 22:14:18 ID:C/f2ur1w
子プロセスの環境変数は親プロセスには渡らないだろ。子プロセスがechoしてそれを親で受け取るとか。

854 :login:Penguin:2010/05/24(月) 23:51:39 ID:Am1WdIur
おもしろいね。 ここw

855 :login:Penguin:2010/05/25(火) 11:30:05 ID:rQ8o0yBp
http://lh5.ggpht.com/yukun.info/SM5CEJVm6pI/AAAAAAAAAzk/3KKFrwkCXao/s400/shellscriptREg.jpg
http://www19.atpages.jp/imagelinkget/get.php?t=v&u=image.yodobashi.com/product/a/6526/100000009000434496/M000012299710002.jpg
http://image.yodobashi.com/product/a/6643/100000009000479432/M000017919010002.jpg
http://pc.bookmall.co.jp/bookimage/9784534040060.jpg
http://sunone.dyndns.org/img/ss_shellscript.png


856 :login:Penguin:2010/05/28(金) 17:59:04 ID:TVdJgTpM
画像で貼ることに意味あんのか

857 :login:Penguin:2010/05/31(月) 15:16:55 ID:QxCIBmxe
date -d '10 days ago'
のdateをシステム時刻ではなく、'20050101'を基準にしたい場合はどうすればよいですか?

858 :login:Penguin:2010/05/31(月) 15:39:21 ID:xjHr+eWi
date -d '20050101 10 days ago'

859 :login:Penguin:2010/05/31(月) 17:30:00 ID:QxCIBmxe
>>858
でけた。ありがと

860 :login:Penguin:2010/06/02(水) 14:19:20 ID:PFRBtasL
#$ -S /bin/bashの-Sって何?
ぐぐれないよお

861 :login:Penguin:2010/06/02(水) 15:30:19 ID:1GD/9cHW
>>860
man bashすると
-S file
True if file exists and is a socket.
-S Display readline key sequences bound to macros and the strings they output.
-S suffix
suffix is appended to each possible completion after all other options have been applied.
って書いてあるけど?

862 :login:Penguin:2010/06/03(木) 06:07:26 ID:hg38oMN9
bashでプロセス監視系のシェル作ってるんですが任意のプロセスのプロセスIDからプロセス名を取得するには
ps pidの後でawkとかperl使うしか無いですかね?
綺麗にコマンド1つで片付けられないかと調べてみてるのですがなかなか…

863 :login:Penguin:2010/06/03(木) 07:00:36 ID:WvQTVLag
>>862
cat /proc/(pid)/になんかあるんじゃね?

864 :login:Penguin:2010/06/03(木) 08:42:13 ID:q5DckAvu
SHELLって任意の場所からファイルを
一行づつ読み込んだり出来る?
こんな風に

while ファイルA ファイルBの末端まで
do
 ファイルAからXに一行読み込み
 ファイルBからYに一行読み込み
 if $Xと$Yを比較
 then
   処理
 fi
done

865 :862:2010/06/03(木) 09:05:02 ID:oG88VoRM
>>863
手当たり次第に見てみましたが、status配下から抜き出すにしても結局awk操作になりそうです
見落としてるだけで上手く拾える物があるんでしょうか?

866 :login:Penguin:2010/06/03(木) 10:05:27 ID:GsUbBleg
read a </proc/$pid/cmdline
echo $a


867 :login:Penguin:2010/06/03(木) 10:09:27 ID:8XZFMkrD
>>862
ps --no-headers -o command 25123
とか?

868 :login:Penguin:2010/06/03(木) 10:13:10 ID:8XZFMkrD
>>864
そういうのは perl か何かでやった方が楽そう。

869 :login:Penguin:2010/06/03(木) 10:15:53 ID:QMG36mVA
>>862
pgrepを使うのは反則なの?

870 :login:Penguin:2010/06/03(木) 10:18:28 ID:8XZFMkrD
>>869
pgrep でどうやるの?

871 :869:2010/06/03(木) 10:21:03 ID:7YfCa7sT
>>870
すまん、逆だったのか。

872 :862:2010/06/03(木) 11:01:39 ID:oG88VoRM
皆さん色々とアドバイスありがとうございます。
最終

873 :862:2010/06/03(木) 11:09:24 ID:oG88VoRM
皆さん色々とアドバイスありがとうございます。
最終的にファイル名に落とす(これは先に言うべきでしたね)事等考慮し、
/proc/pid/statusのName行をawk、あるいはps -e | grep "^pid" | awk '{print $4}'
あたりでの抽出を考えてみようと思います

874 :login:Penguin:2010/06/03(木) 11:13:00 ID:8XZFMkrD
>>873
> ps -e | grep "^pid" | awk '{print $4}'
これだと PID が 234 のをひっかけようとして 2345 も出力したりするよ。
>>867 の1コマンドで済ますのはダメなん?

875 :login:Penguin:2010/06/03(木) 11:23:09 ID:oG88VoRM
>>874
>>867のコマンドだと対象のプロセスがシェルスクリプトの場合に/bin/bash shellname.sh
といった形式で取得となってしまうので…この後ファイル名に落とすのにちょっと扱いづらいかと
思いまして。
/やらを_に置換してもぱっと見どうかな、と。

psでの取得に関するご指摘はまったくもってその通りですね
ひとまず/proc配下のファイルからの取得を軸に考えてみます。

876 :login:Penguin:2010/06/03(木) 11:24:17 ID:8XZFMkrD
>>875
なら command じゃなく comm で。

877 :login:Penguin:2010/06/03(木) 11:31:06 ID:oG88VoRM
>>876
出来ました∩(・ω・)∩バンジャーイ

ありがとうございました
スクリプト以前にコマンドの使い方についてもっと勉強しないとですね…

878 :login:Penguin:2010/06/03(木) 11:31:38 ID:GsUbBleg
ps で表示されるコマンド名を自分で書き換えちゃうようなものも存在するので注意。
sendmail とか。

ってゆーか、

>bashでプロセス監視系のシェル作ってるんですが任意のプロセスのプロセスIDからプロセス名を取得するには

この発想がすでに間違ってる気がしなくもない。
pidからプロセス名を調べるのがなんで監視になるんだ?
ふつーにSNMPとか使ったら?


879 :login:Penguin:2010/06/03(木) 22:04:10 ID:WvQTVLag
>>866
catで良くね?

880 :login:Penguin:2010/06/03(木) 22:05:17 ID:WvQTVLag
>>878
監視という言葉に脊髄反射してませんか。
教科書に載ってるのだけが監視じゃないぞと。

881 :login:Penguin:2010/06/03(木) 22:33:58 ID:3KNqnRnA
>>875
じゃあこれでいいんでね?
basename $(ps --no-headers -o command 30242 )

882 :login:Penguin:2010/06/04(金) 10:15:38 ID:qPmJ4dHA
>>879
cmdlineにはargv[]の内容が\0で区切られて入ってる。
catだとその全部が見えてしまって、argv[0]\0argv[1]\0...という値になってしまう。
readだと\0が終端に見えるのでargv[0]だけを取得できる。


883 :login:Penguin:2010/06/04(金) 20:54:07 ID:zMGFf6r+
>>882
なるおど!

884 :login:Penguin:2010/06/11(金) 23:35:53 ID:HBiF4xvh
配列の中に特定の要素があるかどうか調べるにはどうやるのが一番スマート
でしょうか?
例えば
VAR=(a b c)
の時に $VAR に b が入ってれば真、なければ偽とする、みたいなのです。
すなおにgrep?

885 :login:Penguin:2010/06/12(土) 00:53:00 ID:Tu3vL6go
一番スマートなやり方は知らないな

886 :login:Penguin:2010/06/12(土) 21:51:36 ID:nNBrRbmB
>>884とりあえず、お前が考えたスマートじゃないやり方を見せてくれよ

887 :login:Penguin:2010/06/12(土) 22:00:58 ID:EefkO+3+
>>884
for i in ${VAR[@]}; do 判定; done

888 :login:Penguin:2010/06/12(土) 22:22:39 ID:vZS9Vjdk
>>885
二番くらいでもいいです。

>>886
あの後も引き続き調べまして、いまんとこ以下のようにしています。

VAR=(abb bbb cbb)
case ${VAR[@]} in *bbb*) 真の時の処理 ;; esac


889 :login:Penguin:2010/06/12(土) 23:16:21 ID:KrNan9r+
VAR=(abb bbb cbb)
test ${VAR[@]/!(bbb)}
echo $?

890 :login:Penguin:2010/06/14(月) 20:31:06 ID:ieeFt0nm
メールの本文を自動処理するようなシェルスクリプトを書きたいのですが、
テキストをcatしてsed通してgrepしてcutしたのを一行ずつreadして…
とかパイプでつないでやってると冗長になるし途中でチェックもしにくいです。

あるコマンドの出力を一時的に書き出すにはファイルにリダイレクトするとかしかないでしょうか?
出来るだけ一時ファイルは作りたくないのですが…

891 :login:Penguin:2010/06/14(月) 20:36:22 ID:MVbgUvvH
>>890
perl か何かで書いた方がいいんじゃね。

892 :login:Penguin:2010/06/14(月) 20:39:47 ID:udeYlwxg
俺ならPerlかPHP使う

893 :login:Penguin:2010/06/14(月) 20:55:45 ID:ieeFt0nm
早速レスありがとうございます。
perlですか。むむ。
なんか管理の都合とかで自動しょりはシェルスクリプトでやれとかいわれんですよね…わけわからんけど…

泣きそうですがなんとかやってみます

894 :login:Penguin:2010/06/14(月) 20:57:48 ID:MVbgUvvH
>>893
シェルだとやりにくいこともいろいろあるからね。
perl じゃなくてもいいけど、
何かもう一つ LL 使えるよう社内で交渉してみなよ。

895 :login:Penguin:2010/06/14(月) 23:00:13 ID:4fMlpx51
>>890
そんな貴方にnamed pipe

896 :login:Penguin:2010/06/17(木) 20:01:24 ID:4/LF4otz
>>890
> テキストをcatしてsed通してgrepしてcutしたのを一行ずつreadして…
それ、needless catじゃね?
sedしてgrepってのも、sedだけで済みそうだけど…
cutしたのをreadって、全体では何をするスクリプトなのでしょうか?
上手くすれば、パイプを大幅に減らせるかもしれませんよ。

> とかパイプでつないでやってると冗長になるし途中でチェックもしにくいです。
腐った環境だと、パイプがつまることもありまっせw


897 :login:Penguin:2010/06/17(木) 21:08:17 ID:ZxfbaNrJ
#!/bin/sh

perl /hogehoge.pl

っていうシェルスクリプト書いておけば無問題。

という冗談はともかく、メールの処理となると結構複雑なことを考えないといかんだろうから、
それなりな言語を使ったほうが実現しやすいと思う。
複雑怪奇なシェルスクリプトなんて管理が大変だよ。

898 :890:2010/06/17(木) 22:43:10 ID:4hwJRH3Z
>>896,897
アドバイスありがとうございます。
catは確かにいらないかもしれません。

やろうとしてるのは、サーバからの週次報告のメール処理です。
メールの情報を元に、沢山あるNFSをいくつかマウントして、中のファイルを操作します。

メールの内容には、/var/log/messages見たいなログが含まれるので、
処理対象の行を抽出して、
そこから処理対象のNFSや処理対象ファイル名のリストを作成して、
リストを元に、NFSをマウントして中のファイルを消したり書いたり読んだり。
というような具合です。

メールの本文の処理を考えてたらやたらコマンドを繋いでしまいましたが、
sedやawkを使えば事足りるような気がしないでもありません。

899 :login:Penguin:2010/06/18(金) 16:35:01 ID:WMOdxw/7
ファイルサイズが0BYTEを検出するにはどうしたらよいでしょうか?


900 :login:Penguin:2010/06/18(金) 16:36:45 ID:OMFuxW3x
>>899
find -size 0c

901 :login:Penguin:2010/06/18(金) 16:47:39 ID:WMOdxw/7
if test ! -s filename
then

else

fi

でよろしいでしょうか?


902 :login:Penguin:2010/06/18(金) 16:51:25 ID:WMOdxw/7
>>900
レスありがとうございます
調べてみます

903 :login:Penguin:2010/06/18(金) 16:56:33 ID:OMFuxW3x
いや、 >>901 でいいよ。

904 :login:Penguin:2010/06/18(金) 18:46:57 ID:DZMkUCIH
これ見てよ↓
http://livedoor.blogimg.jp/tekepo/imgs/3/4/3414dfca.jpg
ばらまこうぜ!


905 :login:Penguin:2010/06/19(土) 17:54:48 ID:LxGHTRzC
>>898
目的の処理を行うシェルスクリプトを生成するような、入力ファイルを解析するだけの
シェルスクリプトを組むという手もあります。解析と実行を分離できるので、見通しも
良くなるし、デバッグも比較的楽になります。

この生成したスクリプトをファイルに書き出しておけば、後々問題が起きたときの
切り分けに役立つと思いますが、どうしても一時ファイルを作りたくないなら、
$ sh parse.sh target-file | sh
のように、解析結果をシェルにパイプでつなげるということで。


906 :905:2010/06/19(土) 17:58:05 ID:LxGHTRzC
自レスへの補足。

>>905の生成というのは、標準出力に出力するという意味です。


907 :login:Penguin:2010/06/20(日) 16:05:06 ID:M2Bl5krX
whileにパイプで入力すると変数のスコープが変なのなんで。

908 :login:Penguin:2010/06/20(日) 18:13:37 ID:rZnrFprq
ggrks

909 :login:Penguin:2010/06/20(日) 18:17:47 ID:rbX+UGpL
bash の話?
何を言いたいのかさぱーり分からんけど、あえてエスパー気分で答えてみると、
パイプライン内のコマンドはサブシェル内で実行されるから、while ループ外から変数は見えない。
ってことかな?

910 :login:Penguin:2010/06/20(日) 22:23:54 ID:Bk3Amr/o
>>907
C言語でもforで指定してる変数を参照するのはお行儀の悪いことにされてるだろ。

911 :login:Penguin:2010/06/21(月) 00:05:10 ID:/5boYx0b
>>907
どうしても while read をカレントシェル内でしたいなら、以下のようにする。

#! /bin/sh
head=
tail=
while read line
do
echo "${line}"
test -n "${head}" || head="${line}"
test -n "${line}" && tail="${line}"
done <<EOF
$(ls)
EOF
echo -----
echo head: "${head}"
echo tail: "${tail}"
echo line: "${line}"

まあ、最後に改行が入ってしまったりと、色々癖があるけど。


912 :login:Penguin:2010/06/21(月) 10:26:52 ID:ze/oDFiM
ls | { while read line; do
echo "${line}"
test -n "${head}" || head="${line}"
test -n "${line}" && tail="${line}"
done
echo -----
echo head: "${head}"
echo tail: "${tail}"
echo line: "${line}"
}


913 :login:Penguin:2010/06/23(水) 23:25:40 ID:GJl6eUSR
コマンド1の標準出力の行数をカウントして、
0じゃなければコマンド1の標準出力をコマンド2の標準入力で処理したいです。

出力行数はwcコマンドでわかりますが、
出力をコマンド2に渡す前に行数をチェックする書き方がわかりません。

コマンド1を2回実行すれば出来るのですが他にうまい書き方あるでしょうか。
sub1(){ cat hoge.txt }
sub2(){ ......... }

CNT=`sub1 | wc -l`
if[ $CNT != 0 ]; then
sub1 | sub2
fi


914 :login:Penguin:2010/06/24(木) 00:30:23 ID:7UozAblY
if [ -n "`sub1`" ]; then
sub2
fi


915 :login:Penguin:2010/06/24(木) 00:32:24 ID:7UozAblY
あー、ごめん。よく読んでなかった。

s="`sub1`"
if [ -n "$s" ]; then
echo "$s" | sub2
fi


916 :login:Penguin:2010/06/24(木) 00:35:03 ID:3fD01YtH
>>915
ありがとうございます。
これって例えば出力が数万行とかでも大丈夫でしょうか。

917 :login:Penguin:2010/06/24(木) 11:28:04 ID:HX9t/VP5
test

918 :login:Penguin:2010/06/24(木) 11:31:48 ID:HX9t/VP5
シェルスクリプトの代わりにpythonだけじゃ困ることってありますか。
沢山覚えるの無理なので、、、
どちらもよくわかっていないので何かアドバイスちょーだい。

919 :login:Penguin:2010/06/24(木) 11:37:00 ID:2gtm2ZoD
>>918
python が入ってない環境で困る。

920 :login:Penguin:2010/06/24(木) 11:51:47 ID:HX9t/VP5
ということは趣味で自分のマシンいじる分には
一切の問題がないということでいいの。



921 :login:Penguin:2010/06/24(木) 12:13:27 ID:2gtm2ZoD
趣味なら困ってから考えてもいいんじゃない。

922 :login:Penguin:2010/06/24(木) 12:14:24 ID:2gtm2ZoD
あー、他人が書いたものを読むときに困る。
起動スクリプトとか。

923 :login:Penguin:2010/06/24(木) 12:32:56 ID:G5Sna7Qs
>>918
日常的に使うUNIXコマンドの処理手順をスクリプト化したものが
シェルスクリプトと考えれば、新しく覚えることはほとんどないのでは。


924 :login:Penguin:2010/06/24(木) 12:41:48 ID:HX9t/VP5
どっちも必要だけど大した苦労もない。
そんなところですね。
ちなみに皆さんの使用比率はどんな感じでしょうか?
bush:python(スクリプト言語)

925 :login:Penguin:2010/06/24(木) 14:23:23 ID:4w5Ul5KK
>>ID:HX9t/VP5
「何をしたいのか」を一切言わずに言語や環境だけ語られても、
単なる釣り、もしくはPython知識の自慢にしか見えないが…

926 :login:Penguin:2010/06/24(木) 14:27:44 ID:2gtm2ZoD
>>924
アンケートはこっちで。

国勢調査
http://pc11.2ch.net/test/read.cgi/linux/1051536151/

927 :login:Penguin:2010/06/24(木) 18:22:43 ID:HX9t/VP5
やりたいことは、Linuxを道具として使いたい。
使っている道具をきちんとメンテして把握したい。
そんな所です。
Pythonの知識はまったくですが
他の興味が出てきたときに使いまわしが効くんじゃないかなぁ
って思えるから。
どちらか一つでいいならPython一本でいきたいと思う次第です。

928 :login:Penguin:2010/06/24(木) 18:46:54 ID:gOuR0+dQ
そうですか
好きにしてください

929 :login:Penguin:2010/06/24(木) 23:47:28 ID:D2olkjBh
>>913
>>916
コマンド1の出力を一旦ファイルに書き出すのが確実かと。

どうしても一時ファイルを作りたくないとか、シェルスクリプトじゃなきゃやだというなら、
builtin の read の癖を容認できれば、以下のように出来なくもないですけど。

command-1 |
(
if IFS= read -r line;
then
( echo "${line}" && exec cat ) | command-2;
fi;
)


930 :login:Penguin:2010/06/25(金) 05:52:16 ID:Fxd1K2yT
>>927
その発想、話にならんね。
ソフトウェアツールというものが、全く分かってない。
まずは、初心者向けの書籍を数冊読んでからだな。

931 :login:Penguin:2010/06/27(日) 12:04:55 ID:6P+QcdNk
シェルスクリプト関数の中で、perlの-eにヒアドキュメントでperlスクリプトを
渡して、そのスクリプトに引数を渡したいのですが失敗しています

say-hello-world-with-perl ()
{
 echo -n Hello
 perl -E <<END
  say ARGV[0]
END World!
}

まずENDの右に空白があるのでシェルに「parse error near `\n'」と言われsay ARGV[0]をsay "World!"にしたのですが
こんどはヒアドキュメントのスクリプトが認識されていないらしく「No code specified for -E.」と言われてしまいました

932 :login:Penguin:2010/06/27(日) 12:45:45 ID:Hm9ANnqg
#!/bin/sh
PATH=/bin:/usr/bin
sayhello()
{
echo -n Hello
perl -- - World <<'END'
print "$ARGV[0]\n";
END
}
sayhello


933 :931:2010/06/27(日) 13:09:23 ID:6P+QcdNk
できました。 ありがとうございます。

934 :login:Penguin:2010/06/27(日) 20:34:19 ID:JY3Ff7U9
>>918
シェルスクリプト:目の前の問題を解決するのに手軽に使える。

軽量言語:シェルスクリプトだと面倒なちょっとした機能を実現するときに楽。

C言語:バイナリの加工とか速度にシビアな処理を行うときに使う。
     コマンド化しておけばシェルスクリプトで使える。


>>930
重要なのはツールボックスアプローチではなくて、問題を実時間で如何に解決するかだ。

935 :login:Penguin:2010/06/27(日) 21:41:20 ID:qQc9Yd8G
>>934
今頃出てきて何を気取ってんだよw

936 :login:Penguin:2010/06/27(日) 21:49:38 ID:+b2tR0Mj
>>934
そうなんですよね。
>>930
今日暇だったので県図書行ってきたんだよ
そしたらオライリーのbash詳説本があったので軽く目をとうしたんだ
そしたら前書きに著者が「20年位シェルスクリプトは書いてないけど
昔に比べてずいぶんよくなったよねー」ってオイ!
でもパイプつなげて正規表現使って、はい出来上がりみたいな感じが
魅力的に見えたので、やっぱpythonだけってより両方必要だって思いました。

937 :login:Penguin:2010/06/27(日) 21:51:24 ID:+b2tR0Mj
>>935
何か辛いことでもあったのかい。話聞くぞ

938 :login:Penguin:2010/06/27(日) 22:21:02 ID:Ze2Uvzug
>>937
たった一日でずいぶん上目線になったな、おい。
>>936みたいな基本的なことがやっと分かっただけでw

939 :login:Penguin:2010/06/28(月) 08:55:43 ID:oXRFVVe0
>>938
一日で…というか、ID:+b2tR0Mj=ID:HX9t/VP5
最初からだよ。権威主義だし。
自分の意見に賛同を求めてるだけで、他人のアドバイスは全然聴いちゃいない。
それでいて、>>917のような初心者丸出しの一面もある。
大体どんな奴か、年代・経歴までほぼ想像できてしまうw

940 :login:Penguin:2010/06/28(月) 19:31:31 ID:E1biP5W5
>>939
今度は権威者からプロファイラーですか。

941 :login:Penguin:2010/06/28(月) 21:23:08 ID:gpGmPn55
Pythonが出来るなら、シェルスクリプト書くのに困ることはないと思うが。

942 :login:Penguin:2010/06/29(火) 00:28:57 ID:XpWHP1G0
shスクリプトやMS-DOSのBATファイルは、pythonやperl、visual basic等のわりとモダンな言語と違うので、使えない人は意外と沢山いるよ。


943 :login:Penguin:2010/06/29(火) 01:48:40 ID:w6fmOmKZ
>>942
本物発見

944 :login:Penguin:2010/06/29(火) 02:22:26 ID:oNoWcWSv
shスクリプトで面倒なことするくらいなら
Pythonで書いた方が楽ってことだろ

945 :login:Penguin:2010/06/29(火) 21:35:01 ID:qEPz4JM7
久々にバッチファイル書いたら、さっぱり分からなくて3時間かかった。
データの場所移動して、ショートカット作って、いらんプロセス止めて、後掃除lするだけなのに・・・

946 :login:Penguin:2010/07/01(木) 21:49:10 ID:JSO5PiJ7
「サーバ管理も結構やってきたしシェルスクリプトくらい勉強しなきゃなぁ」
→誰でも読めるスクリプトを書くが一定以上の要求には答えられない

「コーディングしたいのに鯖管やらされるなんて…。こんなん自動化出来るだろ。シェルスクリプト?なんだよこの実装使いにくい。」
→要求は満たすが本人以外メンテできないスクリプト

「UNIX?わかりますよ。仕事でLinuxバリバリ使ってますから。shなんてコマンドありましたっけ?」
→単なるコマンドの羅列ができあがる


947 :login:Penguin:2010/07/02(金) 07:32:00 ID:fJA7doua
>>946
どんな要求であっても、俺の場合は常に二つ目が出来上がってしまう。

948 :login:Penguin:2010/07/03(土) 09:47:18 ID:0h8/2wUz
そもそもシェルスクリプトって、そんな意気込んで学習するものか?
man sh とか見ながらワンライナーで使ってれば、普通に書けるようになるんじゃ…
ログインシェルが /usr/bin/python でもあるまいに。


949 :login:Penguin:2010/07/03(土) 10:59:40 ID:54S95L+v
>>946の3項目の人か。

950 :login:Penguin:2010/07/03(土) 12:08:08 ID:90cqvTv8
仕事でバリバリ使ってる→誰かが開発した業務アプリをただ使ってるだけ

951 :login:Penguin:2010/07/03(土) 13:12:59 ID:0h8/2wUz
シェルスクリプトって結局の所、コマンドの羅列に毛の生えたようなものだと思うのだが。
まさか、ttp://shoop.sourceforge.net/ みたいなのを要求したり開発したりしてるのか?w


952 :login:Penguin:2010/07/03(土) 13:35:11 ID:0rv028EW
>>951
>シェルスクリプトって結局の所、コマンドの羅列に毛の生えたようなものだと思うのだが。

それは大きな誤解。DOSのBATファイルならそう言ってもいいかもしれないが。

953 :login:Penguin:2010/07/03(土) 13:37:45 ID:6oE1mLBU
>>951
     /: : : : : __: :/: : ::/: : ://: : :/l::|: : :i: :l: : :ヽ: : :丶: : 丶ヾ    ___
     /;,, : : : //::/: : 7l,;:≠-::/: : / .l::|: : :l: :|;,,;!: : :!l: : :i: : : :|: : ::、  /     ヽ
    /ヽヽ: ://: :!:,X~::|: /;,,;,/: :/  リ!: ::/ノ  l`ヽl !: : |: : : :l: :l: リ / そ そ お \
   /: : ヽヾ/: : l/::l |/|||llllヾ,、  / |: :/ , -==、 l\:::|: : : :|i: | /   う う  前  |
.   /: : : //ヾ ; :|!: イ、||ll|||||::||    ノノ  イ|||||||ヾ、 |: ::|!: : イ: ::|/   な 思 が
   /: : ://: : :ヽソ::ヽl |{ i||ll"ン    ´   i| l|||l"l `|: /|: : /'!/l     ん う
 ∠: : : ~: : : : : : : :丶ゝ-―-      ,  ー=z_ソ   |/ ハメ;, :: ::|.   だ ん
   i|::ハ: : : : : : : : : : : 、ヘヘヘヘ     、  ヘヘヘヘヘ /: : : : : \,|.   ろ な
   |!l |: : : : : : : : :、: ::\    、-―-,      / : : :丶;,,;,:ミヽ   う  ら
     丶: :ハ、lヽ: :ヽ: : ::\__  `~ "      /: : ト; lヽ)   ゝ
       レ `| `、l`、>=ニ´        ,  _´ : :} `   /
         ,,、r"^~´"''''"t-`r、 _  -、 ´ヽノ \ノ   /    お ・
       ,;'~  _r-- 、__     ~f、_>'、_         |  で  前 ・
      f~  ,;"     ~"t___    ミ、 ^'t         |  は  ん ・
      ,"  ,~         ヾ~'-、__ ミ_ξ丶     |  な  中 ・
     ;'  ,イ ..          ヽ_   ヾ、0ヽ丶    l         /
     ( ;":: |: :: ..          .`,   ヾ 丶 !    \____/
     ;;;; :: 入:: :: ::      l`ー-、   )l   ヾ 丶
     "~、ソ:: :い:: :     \_  ノ ,    ヾ 丶

954 :login:Penguin:2010/07/03(土) 14:13:22 ID:sM2tkweG
>>951
単なるコマンドの羅列ならシェルをインタプリタとして実行だけできるようになってればいい。
本来純粋なシェルに求められる機能以上のものが備わってるんだから、
そういう使い方が求められて作られてるんじゃないの。


955 :login:Penguin:2010/07/03(土) 16:29:27 ID:sj4QRtxF
コマンドの羅列以外のことをするのなら
他の言語使う方がいい気がするけど・・・

956 :login:Penguin:2010/07/03(土) 16:38:10 ID:MTEpVr/W
>>951と同意見だけど、大きな誤解なのか。。

shファイルの平均行数は10行程度なんだからコマンドの羅列なんだよって言おうと思って計算したら、
110行もあったorz
$ echo $(sed '/^#/d' $(locate -r "\.sh$") | wc -l)/$(locate -r "\.sh$" | wc -l) | bc
110


957 :login:Penguin:2010/07/03(土) 16:41:09 ID:0rv028EW
>>955,956
/etc の中身見て来い。


958 :login:Penguin:2010/07/03(土) 16:45:30 ID:MTEpVr/W
>>957
あぁ、コマンドの羅列だけではなくて、環境変数の設定ね。
まぁそれもあるだろうけど。

959 :login:Penguin:2010/07/03(土) 16:48:58 ID:0rv028EW
ダメだこりゃ

960 :login:Penguin:2010/07/03(土) 17:42:04 ID:d1BG5aq/
質問があります。

1.クライエントからubuntuにログインして tcpdumpを実行。ダンプはubuntuのローカルファイルへ
2.クライエントでとあるプログラムを実行
3.クライエントのプログラム終了
4.ubuntuのtcpdumpを終了
5.tcpdumpの結果をscpなどで取得

という流れのスクリプトを書きたいです。

ssh server tcpdump...&
とやっても、sshからもどってこれずに、クライエントでプログラム実行の段階へ移行できません。
また、ssh server "tcpdump.. &"
とやると、もどってこれるのですが、tcpdumpが中断されてしまっているようです。

どのように書けばいいですか?
アドバイスいただけると助かります
よろしくお願いします。

961 :login:Penguin:2010/07/03(土) 18:26:29 ID:d1BG5aq/
Rubyを使って自己解決しました。ご迷惑おかけしました。

962 :login:Penguin:2010/07/03(土) 18:29:35 ID:0rv028EW
マルチは死ね

963 :955:2010/07/03(土) 18:47:59 ID:sj4QRtxF
>>957
「言語として使うなら」ってつもりだったけど、
>>955をどうみてもそういう解釈にならんですまんかった。

964 :login:Penguin:2010/07/03(土) 19:09:59 ID:0h8/2wUz
>>957
環境に依存するが、/etc 以下の多くはシェルスクリプト以外のものだと思うが…

コマンド以外にゃ、条件判定とループが少し、ブロック化のための単純な関数だけじゃないか。
配列変数やforeachでないforは所詮拡張機能だし、関数内局所変数のlocalですら、複雑になる
からってPOSIXからは除外とか。まあ、シグナルtrapぐらいはできるけど。

. で読み込んでるとは言え、コメント含めて数百行なんぞ、コマンドの羅列と変わらんだろ。


965 :login:Penguin:2010/07/03(土) 19:30:06 ID:HK6qS7lo
>>959
C言語って結局の所、"hello world!"に毛の生えたようなものだと思うのだが。
などと自己観念を主張している人に、観念外の事を説明しても徒労だよ。

966 :login:Penguin:2010/07/03(土) 19:32:02 ID:4cFVIir8
スレ伸びてると思って来たら何この流れ。
おまいら>>946に釣られすぎだろw
シェルスクリプトなんぞに期待しすぎwww


967 :login:Penguin:2010/07/05(月) 00:10:16 ID:3qSSPPPT
所詮はめんどくさがり屋の一括処理ツール

968 :login:Penguin:2010/07/05(月) 08:07:20 ID:lLHCPwQQ
コンピータとはそういうもんです。

969 :login:Penguin:2010/07/08(木) 22:55:24 ID:1P1SPq5R
>>967
銭湯で風呂に入らんみたいな話?

970 :login:Penguin:2010/07/14(水) 11:41:20 ID:jIIpa+N8
お知恵を拝借
mpgの一括処理をしたいのですが 以下の構文の場合、
半角スペースがあるファイル名の場合には、$mpgのなかに
半角スペースまでのファイル名しか取得できません。

#!/bin/sh
for mpg in `ls *.mpg`

"aaaa bbbb.mpg"の時は $mpg=aaaa となります。


すべてのファイル名を取得するには どうすれば良いでしょうか?

971 :login:Penguin:2010/07/14(水) 11:57:44 ID:EjVdQbFU
>>970
for mpg in *.mpg

972 :login:Penguin:2010/07/14(水) 12:01:13 ID:dE3Wk0L7
`ls` ってなんでそんなの必要なのさ。

for mpg in *.mpg; do
echo "$mpg"
done


973 :login:Penguin:2010/07/15(木) 00:36:34 ID:8tWNWx9y
>>971 >>972
ありがとうございました。
lsで出力するとファイル名がソートされるので見やすいと考えて使いました。

974 :login:Penguin:2010/07/15(木) 10:40:41 ID:NWP2DFyw
ls なしでもソートされるわけだが。


975 :login:Penguin:2010/07/15(木) 11:11:36 ID:00XAddj1
>>974
ls --sort=time とかってやりたいんじゃない?

>>970
ということで、耳タコなこの台詞。
変数に空白を含む可能性を考慮して、クォートしましょう。

976 :login:Penguin:2010/07/15(木) 11:16:13 ID:sVooEpVt
>>975
ls 使いつつクォートしろ、ってこと?

977 :login:Penguin:2010/07/15(木) 11:20:52 ID:sVooEpVt
あぁ、
for mpg in "`ls --sort=time *.mpg`"
とかできるのか。

978 :login:Penguin:2010/07/17(土) 05:36:57 ID:C3Pg+u+/
>>972
誰も国籍の話なんかしてねえよ
形容詞的に朝鮮人って言ってんだ

979 :login:Penguin:2010/07/17(土) 13:24:13 ID:pvTzq4BL
>>978こそ、日本語がおかしい時点で、アウト!

980 :login:Penguin:2010/07/17(土) 16:08:46 ID:LcEXtxtf
972は誤爆だろ

981 :login:Penguin:2010/07/17(土) 16:10:11 ID:LcEXtxtf
違った、誤爆は978だ、スマソ

256 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)