- 1 名前:名無しさん@お腹いっぱい。 [2008/02/11(月) 19:21:07 ]
- シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。 前スレ シェルスクリプト総合 その9 pc11.2ch.net/test/read.cgi/unix/1187130302/
- 233 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 09:39:22 ]
- 俺は仕様がわからんのだが…
二行目以外にも1カラム目が空白の行があるんじゃないのか? それなら、 awk 'NR > 1 { if ($2 !~ /^\|/) print $1; }'
- 234 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 09:42:21 ]
- >>231
>>sedでできることはすべてawkでもできるんだから それは違う。 また、仮に出来ることでも 分担させることで、何をやっているのか明確になるなら無問題。 決してバッドデザインなどでは無い。
- 235 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 09:49:07 ]
- >>234
それは awkプログラムになれていない者の考え。
- 236 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 09:51:13 ]
- >>232
できてるだろ。
- 237 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 09:54:56 ]
- というか、>>226 の sedの部分、間違ってるやん。
1カラム目を逆に削除してるww sedすらロクに書けない者が「分担」ですかw 何をやっているのか明確になってるはずなのに、こんな明らかな間違いですかww
- 238 名前:名無しさん@お腹いっぱい。 [2008/03/15(土) 10:05:16 ]
- >>234
sed でできて awk でできないことってたとえば何?
- 239 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 10:52:44 ]
- >>237
おれは別に当人じゃないけど、 問題文を君とは違う解釈をしているだけで、 間違いではないと思う。 >>238 さあ?例えば出力の判定が遥か前方に有る場合とか?
- 240 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 10:59:45 ]
- >>235
なれていないの定義が良く解らんが、 シェルのラッパを被っただけのawkスクリプトを書くわけじゃなくて、 シェルスクリプトを書くためにはawkプログラムを知悉する必要は無いと思う。 当人がsedで書いた方が後でメンテをし易いと思うなら、 そうすべきと思うことを阻害する理由は何もない。
- 241 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 12:45:14 ]
- 一行野郎でどっちも使ってるけどそれぞれに良さはあるよ。
置換処理は sed の方が簡単に書ける。 カラム指向の処理は awk が便利。 ただ、sed の出力を awk に食わせるのは無駄が多いと思う。 たいていはどちらかだけで書けるだろうから。 俺はややこしくなってきたら perl とか ruby に逃げちゃうし。w シェルスクリプトで重要なのはメンテする人が分かりやすい事だと 思っているからこの考えを無理強いするつもりは無いけどな。
- 242 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 13:33:44 ]
- >>225を良く読むと、>>233が正解仕様のような気がするのだが…
- 243 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 14:43:31 ]
- awk -F"|" 'NR>1{print $1}'
- 244 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 14:47:46 ]
- それじゃ二行目の空白が出力される。
>>225はデータに全角空白が含まれるから仕様が良くわからん。
- 245 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 23:11:58 ]
- 質問です。
二つのファイルがあります。 ファイルAには以下の内容。 ----------------------- aaa bbb ccc ddd eee fff ggg ----------------------- ファイルBには以下の内容がかいてあります。 ----------------------- bbb ccc ----------------------- ファイルAからファイルBの内容を除去したファイルCを作りたいのですが、 どのようにすればよいでしょうか? (ファイルAやファイルBの内容は、時々かわります。)
- 246 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 23:28:15 ]
- Bの各行が独立したパターンならgrep -f Bでよさそうだけど、
bbb ccc という塊で削除したいならそうもいかんよな。 diff -u A B | sed -n '1,/^@/d;/^-/s/^-//p' とか?
- 247 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 23:29:04 ]
- おっと
×grep -f B ○grep -vf B
- 248 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 23:31:32 ]
- >>245
ほれ、作ってやったよ。 #!/bin/sh cmd='cat fileA' while read str do cmd="$cmd | grep -v $str" done < fileB eval $cmd
- 249 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/15(土) 23:36:03 ]
- >>248
それだったら、grep -vf fileB fileA でいいじゃん。 >>247 がすでに答えてる。
- 250 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/16(日) 14:52:28 ]
- ファイルA,Bの並びが同じで、ファイルAにだけある行があるという場合は
commが使える。
- 251 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 00:36:36 ]
- >>250
commって辞書順に並んでないと使えないよ。 たぶん、このケースはプログラムで一行づつチェックするしかないと思うんだ。
- 252 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 05:09:00 ]
- fgrepにした方が安全。-eも付けて。
- 253 名前:名無しさん@お腹いっぱい。 [2008/03/18(火) 10:25:45 ]
- solarisのシェルスクリプトで教えてください。
スクリプト内で自分自身が置かれているディレクトリの絶対パスを取得したいのですが上手くいきません。 $0にパスが格納されていると聞いて以下のコードをtest.shとして実行したのですが./testという結果しか返ってきません。 #!/bin/bash /bin/echo $0 どうすれば絶対パスを取得できますか?
- 254 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 10:28:28 ]
- >>253
pwd
- 255 名前:名無しさん@お腹いっぱい。 [2008/03/18(火) 10:39:20 ]
- >>254
できましたー! 本当にありがとうございます。
- 256 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 10:48:09 ]
- ( cd `dirname $0` && pwd )
が妥当では?
- 257 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 10:50:59 ]
- $0 書き替えて呼ばれたら無効だけどな。
www.nurs.or.jp/~asada/FAQ/UNIX/section4.4.html
- 258 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 11:08:19 ]
- >>255
>>254 は嘘回答だお。本当にありがたいかw スクリプトが置かれているディレクトリじゃなくて、 スクリプトを実行したディレクトリが表示されるだけ。
- 259 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 11:09:29 ]
- 回答っていうか、ヒントでしょ。
そのまま使うわけがない。
- 260 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 11:18:52 ]
- ヒントとしても質が低いな
- 261 名前:255 [2008/03/18(火) 11:26:10 ]
- すいません。
cronで動かしたら違うディレクトリを持ってきました。 どうすれば良いでしょうか。
- 262 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 11:38:23 ]
- >>261
だから言っただろ
- 263 名前:255 [2008/03/18(火) 11:44:49 ]
- >>262
迂闊でした。
- 264 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 11:50:16 ]
- その後のレスぜんぜん読んでないのな。
- 265 名前:255 [2008/03/18(火) 11:58:38 ]
- cd `dirname $0` && pwd でできました!
本当にありがとうございました。
- 266 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 12:11:02 ]
- 次はスペース付きパスでハマるわけだな
- 267 名前:255 [2008/03/18(火) 13:01:56 ]
- かさねがさねすいません。
cd `dirname $0` && pwd ↑ この結果、どうやれば変数に格納できますか?
- 268 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 13:46:23 ]
- >>267
` ` のネスティングの問題だな。 hoge=`cd \`dirname $0\` && pwd`
- 269 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 13:49:00 ]
- 問題: >>268 を、スペースを含むPATHでも対応できるように書き直せ
- 270 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 13:59:14 ]
- hoge=$(cd "$(dirname $0)" && pwd) でお
- 271 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 14:06:30 ]
- >>270
不正解
- 272 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 14:13:19 ]
- >>271
なんで?
- 273 名前:255 [2008/03/18(火) 14:17:06 ]
- 今度こそ本当にできました!
皆さん本当に本当にありがとうございました。 >>269 わ、わかりません。 もっと勉強して出直します。
- 274 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 14:25:44 ]
- >>272
$0 自体がスペースを含んでたら駄目だろ。実験すれば一発。 あと、$( ) じゃなくてあくまで ` ` で書いて欲しいな。
- 275 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 14:35:18 ]
- >>274
> $0 自体がスペースを含んでたら駄目だろ。実験すれば一発。 気づかんかった。 > あと、$( ) じゃなくてあくまで ` ` で書いて欲しいな。 エスケープが多いと見にくくない?
- 276 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 16:27:40 ]
- $( )で問題なし
- 277 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 16:34:22 ]
- >>276
あるだろ。
- 278 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 16:35:58 ]
- ヒント:元質問者のOS
- 279 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 16:36:10 ]
- 最終的にカレントディレクトリもスペースを含むことを考えて、
hoge="`cd \"\\`dirname \\"$0\\"\\`\" && pwd`" かな? 手許に環境がないから、誰か実験してw
- 280 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 16:43:31 ]
- >>279
不正解
- 281 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 16:44:53 ]
- $(cmd)はPOSIX shellにはあるから問題ないだろ
- 282 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 16:46:24 ]
- >>277
どんな問題があるの?
- 283 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 16:57:56 ]
- NGワード推奨「P○SIX」
- 284 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 16:59:32 ]
- 回答してる奴に茶々入れる奴はうざいですねw
- 285 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 17:10:01 ]
- ろくな内容じゃないのにね。
- 286 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 17:36:34 ]
- >>280
そんなの見りゃわかる。 どうせ、書くならもっと有意義なことを書いてもらいたい。
- 287 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 17:37:38 ]
- 否定以外書いたらそこの浅さがバレルじゃない
- 288 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:00:26 ]
- >>286
見りゃわかるならお前が正解書けばいいじゃないか。 本当はわからなかったんだろ?
- 289 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:06:15 ]
- と威勢だけは大変よろしいのでした
- 290 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:16:52 ]
- hoge=$(cd "$(dirname "$0")" && pwd)
dirname $0にスペースが含まれていてもok。
- 291 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:23:46 ]
- >>290
じゃあ、それを ` ` を使って書いた場合は?
- 292 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:25:01 ]
- 290ですが、なんか妙なタイミングで書いちゃったみたいねw
私は290が今日はじめてなので念のため。 Solarisということなので``でも書いときます。たぶんこれでいいはず。 hoge=`cd "\`dirname "$0"\`" && pwd`
- 293 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:26:46 ]
- >>292
正解
- 294 名前:名無しさん@お腹いっぱい。 [2008/03/18(火) 18:32:07 ]
- Bシェル教えてください。
次のようなシェルがあり、関数func1のコードは変更せず、かつ画面に"aaa"と表示させたいんです。 <Bシェル> func1(){ exit 1 } func1 echo "aaa" perlのevalみたいな制御ができれば嬉しいんですが、 Bシェルでこれを実現させる法ありませんか? <perl> eval{ func1; }; if($?){ … }
- 295 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:36:37 ]
- func1をサブシェルで実行。(func1)
- 296 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:36:59 ]
- ・シェルスクリプトのことをシェルってゆーな
return 1
- 297 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 18:38:16 ]
- func1変更禁止かorz
- 298 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 19:34:19 ]
- func1(){
exit 1 } echo "aaa" func1 これで良いんじゃね?w
- 299 名前:294 mailto:sage [2008/03/18(火) 20:11:07 ]
- >>295
ありがとう。それでなんとかなりそう。 >>296 そうしたいのはやまやまなんですがね。 >>298 さすがにそれは無理。
- 300 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 20:17:01 ]
- 呼び方変えるくらいすぐできるでしょ。
- 301 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 20:35:30 ]
- >>295 で解決済。それ以外の回答はハズレ。
- 302 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 21:50:16 ]
- はいはい
- 303 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:07:59 ]
- シェルの入門書を見て↓のようなシェルを書きましたが動きません。
原因は何ですか? #!/bin/sh echo Hoge World
- 304 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:34:38 ]
- #!/bin/sh
echo Hoge World
- 305 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:36:29 ]
- >>303
滑ってるよ
- 306 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:40:00 ]
- >>304
ええ、ですからそう書いたのですが、動かないんです、、
- 307 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:43:37 ]
- それOS windowsだよ
- 308 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/18(火) 22:49:50 ]
- >>303
コンパイラは何使いましたか? バージョンによって使えない命令があります。
- 309 名前:名無しさん@お腹いっぱい。 [2008/03/19(水) 02:06:49 ]
- >>303
えすぱーくますた chmod +x hoge.sh ./hoge.sh じっこーけんげんじゃね?
- 310 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 03:43:04 ]
- 全然違うなw
- 311 名前:名無しさん@お腹いっぱい。 [2008/03/19(水) 07:20:45 ]
- >>309
動きました ありがとうございました!
- 312 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 07:44:57 ]
- >>311 はにせもの。
>>309 それはすでにやってます。まだ動きません。
- 313 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 08:14:54 ]
- 「シェル」を書いてるんだから、それだけじゃ難しそうだな…
シェルスクリプトだとすると echo の e が全角なのが気になるが実際は違うよな?
- 314 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 08:20:19 ]
- またシェル開発者ですね、わかります
- 315 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 08:39:01 ]
- そうです。開発に配属されたら、シェルを書けることが必須だったんです。
ちょっと焦ってます、、
- 316 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 08:41:15 ]
- 天然だw
- 317 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 13:02:17 ]
- 仕事でシェル書くの?
- 318 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 13:18:46 ]
- シェルスクリプトで引っかかってるようだと
開発部門でやっていくの大変じゃない?
- 319 名前:初心者 [2008/03/19(水) 14:36:50 ]
- すいませんシェルスクリプトで0から9を
横に0123456789 と表示したいのですが、数字を縦にしか表示できなくて。 どなたか教えてください。
- 320 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 14:38:59 ]
- >>319
for((i=0;i<=9;i++)){ echo -n $i;};echo
- 321 名前:初心者 [2008/03/19(水) 14:46:18 ]
- >>320
ありがとうございます。 for 変数 in リスト do 処理 done の形で書くことは出来るのでしょうか? たびたびすいません。
- 322 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 14:47:41 ]
- >>321
for i in 0 1 2 3 4 5 6 7 8 9;do echo -n $i;done;echo
- 323 名前:初心者 [2008/03/19(水) 14:58:57 ]
- ありがとうございました。
処理の部分で使われている -n はどういった意味なのですか?
- 324 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 15:04:07 ]
- これは醜い
- 325 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 15:06:41 ]
- seq -s "" 0 9
- 326 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 15:10:11 ]
- これは酷い初心者です
- 327 名前:初心者 [2008/03/19(水) 15:11:07 ]
- すいません。酷いのはわかってますが、本当はじめたばかりで。
でも、ちゃんと意味も理解していかないとと思いましたので・・
- 328 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 15:21:49 ]
- >>325
seq: command not found
- 329 名前:名無しさん@お腹いっぱい。 [2008/03/19(水) 15:26:38 ]
- あのー(汗 どうしてこんなむずかしいことが出来るの? すごいよ。君たちは。感心してます^^。ガンバってくださいね。
- 330 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 15:57:41 ]
- >>323
man echo
- 331 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 16:10:09 ]
- >>322 の実行結果
-n 0 -n 1 -n 2 -n 3 -n 4 -n 5 -n 6 -n 7 -n 8 -n 9 ??? なぜ?
- 332 名前:初心者 [2008/03/19(水) 16:10:44 ]
- >>330
ありがとうございました。 man コマンドを見るのを忘れてました。助かりました。
- 333 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/03/19(水) 16:12:15 ]
- 問題:
>>322 をOSに依存しないようにポータブルにせよ
|

|