[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 11:27 / Filesize : 228 KB / Number-of Response : 986
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト総合 その8



1 名前:名無しさん@お腹いっぱい。 [2007/02/15(木) 14:28:44 ]
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。

前スレ
シェルスクリプト総合 その7
pc10.2ch.net/test/read.cgi/unix/1157601611/


182 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/04(日) 21:54:16 ]
>>181
問題に曖昧なところがあるけど、こういうことか?
bashじゃなくてもB-sh共通で動く。

dir=${1-.}
if [ ! -d "$dir" ]; then
echo "$dir is not a directory" 1>&2
exit 1
fi

for f in "$dir"/*
do
if [ ! -s "$f" ]; then
echo "$f"
fi
done

183 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/04(日) 21:55:25 ]
「すべてのコマンドライン」の意味がちょっと判らないけど、
大体こんな感じじゃない?

usage() {
 echo "Usage: ..." 1>&2
 exit 1
}
test -d $1 && find $1 -not -name '\.*' -size 0 -print || usage()

ただし補足1はGNU findの機能を使ってるので、どのfindでもということなら
$1が空だった場合の扱いを自分でする必要がある。あと、「.」で始まる
フォルダは処理したいのなら、find の条件をもうちょっと詰める必要がある。


184 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/04(日) 21:59:31 ]
宿題にマジレスはご遠慮ください。本人のためになりません。

185 名前:名無しさん@お腹いっぱい。 [2007/03/04(日) 22:01:31 ]
>>182
レスありがとうございます。
問題文は元々英語の為、変な訳になって細かい部分が伝わらず申し訳ありません。
英文ですが、元の問題はこちらです。ttp://user.ftth100.com/log/up/log/3569.gif

186 名前:181 [2007/03/04(日) 22:21:53 ]
>>183
分かりやすい解説付でありがとうございます。

この場合、

test -d $1(ディレクトリ名を引数1に格納)
&& find $1 -not -name '\.*' -size 0(ファイル名の頭文字が「.」、サイズが0の物をはじく)
-print || usage() (結果をusage()に返し、出力)
usage() で、正常ならば結果を出力。エラーならば1>&2が働きエラーを表示。そしてexitで終了。

といった感じでしょうか?

187 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/04(日) 22:46:22 ]
>>185
この問題って出所はどこなの?

188 名前:181 mailto:sage [2007/03/04(日) 23:16:28 ]
>>187
Unix and Shell Programmingという洋書です。

189 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/04(日) 23:23:20 ]
>>184
>>181 のいう通りなので、後は自分で解読してみてください。


190 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/04(日) 23:24:06 ]
しまた、181 <-> 184 ね



191 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/05(月) 14:36:49 ]
>>186

短絡評価でぐぐれ

192 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/05(月) 15:46:28 ]
>>135

sed -n '/^[yn][eo]/p;s/^IPアドレス.//p' data.txt | fmt -w 18 | tr ' ' ,

193 名前:192 mailto:sage [2007/03/05(月) 15:55:14 ]
ああ先頭が ne とか yo で始まる行があるとだめなので、
yes/no 個別に書くべきですね。
それとスペースを数えると正しくは fmt -w 19 だ ww

194 名前:192 mailto:sage [2007/03/05(月) 16:14:27 ]
ああ、やっぱ駄目だ。
スレ汚し済まない。

195 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/05(月) 16:49:38 ]
>>135
perl -ne 'BEGIN { $/ = "----\n" } /(yes|no).*(\d+(?:\.\d+){3})/s && print "$1,$2\n"'

196 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/05(月) 17:46:13 ]
>>135
sed -f 135.sed

$ cat 135.sed
/^----/{N
s/^----\n//
x
d
b
}
/^IPアドレス /{
s/IPアドレス /,/
x
G
s/\n//
b
}
d


197 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/07(水) 17:04:39 ]
一連のアクションが3回実施され(割り込み重複なし)
一行ずつ一つのログファイルに延々と結果が記載されます。

100
ABC
101
200
DEF
201

…こんな感じで3行ずつが一連のアクションです。
これを以下のように整形したいのですが、妙案は有りますでしょうか?

100,ABC,101
200,DEF,201

ご教示いただければ幸いです。

198 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/07(水) 17:29:18 ]
>>197
sed 'N;N;s/¥n/,/g'

む、あたまに余計な空行が付くな。



199 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/07(水) 17:31:06 ]
ああ、勘違いだった。198でいいわ。


200 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/07(水) 18:03:28 ]
>>199
やっぱりsedを使うのかな?と思い本を見ていたところでした。

なるほどNで行数分読み込んで、改行\nを,に置き換える…。
見れば直ぐに解りますが、これを0から考えるのは大変でした。
今度は誰かに教えれるよう、頑張ります。

素早いご解答ありがとうございました!



201 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 12:24:02 ]
どうしても分からないので教えてください。
利用者が指定した文字列の書いてあるファイルを読み込んで、
配列に文字列を一つずつ格納し、その文字列を順番に出力させたいのですが、
どのようにすれば良いのでしょうか?

202 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 12:32:35 ]
>>201
どのシェルよ?
少なくともピュアBourneシェルには配列はない。


203 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 12:33:26 ]
>>202
申し訳ありません。bashです。

204 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 12:37:11 ]
>>201
tr ' ' '¥012' < ユーザーが指定したファイル | sort
という意味?

指定したファイルの中はどんな構造なの?
1行に1語なのか、フリーテキストか。


205 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 12:40:27 ]
>>204
指定したファイルは、おっしゃる通り、1行1語のテキストファイルです。

Sapporo
Tokyo
Osaka
Nagoya
Fukuoka

といった感じです。

単純に中身を表示するだけなら、
echo -n "ファイル名を入力してください:"
read x

cat $x

でよいと思われるのですが、一度配列に全文字列を格納してやるので困っています…。

206 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 12:46:39 ]
言ってる意味が分からん。

sort そのファイル
とするのとは違うの?


207 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 12:55:10 ]
>>206
sort ファイル とは違い、この場合だと、

array[0]=Sapporo
array[1]=Tokyo
array[2]=Osaka
array[3]=Nagoya
array[4]=Fukuoka

i=0
while [$1 -le 5]
do
echo ${array[$i]}
let i=$i+1
done

読み込んだテキストファイルをこのような感じで出力させたいです。

208 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 12:58:49 ]
宿題は自分でやりましょう。

209 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 13:05:51 ]
>>201
シェルスクリプトじゃなきゃいかんの?
perlかなんか使った方が楽じゃない?

210 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 13:12:43 ]
とりあえず、「順番に」が読んだ順にという意味であって
「整列させて」という意味ではないことは理解した。





211 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 13:16:34 ]
while read word; do
words=($words $word)
done < 指定したファイル
してあとは一緒。


212 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 13:43:20 ]
>>209
perlじゃ駄目なんです。

>>211
echo -n "ファイル名を入力してください:"
while read word; do
words=($words $word)
done < $word

という事でしょうか?

213 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 14:02:36 ]
違う。


214 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 14:07:43 ]
>>213
すいません・・・
どうやれば良いのでしょうか?

215 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 14:10:26 ]
<の後ろに書くのは、>>207のx

echo -n "ファイル名を入力してください:"
read source

while ....

done < $source

あとは出力のためのループ



216 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 14:52:24 ]
>>215
echo -n "ファイル名を入力してください:"
read source

while read word; do
words=($words $word)
done < $source

cat $source | while read
do

echo $words
let source=$source+1

done

でやってみましたが、テキストの最初の文字列しか表示されません。
後半の出力ループがいけないのでしょうか?

217 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 15:06:49 ]
ああ、ごめん、bashじゃなくzshでやってたわ。


218 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 15:12:44 ]
bashで配列にpushする方法がわからん。
代わりに一パラメータで逃げてみた。

while read word; do
set -- $* $word
done < $source

for word in $*; do
echo $word
done


219 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 15:18:07 ]
訂正

×一パラメータ
○位置パラメータ

あんど、こう書くらしい。

while read word; do
size=${#words[@]}
words[$size]=$word
done < $source

for word in ${words[@]}; do
echo $word
done


220 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 15:24:40 ]
bash限定スクリプトは、以降はこちらへ

pc11.2ch.net/test/read.cgi/linux/1154578200/


ここはBourneのみでよろしこ。



221 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 15:49:17 ]
>>219
動作確認出来ました。本当にありがとうございました。

>>220
誘導ありがとうございます。
スレ違いで申し訳ありませんでした。

222 名前:名無しさん@お腹いっぱい。 [2007/03/08(木) 15:53:31 ]
shです
教えてください

#!/bin/sh
COUNTER=0
while [ $COUNTER -lt 100 ]; do
mv "$COUNTER".jpg /home/more/
let COUNTER=COUNTER+1
done

こんな感じのとき最初の10までが1桁になってしまうのですが
01 02 03,,,,
行頭に0を付けた2桁で処理するのはどうすれば良いのでしょうか?
00-09と10-99でループをわけるしか無いのでしょうか?




223 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 15:59:51 ]
最近の環境ならprintf外部コマンドがあるんじゃない?
mv `printf %02d $COUNTER`.jpg /home/more

なければ
mv `echo "0$COUNTER" | sed 's/0*¥(..¥)$/¥1/'`.jpg /home/more
とか、
mv `echo "0$COUNTER" | rev | cut -b1,2 | rev` /home/more
とか。


224 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:09:12 ]
>>222
for COUNTER in `seq -w 0 99`; do : ...; done

↑でループすれば桶。

あと、letコマンドは純粋な shには無いぞ。

225 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:11:22 ]
ただ、>>222 がやっていることをやるだけなら、
そもそもループすら不要で、

mv [0-9][0-9].jpg /home/more

だけで一発。シェルは不要。

226 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:11:48 ]
seqもあったりなかったり

227 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:12:07 ]
>>223
ありがとうございました。
最終行でうまくいきました。
上の2個も含め手法を理解するように勉強してみます

228 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:15:29 ]
(たとえば) [0-9][0-9] を展開しているのはシェルですぅ
ので不要じゃないわよ>>225

229 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:16:49 ]
>>228
お約束どおり釣れましたよ。おめでとう。

230 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:18:58 ]
>>224-226
ありがとう。
実際にはdateから自動生成された莫大な
画像データを部分的に抽出しながら動画生成を
行うので
例に出したのより多少複雑に書き直します

seqも実験してみます





231 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:20:11 ]
touch [0-9][0-9].txt
[root@localhost /tmp]$ ls
[0-9][0-9].txt

となります。
00.txtから99.txtを作りたいのですが…

232 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:20:18 ]
BSDだとseqの代わりにjotだったかな。


233 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:23:11 ]
zsh があるなら

zsh -c 'touch {00..99}.txt'

とか

234 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:26:04 ]
231は空のディレクトリで touch *.txt やったときに
どういう結果になってほしいんだろう。

235 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:27:16 ]
zsh -c 'touch {00..99}.txt'
は、書かれてしまったから

touch `seq -s ".txt " -w 99"`.txt


236 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:27:59 ]
シェルってゆうな。クズ。

237 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:28:49 ]
>>234
00.txtから連番で99.txtまでのファイルが欲しいんでしょ

238 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:30:36 ]
>>236
いつものお約束も釣れましたよ。おめでとう。

239 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:31:17 ]
シェルっていうな

240 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:35:08 ]
>>233 >>235
ありがとうございました!
zshって凄いですね。

でも、それに依存しないよう
>>235さんの方法を覚えます。



241 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:38:39 ]
>>223 のprintf以外の方法だとちょっと無駄。
exprを使うのが定石。

expr 0$COUNTER : '.*\(..\)'

242 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:40:10 ]
seqもない場合があるけどね

243 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:43:23 ]
>>235 の seq、間違ってるよ。最後の .txtが余分なのと、"が1個余分。

244 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:46:42 ]
>>235 よりも、

seq -f %02g.txt 0 99

の方がエレガント。

245 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:53:02 ]
>>243
-sは間に挟む文字列だから最後の.txtがないと、
00.txt ... 98.txt 99 で終わってしまうぞ。
でも正解は>>244


246 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 16:57:54 ]
>>244
確かにこっちなら完璧に出来ますね。

ところで %02g と言うのは何なんでしょうか?

247 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 17:06:19 ]
>>246
man seq
つーか
man 3 printf


248 名前:201 mailto:sage [2007/03/08(木) 18:43:31 ]
>>219
最後にもうひとつだけ質問させてください。
出力をする時に配列の反対(リバースオーダー)から出力をするのはどうやれば良いのでしょうか?

例えば、
Tokyo
Osaka
Nagoya

とあったら

Nagoya
Osaka
Tokyo

と出力されます。

249 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 18:46:19 ]
>>248
tac

250 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 18:51:21 ]
for ...
done | tac
のようにパイプすればいいのではないでしょうか。

tacがない環境では、

for ...

done | sed '1!G;h;$!d'




251 名前:201 mailto:sage [2007/03/08(木) 19:14:20 ]
ありがとうございました。
これでなんとか単位が取れます

252 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 19:25:38 ]
はぁ? 単位?? 宿題禁止なわけだが、、答えて損した、、

253 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/08(木) 19:46:30 ]
上で指摘されてるのに気付けよ

254 名前:名無しさん@お腹いっぱい。 mailto:@@@ [2007/03/09(金) 00:33:46 ]
ファイルを1行ずつ読み込んで配列に入れたいとおもってまつ。
↓みたいに書いてみたのですがエラーでちゃいます。なぜ??

#!/bin/csh
set ALLCOUNT = 5
@ CT = 1
@ NO = 3
@ CN = ""
while ( $NO <= $ALLCOUNT )
set CN[$CT] = `sed -n "$NO p " job.txt
@ CT ++
@ NO ++
end

255 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/09(金) 01:11:36 ]
シェルスクリプトでは、sh だろうと csh だろうと、
配列を使おうと思った時点で負け。別の方法を探すべし。

256 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/09(金) 01:17:09 ]
>>254
>>201と同じ学校の人?

257 名前:名無しさん@お腹いっぱい。 mailto:@@@ [2007/03/09(金) 01:19:14 ]
>255
ダメっぽ?

>256
いや趣味

258 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/09(金) 07:50:56 ]
cshの時点で負け。
それが宿題だとすると、そんな教官がいるような学校に
進学した時点で負け。

259 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/09(金) 07:52:39 ]
思考停止論か

260 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/09(金) 07:54:46 ]
宿題で「cshで書け」と指定されている場合以外に、
cshで書かなければいけない合理的な理由は存在しない。

趣味なら自分で研究すること。



261 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/09(金) 17:07:47 ]
シェルスクリプトならファイルが配列ってことで

262 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/09(金) 19:22:22 ]
インデックスによるアクセスが必要ならポジションパラメータ使うだろ。普通。

263 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/09(金) 21:47:41 ]
配列も、位置パラメータも
所詮人間がデータ構造を解釈しているだけの話。

264 名前:名無しさん@お腹いっぱい。 [2007/03/10(土) 21:31:59 ]
201が宿題やったせいで254も宿題思われてるのかw
というより口だけで実は分からないだけですかおまいら。

265 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/10(土) 21:37:01 ]
>>264
宿題かどうかが問題なんじゃなくて、cshのスクリプトは論外ということ。
誰も答えるはずがない。

266 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/10(土) 21:44:39 ]
自演乙

267 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/10(土) 21:45:26 ]
  / / ,. -'"´         `丶、、 ヽ
       __l //      /  |      \ \\ ゙、        / ̄ ̄ ̄ ̄ ̄ ̄
     / :::||  / / /    l l      ヽ ヽヽド、      /
    l::::::::::|| /   /  /      ! l  ヽ   ヽ ヽヽ ||:::::ヽ    |  l 十``  十_ヽ
   斤.::::::::||/  /   //! ハ  l  !  ヽ   ', ゙ヽ||::::::::勺    |  レ d、  (_| _)
   |ll|i :::::::|| l l  イ l /!l | ヽ  ト、|、  ト、  l  l、||::::::::}ll|   |  ┼‐、ヽ  ┴┴
   |ll|ヽ:::::|l  !l  |l!‐!‐ト、l  ヽ | l | ヽ | l i l  l||:::::::/!l|   |     ノ   月 l |
   |lll| `ー!  l  | l 」-=ミ|`ヽ ヽ | !-‐!‐|-l、|} l  |r、〃|ll|   |  二二``  l__ヽ
   L!l   |   l | 〃{ノ::::iヾ  ヽ! ,. =-ミ、!ハ l  !"´ |ll|   |   ノ     _)
         {l  |!l | ヽ `ー"     ' トイ:::}ヾ  | l |  |ll」   |   ─ァ
         ヽ |l !|               `二ノ  '| ||       |  /\
          l |', |                 /)|l l        |  ┼‐、ヽ
           l | ゙、        ` ´         /-イ| l          |    ノ
            !|  \    ヽニヽ      , ′/゙! l       ∠   '⌒)
         |   |ヽ、  ー     /  〃 | !         |   「
             ,.rr|   丶、   ,.. '´ト、     l′        ヽ  ゚
            l::l {:|     ` ´   |::}}               \______
        _. -‐1::ヽ' -、    _,.. -‐ン::|ヽ、
 _.. -‐ "´     |:::::::::`ゝヽ  /rJ::'"´:::::::!  ` 丶、


268 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/10(土) 21:52:54 ]
だいたい木曜辺りに宿題が出るのか?

269 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/10(土) 22:04:01 ]
宿題は2chでやってもらうのが当たり前です。

270 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/10(土) 22:11:17 ]
逆に、宿題を出す立場の人間です。
毎回、問題を出すのにネタが尽き気味で大変です。
宿題が出た人、どんどんその問題を書き込んでください。
一部変えて出題に使わせていただきます。



271 名前:名無しさん@お腹いっぱい。 mailto:hage [2007/03/10(土) 22:19:47 ]
2ちゃんを使わせない方法

272 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/10(土) 22:29:26 ]
>>270
分かった。
うちで使うスクリプトを問題として出してやる。


273 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/12(月) 10:34:35 ]
>>270
tacをシェルスクリプトで書かせる。

274 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/12(月) 10:47:03 ]
>>273
そういえば、まだ bash の回答がない。
ttp://golf.shinh.org/p.rb?reverse+lines
この問題にかぎらず、sh で参戦してる人が少ないのでおまいらもやってみてくれ。
おれもがんばってみる。


275 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/12(月) 17:31:24 ]
sedの解が出てるんだからそれを呼べばよいのでは。
何も無理してshだけで文字列操作するこたーないと思うけど。
#!/bin/sh
f () { local l; read -r l && { f; echo "$l"; }; }
f

276 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/12(月) 18:28:56 ]
>>275
readの -r オプションはbash依存。localコマンドは Bourneで使えない。
あと、再帰呼出しは重い。非再帰版の方がエレガント。
出題ネタにしたいので、回答は省略。

277 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/12(月) 18:44:38 ]
#! /bin/sh

txt=
IFS='
'
while read line
do
txt="${line}
${txt}"
done
echo -n "$txt"

278 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/12(月) 19:10:00 ]
>>276
CodeGolfが出ちゃったからbashism上等の答えになったんだと思う。



279 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/12(月) 19:18:19 ]
localはどうか忘れたがread -rはPOSIXにもあったんじゃないか?

280 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/13(火) 01:40:57 ]
そーすpls



281 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/13(火) 02:44:26 ]
>>280
>>3
> POSIX: Shell & Utilities (標準規格)
> www.opengroup.org/onlinepubs/009695399/utilities/contents.html

282 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/13(火) 09:45:19 ]
www.opengroup.org/onlinepubs/009695399/utilities/read.html
なるほどね






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<228KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef