シェルスクリプト総合 ..
[2ch|▼Menu]
13:login:Penguin
09/04/04 17:54:04 0GvDrAb/
>>11
heirloom-sh か UNIX 板の方へいけばいいんじゃね?

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

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

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

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

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

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

17:login:Penguin
09/04/09 02:01:01 sLNPV+qV
チョンプ

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

if [ 1.1 -le 1.2 ];then

else

fi

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

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

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

21: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を見ると更新はされているので何らかのアクションがあるみたいなんで
すが何か指定方法間違ってますでしょうか?





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

5367日前に更新/221 KB
担当:undef