シェルスクリプト総合@LINUX Part5at LINUX
シェルスクリプト総合@LINUX Part5 - 暇つぶし2ch21:login:Penguin
09/04/12 15:48:04 Fl5RzaXW
echo "scale=1; 1.1 < 1.2" | bc

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

23:login:Penguin
09/04/13 17:38:44 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
09/04/13 17:40:46 1oC+4w67
すいません書き込みに無駄な空行がたくさん入ってしまいました

25:login:Penguin
09/04/13 18:05:27 aG/DWGVb
rename コマンドじゃダメ?

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

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

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

28:login:Penguin
09/04/13 23:49:04 HMXUAP3X
IFS=""とかじゃダメなんかな

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

30:login:Penguin
09/04/18 01:13:29 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
09/04/18 01:36:18 6AHWtliB
自己解決しました
emacsテンプレートの馬鹿w

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

32:login:Penguin
09/04/18 05:46:37 echGlS2v
>>30
forにこだわらないなら

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

こんなんのもアリかも。

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

for i in `seq 1 100`

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

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

36:login:Penguin
09/04/20 18:07:25 nHdRbS/v
もまいら、なかなかうまいな

37:login:Penguin
09/04/24 12:57:30 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
09/04/25 18:13:43 xpy/PYPF BE:1185862267-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
09/04/25 19:52:53 kvdAirHU
>>38
見習い中の者だけど、直接、mvするのは書けた

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

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

40:login:Penguin
09/04/25 19:58:44 0GMAGDVv
>>38 自己レスです。
まいにちフランス語_4月13日放送分.mp3 → FR20090413.mp3
のうち、URLリンク(tinyurl.com) を参考に、
まいにちフランス語_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
09/04/25 20:39:12 KQhyDGwp
sed -e 's/^[^0-9]*/FR2009 /' -e 's/月/ /' -e 's/日放送分/ /' | awk '{printf"%s%02d%02d%s",$1,$2,$3,$4}'

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

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

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

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

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

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

45:login:Penguin
09/04/25 23:29:31 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
09/04/26 16:11:48 NYZwuLsV
$ ls "*"
ls: cannot access *: そのようなファイルやディレクトリはありません

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


47:login:Penguin
09/04/26 16:46:19 /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
09/04/26 17:51:05 NYZwuLsV
ダブルクォートだと展開されるような気がしてたけど
勘違いか、そっか。

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

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


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


49:login:Penguin
09/04/26 18:15:04 6AxKKceD
>>46
URLリンク(www.linux.or.jp)
> パターンマッチング
> 特殊パターン文字をその文字そのものにマッチさせるためには、クォートしなければなりません。


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

51:login:Penguin
09/04/26 18:33:49 /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
09/04/26 19:20:08 4i92v2TV
echoと一口に言っても
coreutilsのechoやbashのビルトインecho
dashやzshのビルトインechoは挙動が違う

53:login:Penguin
09/04/26 19:46:21 /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
09/04/26 20:05:49 z35DirHv
(意図通りに)動けば正義

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


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


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

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

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

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

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

62:login:Penguin
09/05/04 01:16:30 Z02vxYwi
∩゜∀゜∩

63:login:Penguin
09/05/08 16:39:20 /GOSAdyI
foo |
bar



foo | \
bar

って違いあるの?

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

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

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

67:login:Penguin
09/05/10 23:02:29 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
09/05/10 23:09:18 6t5VOjiz
>>67
目線が高い

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

