シェルスクリプト総合 その16
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2010/02/20(土) 14:10:05スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
前スレ
シェルスクリプト総合 その15
http://pc12.2ch.net/test/read.cgi/unix/1246408968/l50
0012名無しさん@お腹いっぱい。
2010/02/22(月) 16:15:20read a
if [[ "$a" -lt 10000 || "$a" -gt 99999 ]]
then
echo 'Error'
exit
fi
x=$((a % 7))
case "$x" in
1)
x=$((a % 13))
if [ "$x" -eq 2 ]
then
echo 'Daikichi'
else
echo 'Shoukichi'
fi
;;
*)
x=$((a % 13))
if [ "$x" -eq 2 ]
then
echo 'Chuukichi'
else
echo 'Hazure'
fi
;;
esac
0013名無しさん@お腹いっぱい。
2010/02/22(月) 20:54:25read a のところで aを入力すると、誤動作するようですが・・
0014名無しさん@お腹いっぱい。
2010/02/22(月) 21:34:43echo "$a" | grep '^[[:digit:]]....$' >/dev/null 2>&1
if [ $? -ne 0 ]
then
echo 'Error'
exit 1
fi
0015名無しさん@お腹いっぱい。
2010/02/22(月) 21:39:42# grepのパターンはこっちのほうが良い。
echo "$a" | grep '^[[^0][:digit:]]....$' >/dev/null 2>&1
if [ "$?" -ne 0 ]
then
echo 'Error'
exit 1
fi
0016名無しさん@お腹いっぱい。
2010/02/23(火) 01:07:12jkl.sh: Command not found.
ワザワザbashをインスコしなきゃ、UNIXじゃ使えないじゃん。
0017名無しさん@お腹いっぱい。
2010/02/23(火) 07:34:270018名無しさん@お腹いっぱい。
2010/02/23(火) 14:34:210019名無しさん@お腹いっぱい。
2010/02/23(火) 14:52:340020名無しさん@お腹いっぱい。
2010/02/23(火) 15:34:490021名無しさん@お腹いっぱい。
2010/02/23(火) 15:48:25の言う今時のUNIXはやっぱLinuxなんだよな
0022名無しさん@お腹いっぱい。
2010/02/23(火) 16:24:16で、ちょっと前だとbashはLinuxのものとして叩けたけど、
今はUNIXでもbashが標準になっちゃったから、その線では叩けなくなったんだよ。
0023名無しさん@お腹いっぱい。
2010/02/23(火) 16:48:16だからそのUNIXって何だよ(w
ぱちょこんウニックスか?
なんとかベーエスデーか?
0024名無しさん@お腹いっぱい。
2010/02/23(火) 19:01:470025名無しさん@お腹いっぱい。
2010/02/23(火) 23:38:310026名無しさん@お腹いっぱい。
2010/02/24(水) 00:27:15Tigerあたりからbashが標準。
0027名無しさん@お腹いっぱい。
2010/02/24(水) 00:33:37bashはオプション
6.1は知らん
0028名無しさん@お腹いっぱい。
2010/02/24(水) 01:41:34無いよ。
>>23
*BSDにも無い。
Mac OS Xは全然UNIXとは程遠い。
kernelにFreeBSDが使われてるってだけ。
Solarisでも/opt扱いだったな。
0029名無しさん@お腹いっぱい。
2010/02/24(水) 02:27:31>kernelにFreeBSDが使われてるってだけ。
??????
0030名無しさん@お腹いっぱい。
2010/02/24(水) 02:30:290031名無しさん@お腹いっぱい。
2010/02/24(水) 02:37:350032名無しさん@お腹いっぱい。
2010/02/24(水) 04:54:250033名無しさん@お腹いっぱい。
2010/02/24(水) 06:55:36おいおい、*BSDはUNIXじゃないよw
あと、今のSolarisではbashは必須扱い。
0034名無しさん@お腹いっぱい。
2010/02/24(水) 07:04:41Solarisのbashは、/optじゃなくて、/usr/bin/bash。
しかも、symlinkじゃなくて、/usr/bin/bashにバイナリ本体がある。
SUNWbashに入ってる。
0035名無しさん@お腹いっぱい。
2010/02/24(水) 08:20:190036名無しさん@お腹いっぱい。
2010/02/24(水) 09:37:59>>19の
「今時のUNIX」はLinuxと決定されました。
0037名無しさん@お腹いっぱい。
2010/02/24(水) 09:41:33LinuxはUNIXじゃないよ。*BSDもUNIXじゃないよ。
「今時のUNIX」は主にSolarisとかのこと。
Solaris10 -> bash標準
OpenSolaris -> bash必須
0038名無しさん@お腹いっぱい。
2010/02/24(水) 09:50:50> Mac OS Xは全然UNIXとは程遠い。
UNIX認証を得てるので名はUNIX。
ユーザランドはFreeBSDベースに作られたDarwinなので、実も伝統的なu**x
> kernelにFreeBSDが使われてるってだけ。
kernelはMach
>>37
>LinuxはUNIXじゃないよ。
分かった上で言ってるんだと思うよ。
0039名無しさん@お腹いっぱい。
2010/02/24(水) 11:29:55主にだったら他に何があるの?
主も糞もSolarisのみの話なら、今時のUNIXという
括りは間違ってるんだが
0040名無しさん@お腹いっぱい。
2010/02/24(水) 14:37:00OpenSolarisもUNIXじゃないよ。
0041名無しさん@お腹いっぱい。
2010/02/24(水) 16:01:46なんて書いてみたものの、結局Solarisしかなくて
やっぱり今時のUNIX=Linuxに戻ってしまうという循環
0042名無しさん@お腹いっぱい。
2010/02/24(水) 16:03:130043名無しさん@お腹いっぱい。
2010/02/24(水) 18:28:06第7版はPDP11です、とセルフつっこみ
0044名無しさん@お腹いっぱい。
2010/02/24(水) 21:26:34/bin/shに変更しても「今時のUNIX」ならすべて動く。
それはそうと、>>12 は無駄が多い記述だな、もうちょっと簡単に書ける。
0045名無しさん@お腹いっぱい。
2010/02/24(水) 21:40:54うちの freebsd (/bin/sh = ash) と debian (/bin/sh = dash) では動きませんでした。
まあ、どっちも今どきの UNIX じゃないけど。
# ksh で拡張された機能が必要
0046名無しさん@お腹いっぱい。
2010/02/24(水) 23:06:02FreeBSDはUNIXじゃありません。
今、話をしてるのは「UNIX」だけです。
0047名無しさん@お腹いっぱい。
2010/02/24(水) 23:33:260048名無しさん@お腹いっぱい。
2010/02/24(水) 23:36:02おまえのいう「UNIX」の定義を述べよ。
0049名無しさん@お腹いっぱい。
2010/02/24(水) 23:53:320050名無しさん@お腹いっぱい。
2010/02/25(木) 01:27:110051名無しさん@お腹いっぱい。
2010/02/25(木) 10:33:42今時のUNIXと言い放ったバカと
それを受けとめる人間には重要
0052名無しさん@お腹いっぱい。
2010/02/25(木) 10:35:170053名無しさん@お腹いっぱい。
2010/02/25(木) 11:07:280054名無しさん@お腹いっぱい。
2010/02/25(木) 11:08:530055名無しさん@お腹いっぱい。
2010/02/25(木) 14:58:090056名無しさん@お腹いっぱい。
2010/02/25(木) 19:35:24UNIXの定義は来世紀への課題と致します
0057名無しさん@お腹いっぱい。
2010/02/25(木) 20:24:31(基本仕様)
・コマンドとして実行できる.(UNIXシェルである.)
・コマンドラインの第1引数で数字を指定する.
・第1引数が数字以外だった場合はエラーメッセージを表示する.
・第1引数の数字以下の自然数のうち,素数をすべて見つけてリスト表示する.
・すべてUNIXシェル内部で処理し,外部コマンドは呼び出さないこと.
(ポイント)
☆UNIXシェルにするには,ファイルの最初に #!/bin/bashというおまじないを書く.
☆コマンドラインの第1引数は,$1に格納されている.
☆四則演算には $(( )) コマンドが使用できる.(ただし,整数しか扱えない.)
誰かわかるひとお願いします
0058名無しさん@お腹いっぱい。
2010/02/25(木) 20:28:210059名無しさん@お腹いっぱい。
2010/02/25(木) 21:37:45/usr/games/primes 1 "$1"
0060名無しさん@お腹いっぱい。
2010/02/25(木) 22:23:21『UNIXシェルである』という表現は有効なの?
0061名無しさん@お腹いっぱい。
2010/02/25(木) 22:46:26相手しちゃだめだよ。
0062名無しさん@お腹いっぱい。
2010/02/26(金) 06:56:02>>57
>・すべてUNIXシェル内部で処理し,外部コマンドは呼び出さないこと.
0063名無しさん@お腹いっぱい。
2010/02/26(金) 09:20:17その頭の悪そうな問題書く人は駆け出しの厨房?
もし師と仰いでるなら、即刻師匠を変えた方が良い
0064名無しさん@お腹いっぱい。
2010/02/26(金) 20:51:03# 問題自体は難しくないのだが・・・
#!/bin/bash
echo "$1" | grep '^[[:digit:]][[:digit:]]*$' >/dev/null 2>&1
if [[ "$?" -ne 0 || "$1" -lt 2 ]]
then
echo 'Error'
exit 1
fi
for ((i=2;i<="$1";i++)) {
if [ $((i % 2)) -eq 0 ]
then
echo "$i"
fi
}
0065名無しさん@お腹いっぱい。
2010/02/26(金) 20:54:41偶数を表示してどうするw
>>57
>素数
006664
2010/02/26(金) 20:55:01粗相。
0067名無しさん@お腹いっぱい。
2010/02/26(金) 20:57:40grepも使っちゃ駄目だそうですよ
0068名無しさん@お腹いっぱい。
2010/02/26(金) 20:57:53早い話、素数かどうかわかれば良いだけなら
判定対象の数値をそれより小さい数値全てで割り算してみればいいだけ。
ようするにループで回せばいいだけ。
0069名無しさん@お腹いっぱい。
2010/02/26(金) 21:04:22↓だろ。全然長くないよ。
#!/bin/bash
for ((i = 2; i <= $1; i++)) {
for ((j = 2; j < i; j++)) {
if ((i % j == 0)); then
continue 2
fi
}
echo $i
}
0070名無しさん@お腹いっぱい。
2010/02/26(金) 21:18:53(基本仕様)
・コマンドとして実行できる.(UNIXシェルである.)
・コマンドラインの第1引数で人間の手番(○側か×側か)を指定する.
・人間とコンピュータが対戦するようにする.
・3x3マスのマルバツゲームのボードを作成する.
・○側と×側が交互に2次元座標上の位置を入力する.
・入力後、毎回ボードを表示する.
・たて、よこ、斜めのいずれかに○か×が3つ並んだ時点でプログラムを終了する.
・すべてUNIXシェル内部で処理し,外部コマンドは呼び出さないこと.
(ポイント)
☆UNIXシェルにするには,ファイルの最初に #!/bin/bashというおまじないを書く.
☆コマンドラインの第1引数は,$1に格納されている.
☆四則演算には $(( )) コマンドが使用できる.(ただし,整数しか扱えない.)
誰かわかるひとお願いします
0071名無しさん@お腹いっぱい。
2010/02/26(金) 21:19:320072名無しさん@お腹いっぱい。
2010/02/26(金) 22:48:25(基本仕様)
・コマンドとして実行できる.(UNIXシェルである.)
・主人公、妹1名、両親、自分の友人数名(うち最低1名は女性、半数以上は男性とする)、妹の友人(女性)数名が登場する.
・主人公、妹、自分の友人、妹の友人はいずれも生徒もしくは学生とする.
・両親のうち、父は総合商社勤務のサラリーマン、母は専業主婦とする.
・主人公の言動やイベントの発生にともない、各キャラのパラメータを変化させる.
・病弱な妹を思いやる兄と妹の交流を中心に、他の登場人物との友情や恋愛を描写する.
・エンディングは妹、もしくは妹の友人のいずれかと深い恋愛関係になるか、誰とも親密になれないバッドエンディングになるようにする.
・妹と恋愛関係が深まる場合、病弱な妹への思いやりが徐々に、自然に恋愛感情へ変化するように描写する.
・ゲームの操作方法はコマンド選択式またはコマンド入力式とする.
・すべてUNIXシェル内部で処理し,外部コマンドは呼び出さないこと.
(ポイント)
☆UNIXシェルにするには,ファイルの最初に #!/bin/bashというおまじないを書く.
☆コマンド選択方式のゲームにする場合、select文を使用できる。
☆四則演算には $(( )) コマンドが使用できる.(ただし,整数しか扱えない.)
誰かわかるひとお願いします
0073名無しさん@お腹いっぱい。
2010/02/26(金) 22:48:280074名無しさん@お腹いっぱい。
2010/02/26(金) 22:55:02おにいちゃん、寂しいこと言わないで・・・
好感度 :-2
ストレス:+5
0075名無しさん@お腹いっぱい。
2010/02/26(金) 23:10:470076名無しさん@お腹いっぱい。
2010/02/28(日) 00:22:12うちはKだしなって言われました。
個人的にはコマンドとか多少は違っていてもBシェル知っていたら、
それなりにKシェルとかでも対応できるじゃんと思っていますが
いまいち違いがわからないのですが
具体的にBシェル、Cシェル、Kシェルの決定的な違いってあるのでしょうか?
たとえばこれがあるからこれを採用しているとか
0077名無しさん@お腹いっぱい。
2010/02/28(日) 00:35:37相手の言うKシェル(Korn Shell)はそれのスーパーセットなので、
機能が増えていると思えばいい。商用のUNIXだとkshがふつーに入っている。
あなたのいうBシェルがGNUのBourne-Again Shell(bash)のことなら、
同じようにBourne Shellのスーパーセットではあるが、kshとは系列が異なる。
/bin/sh の機能の範囲では大差ない。商用だとkshが、フリーだと
bashがそれの上位シェルとして使われていると思えばよい。
Linux だと /bin/sh だと思っても実体が bash だったりして知らない
うちに固有の機能に依存していることがあるので気をつける。
Cシェルのことは忘れていい。
0078名無しさん@お腹いっぱい。
2010/02/28(日) 00:39:50http://www.nurs.or.jp/~asada/FAQ/UNIX/UNIX.FAQ.5.html
0079名無しさん@お腹いっぱい。
2010/02/28(日) 01:11:100080名無しさん@お腹いっぱい。
2010/02/28(日) 01:16:280081名無しさん@お腹いっぱい。
2010/02/28(日) 01:43:14シェルスクリプトと比較して、VBAはどこがどんな風に難しいのでしょうか?
0082名無しさん@お腹いっぱい。
2010/02/28(日) 10:29:390083名無しさん@お腹いっぱい。
2010/02/28(日) 12:33:50今時でつまつ調はキモい
0084名無しさん@お腹いっぱい。
2010/02/28(日) 13:17:020085名無しさん@お腹いっぱい。
2010/02/28(日) 17:10:200086名無しさん@お腹いっぱい。
2010/02/28(日) 17:21:110087名無しさん@お腹いっぱい。
2010/02/28(日) 17:38:23'=' はどう書くんでしょう?
0088名無しさん@お腹いっぱい。
2010/02/28(日) 17:45:240089名無しさん@お腹いっぱい。
2010/02/28(日) 17:49:33ついでに、-ne と != も違います
0090名無しさん@お腹いっぱい。
2010/02/28(日) 17:51:42しかし、'='または'==' と -eq は違う。
0091名無しさん@お腹いっぱい。
2010/02/28(日) 17:58:530092名無しさん@お腹いっぱい。
2010/02/28(日) 18:25:420093名無しさん@お腹いっぱい。
2010/02/28(日) 18:27:07009485,87
2010/02/28(日) 18:30:090095名無しさん@お腹いっぱい。
2010/02/28(日) 18:40:420096名無しさん@お腹いっぱい。
2010/02/28(日) 19:45:24%preun
if [ "$1" -eq "0" ]; then
0097名無しさん@お腹いっぱい。
2010/02/28(日) 19:48:38"$1"が 0 でも 00 でも 000 でも一致するのが -eq
0098名無しさん@お腹いっぱい。
2010/02/28(日) 20:00:19こうすれば0のみの一致になる?
0099名無しさん@お腹いっぱい。
2010/02/28(日) 20:06:40と、xをつけたくなってしまうバッドノウハウ
0100名無しさん@お腹いっぱい。
2010/02/28(日) 20:10:19kwsk
0101名無しさん@お腹いっぱい。
2010/02/28(日) 20:14:10その xを付けるバッドノウハウが必要になるような "$1"の例が、
今時のUNIXシェルには存在しないんだな。
よってxを付けるバッドノウハウは不要。
0102名無しさん@お腹いっぱい。
2010/02/28(日) 21:04:27bash/ksh/zsh だとコケない。確かにUNIXシェルならコケないな。
0103名無しさん@お腹いっぱい。
2010/03/09(火) 04:37:55文字として比較するか、数値として比較するか
0104名無しさん@お腹いっぱい。
2010/03/09(火) 04:39:31bashに似ているが、微妙に違う罠
0105名無しさん@お腹いっぱい。
2010/03/11(木) 23:38:01echo $record | wc -c
で取得できると思ったのですが、echoが末尾のスペースをカットしてしまい、上手く行かず…
どんな工夫で解決できるでしょうか?
0106名無しさん@お腹いっぱい。
2010/03/11(木) 23:46:46$record にはどうやってデータ格納してるの?
0107名無しさん@お腹いっぱい。
2010/03/12(金) 06:46:57まだテスト段階で、本格的なコーディングはしていないのですが、
record=`head -1 ファイルパス`
echo "${record}@" …ここではスペースが入っているのを確認
echo ${#record} …スペース込みの文字数が出力されるのを確認
echo $record | wc -c …バイト数が足りず
ということで、パイプする前のechoでスペースが落ちてるんじゃないかと…
0108名無しさん@お腹いっぱい。
2010/03/12(金) 06:59:520109名無しさん@お腹いっぱい。
2010/03/12(金) 18:33:15echo "$record" | wc -c …バイト数が1個多い、、
、、と言うと予想。
0110名無しさん@お腹いっぱい。
2010/03/12(金) 21:01:22sh-3.2$ bar="space "
sh-3.2$ /bin/echo -n ${bar} | wc -c
5
sh-3.2$ /bin/echo -n "${bar}" | wc -c
6
0111名無しさん@お腹いっぱい。
2010/03/12(金) 21:07:44$ bar="space "
$ /bin/echo -n "${bar}" | wc -c
10
???
0112名無しさん@お腹いっぱい。
2010/03/12(金) 21:21:03-n オプション(出力後改行しない)を持たないecho実装だとそうなる。
- n 空白 s p a c e 空白 改行
■ このスレッドは過去ログ倉庫に格納されています