70:login:Penguin
09/05/11 17:10:02 fWM1Begt
>>69
DEV=${DEV#*usb*/*/}
*usb*

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

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

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

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

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

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

75:login:Penguin
09/05/14 19:14:39 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
09/05/21 14:21:38 8Ph6oUED
時刻を利用したものを書きたいんですがどうもよくわかりません。
dateとgrepを利用するのはなんとなくわかるんですがさっぱりです。

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

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

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

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


78:login:Penguin
09/05/21 17:14:26 8WrmPGB1
そうかそうか

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

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

81:login:Penguin
09/05/21 18:06:18 YOkJVZm9
>>76=77=80
氏ね

82:login:Penguin
09/05/21 18:19:28 Ed3fgcAs
>>81
おれも思った

83:login:Penguin
09/05/21 18:33:46 X//3znla
>>76です。

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

84:login:Penguin
09/05/21 18:41:39 W9MVWV0e
イエーイ、教授見てる~?

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

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



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

88:86
09/05/28 23:50:32 MG6SQpHS
>>87 Thx!

89:login:Penguin
09/05/29 00:01:04 rPFmiLnc
一方ロシアは--parentsを使った

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

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

92:login:Penguin
09/06/15 15:03:52 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
09/06/15 15:51:41 FRq6RhHc
>>92
bashが待つのはBじゃなくてxargsの終了だからその辺でなんかあるのかもしれんが、
とりあえずその状態のときの各プロセスの親プロセス番号を確認したいところだな。

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

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

#!/bin/bash

ls * | while read result
do
echo $result
done

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

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


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

97:login:Penguin
09/06/16 01:01:11 nzUvvcuW
>>95
URLリンク(www.faqs.org)

98:login:Penguin
09/06/18 15:45:23 dQ4OojSv

#!/bin/sh

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

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


99:login:Penguin
09/06/18 15:53:07 s3sHtQVu
>>98
あれば realpath

100:login:Penguin
09/06/18 15:59:02 dQ4OojSv
>>99 ないっす。

101:login:Penguin
09/06/18 16:21:59 0zcffroC
>>98
readlink -f


102:login:Penguin
09/06/18 16:44:51 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
09/06/18 17:05:37 aPpB1FUW
kshだとrealpathはビルトインなのね

104:login:Penguin
09/06/18 17:09:36 aPpB1FUW
無かったスマソ

105:login:Penguin
09/06/18 17:23:14 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
09/06/18 17:49:22 S07Tjv1V
いや、ファイル名に空白あったらアウト

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

107:login:Penguin
09/06/18 18:59:36 dQ4OojSv
なるほど。

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

108:login:Penguin
09/06/18 19:18:06 dQ4OojSv
おっと、ひとつ質問良いですか?

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

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

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

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

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

感謝


112:login:Penguin
09/06/23 22:19:47 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="URLリンク(search.linux.or.jp)"
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
09/06/23 22:21:09 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
09/06/23 23:37:11 iNYrdW4A
120点

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

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

117:112
09/06/24 01:41:57 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="URLリンク(search.linux.or.jp)"
URL=
if [[ ( ! -e "$COMMAND" ) || ( ! -x "$COMMAND" ) ]]; then
echo "not installed w3m"
exit 1
fi

118:112
09/06/24 01:45:08 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
09/06/24 02:04:47 aKYWDWvt
そのままでも全然いいと思うよ(^_^)

120:login:Penguin
09/06/24 08:42:54 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
09/06/24 09:19:46 aKYWDWvt
>>120
> COMMAND=$(command -v w3m)
w3mがaliasされてたらwhichと結果がかわるよ

122:login:Penguin
09/06/24 09:37:52 BWmtmrUC
bashってtypeないの?

123:112
09/06/24 13:57:32 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
09/06/24 14:40:30 BWmtmrUC
>>123
そんな面倒なことはせんでもええ

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

125:112
09/06/24 17:05:52 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
09/06/24 19:01:09 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
09/06/24 19:29:28 w4EkT5LC
>>126
俺は関数化して環境登録することが多いです。
function w3m() {
  ls -l
}
export -f w3m

128:login:Penguin
09/06/26 01:44:08 +M5S3VDp
質問です。前処理をして、
URLリンク(www.youtube.com)
のような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
09/06/26 02:55:31 5uTursO/
for

130:login:Penguin
09/06/26 03:43:24 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
09/06/26 06:18:01 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
09/06/26 06:31:57 3RE4KePV
id変わってる…(^_^;;)

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


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

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

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


135:128
09/07/01 04:20:50 3OeIBl6N
echo "What terms?"; read terms; terms="${terms// /+}"
T="$HOME"
mkdir -p $T/${terms}
for n in $(seq 0 10); do w3m -dump_source \
"URLリンク(images.google.com)" \
| 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
09/07/06 22:31:23 tHSUGfrq
( sleep 1h; echo "hello" ) > file

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

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

138:login:Penguin
09/07/08 01:51:04 SE49fktK
sleep 3600 > file でよくないか?


139:login:Penguin
09/07/08 02:18:59 VRCFK11t
お前は何を言っているんだ

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

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

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

142:login:Penguin
09/07/12 10:37:35 1p3v2qzF
sed

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

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

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

% nanika XXX file

145:login:Penguin
09/07/12 12:20:21 2S8ITALR
ない

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

147:login:Penguin
09/07/12 18:16:12 elf51XSl
grep --creeping-deth

148:login:Penguin
09/07/12 19:44:16 o8qLTMAv
death
じゃないのか。

149:login:Penguin
09/07/12 20:31:41 elf51XSl
>>148
--orz


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

151:login:Penguin
09/07/14 15:44:41 CH7bWn6s
つまらん。

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


153:login:Penguin
09/07/20 15:40:26 K8L8w1qf
age

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


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

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

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

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

158:login:Penguin
09/07/20 23:01:27 iUvo3V7o
>>156
以下でできるかも

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

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

160:login:Penguin
09/07/21 23:11:34 xGYTho7h
pidof
とか使わんの?

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

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

162:login:Penguin
09/07/23 18:06:19 P+5ig7CA
くだ質池

163:login:Penguin
09/07/26 07:44:48 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
09/07/26 08:26:44 BwoYtVgZ
>>163
ifで$?を判定すればいいんじゃないかな

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

trapしたほうがよくね?

166:163
09/07/26 09:07:33 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
09/07/30 18:32:54 8kF2jsLv
シェルスクリプト初めて数日ですが、ファイルの書き換えやなんかは検索すると出てくるんですが
選択肢形式の作り方がいまいちわかりません。
lokkitやsystem-config-networkみたいな選択形式を作りたいのですが
何かヒントをいただけないでしょうか?

168:login:Penguin
09/07/30 18:37:48 3Jkdy3aR
>>167
whiptail とか?

169:login:Penguin
09/07/30 19:33:48 1ZQVAEXh
dialog

170:login:Penguin
09/07/30 19:43:13 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
09/07/30 20:01:21 3Jkdy3aR
>>170
何が言いたいんだ?

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

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

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

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

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


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

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

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

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

180:login:Penguin
09/07/30 23:35:05 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
09/07/31 00:19:11 eB5hWQQH
$(ls)

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

182:login:Penguin
09/07/31 01:07:21 dqFrtp13
よくない

183:login:Penguin
09/07/31 08:21:07 Q0h6j6GB
同じじゃないのか?

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

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

185:login:Penguin
09/07/31 10:47:53 dFOhVUdW
>>182
どう違うの?

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



187:login:Penguin
09/07/31 11:08:16 dFOhVUdW
>>186
trap

188:186
09/07/31 11:16:14 JVm6T/2T
>>187
ありがと。

出来ました。

189:login:Penguin
09/07/31 16:40:28 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
09/07/31 16:49:00 Q0h6j6GB
sed -n '/DEVICE/p;/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-eth0

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

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

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

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

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

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

195:189
09/07/31 17:37:11 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
09/07/31 17:45:29 sKGfGulX
>>195
全力で釣られてやる。

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

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

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

198:login:Penguin
09/07/31 21:59:52 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
09/07/31 22:03:23 Y1b6fdMF
sed -i "s/$a/$b/g" /tmp/test.txt

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

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

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

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

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

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

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

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

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

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

ありがとうございます。

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

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

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

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

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

213:login:Penguin
09/08/04 12:53:29 h5jokg18
COLUMNS見て計算する。

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

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

215:212
09/08/04 22:25:14 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
09/08/04 22:32:07 ACq2bWOB
> 色々と変えてみましたがダメでした。

そりゃダメだろうな。


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

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

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

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

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

220:212
09/08/05 10:47:05 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
09/08/05 13:12:18 gztfuFMV
のりピーが心配で仕事が手に着かない。

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

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

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

223:login:Penguin
09/08/05 14:02:44 gztfuFMV
そのぐらいならsudoでどぞ。

224:login:Penguin
09/08/05 21:35:22 dz5dEKuL
>>222
ifcfg-eth0とかに「USERCTL=yes」でroot以外でもできそう
URLリンク(www.redhat.com)

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

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

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

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

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

230: ◆Zsh/ladOX.
09/08/09 14:01:11 /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
09/08/09 14:18:48 PRPNML+y
>>230
CentOS の場合、/sbin/shutdown じゃなくて、/usr/bin/shutdown はないんですか。
だとしたら、Vine だけなのかな。たしか、「一般ユーザに電源をぶち切られるより、
shutdown を許した方がマシだ」という考えだったと思います。

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

なんで無いね。


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


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

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

237:234
09/08/09 23:20:52 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
09/08/10 00:04:28 CdStD5IJ
>>227
sidを知らんのか。

239:login:Penguin
09/08/10 01:28:19 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
09/08/10 01:50:52 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
09/08/10 02:00:08 qfqY90wM
>>240
ありがとうございます! 処理が覿面に早くなりました!
いちいち書き出さないで最後に一括して書けばよかったんですね…

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

243:login:Penguin
09/08/10 12:26:13 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
09/08/10 15:31:57 oeYkUDqx
数字の判定は[0-9]と正規表現使って判定してるんですが
IPアドレスかどうかの判定が出来るような正規表現ってあるんでしょうか。
無い脳みそひねってもいい案が出なかったのであれば教えてください。

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

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

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

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

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

250:login:Penguin
09/08/11 00:27:50 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
09/08/11 00:35:21 XDXqx0+D
./test.sh a 2 3 4 5 6 7 8 9 10 11 12
としてごらんなさい

252:login:Penguin
09/08/11 01:01:07 4esITO9l
>>251

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

はっ!そうか!…

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

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

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

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

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


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

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

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

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

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


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

259:login:Penguin
09/08/11 16:36:53 zgCywBrU
>>258
man top

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

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

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

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

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

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

263:login:Penguin
09/08/11 17:55:36 zgCywBrU
>>262
スレ違い。

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

265:login:Penguin
09/08/11 18:07:41 zgCywBrU
>>264
くだらねえ質問はここに書き込め! Part176
スレリンク(linux板)

266:login:Penguin
09/08/12 00:03:08 0UM4nevW
>>263
きびしー

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

268:login:Penguin
09/08/12 00:10:31 u9/Em9/R
>>267
ぜんぜん違う話。

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

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


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

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


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

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


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

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



275:login:Penguin
09/08/12 18:54:50 8iPFdi1w
金玉 → >>274






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

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

277:login:Penguin
09/08/12 23:35:06 tCsvaW+m
>>239

これはどう?

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


278:login:Penguin
09/08/12 23:40:23 tCsvaW+m
>>277 じこれす

まちがった

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

です。

279:login:Penguin
09/08/12 23:56:35 0UM4nevW
すげー

280:login:Penguin
09/08/14 09:45:57 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
09/08/14 09:56:51 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
09/08/14 10:03:19 GRUhI9LP
こういうこと?
seq -f 'MMF%04.f' 0 1000

283:login:Penguin
09/08/14 15:19:52 VHMVUNf7
>>280
すっきり書いてみた。

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

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


284:283
09/08/14 15:31:27 VHMVUNf7
printfがあれば更にすっきり。

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

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


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

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

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

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


289:login:Penguin
09/08/14 23:56:56 cgRLII5a
インタプリタだよ。

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

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

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

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

291:login:Penguin
09/08/15 19:58:45 4JYHgxvW
>>286 です
皆さんThxです。

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


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

294:login:Penguin
09/08/16 02:32:16 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
09/08/17 09:43:35 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
09/08/17 11:19:54 Pf83pCV6
>>295

コピペ間違ってないかな?
「serial8250: too much work for irq4」なら
次のページが引っかかった。
URLリンク(eve-japan.co.jp)

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

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

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

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

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

300:297
09/08/17 13:10:38 WnQqR0f7
補足です。

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

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


302:login:Penguin
09/08/17 17:20:05 R0skv6Jz
>>301
さすがにスレ違い。

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

304:login:Penguin
09/08/18 06:39:39 elYCry/8
>>301
echoするもんでしょ。JK。

305:login:Penguin
09/08/18 08:01:40 8XgVhYMF
そうか?
sysctl -w kernel/printk=foobar

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

307:login:Penguin
09/08/18 18:39:48 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
09/08/18 19:03:56 9vBuj+t/
sed 's/jama na moji//g' moge.dat

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

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

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

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

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

312:login:Penguin
09/08/18 19:43:42 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
09/08/18 22:00:14 elYCry/8
>>306
マルチって死ねばいいと思う

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

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


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

つーか logger で書いたら。

317:login:Penguin
09/08/19 15:03:44 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
09/08/19 15:07:02 zpPUbNQu
>>316
素早いレスありがとうございます。
1個の命令として見られていなかったわけですね。
loggerでかけるところはそうしたいのですが、他にもいくつかファイルがあって
そちらでも追記したいと思っておりました。
まだ試してませんがこれでいってみたいと思います。


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

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

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

322:login:Penguin
09/08/19 21:31:13 rKA7cUBO
echo "logtest" | sudo tee -a /var/log/messages

teeってマイナー?

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

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

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

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

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

328:login:Penguin
09/08/20 11:47:57 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
09/08/20 12:00:54 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
09/08/20 19:05:04 KNtykgpF
まずエスケープシーケンスを直接指定するのはよくない
端末によってサポートされている機能に違いもあるし

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

行単位ということなら

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

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



332:login:Penguin
09/08/21 00:26:48 korZcQ4D
>>331
tput使えよ。

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

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

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

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

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

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


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


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

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

>>335

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

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

341:login:Penguin
09/08/22 19:41:23 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
09/08/22 19:49:19 +xcsiCNS
まず服を脱ぎます

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

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


344:login:Penguin
09/08/22 21:14:08 +xcsiCNS
set $line
TARGET=$1 DEST=$2

345:login:Penguin
09/08/22 21:44:23 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
09/08/22 23:46:26 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
09/08/23 00:31:10 aCd7CupH
>>346 です
解決しました、文字コードを錯誤してました(^^;


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

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

350:login:Penguin
09/08/26 04:41:51 r5TfqoXR
nkf -f 1000

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

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

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



354:login:Penguin
09/08/26 14:29:09 z6vBIwzM
重複スマソ

355:login:Penguin
09/08/26 15:46:39 ehP4IQnp
>>352 >>353
thanx!!

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

これだとダメになってしまいます.とりあえずlist.txtにはURLリンク(google.net)を入れています.

357:login:Penguin
09/08/26 18:54:19 LXSFF2c5
s#URLリンク(##)
とか区切り文字を変える。
$OUT=
の$は不要。

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

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

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

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

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

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

363:login:Penguin
09/08/26 19:03:13 CSCAGJKR
やったね!

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

365:login:Penguin
09/08/26 22:34:36 aJjlwaDy
スレ違い。

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

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

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

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

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

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

370:login:Penguin
09/08/27 13:27:38 bqfxDAXQ
tail

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

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

372:369
09/08/27 15:59:46 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
09/08/27 16:07:37 GGkjBXca
よく見てみろ。7行目にcatがあるぞ

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

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

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

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

SJISだろSJIS。

377:login:Penguin
09/08/29 10:52:08 VmNW8gRO
URLリンク(www.youtube.com)
これは新しい

378:login:Penguin
09/08/29 10:56:18 l0gsahaz
while [ 1 == 1 ]

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

379:login:Penguin
09/08/29 10:59:15 Tfl9hfvi
while :

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

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

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

382:login:Penguin
09/09/10 23:35:17 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
09/09/10 23:41:36 kkfd/kxq
コマンドじゃねーや。間違い。

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

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

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

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


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