- 1 名前:シェルスクリプトライター mailto:sage [2011/12/10(土) 20:06:40.38 ]
- シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルスクリプトのことをシェルってゆーな ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも RubyやPerlの方が適した仕事には素直にそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 前スレ シェルスクリプト総合 その18 hibari.2ch.net/test/read.cgi/unix/1308195527/ 次スレは >>970 で。
- 521 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 03:14:56.05 ]
- 質問です。
cp a.txt b.txt というシェルスクリプトが書かれた『hoge.sh』をダブルクリックで実行した場合、 普通はなんの反応もなく、コピーが実行されます。 これを、実行されたコマンドを端末に表示させることはできるでしょうか? はじめから端末内で bash hoge.sh とすればいいのですが、深い階層にあって面倒なので…。 それに、この場合も何のコマンドが実行されたのかが分かりません。
- 522 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 06:51:12.07 ]
- >>521
hoge.shに以下のように書いておく。 xterm -e sh -xc 'cp a.txt b.txt; set +x; echo -n Hit any KEY:; read key'
- 523 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 12:25:04.10 ]
- >>522
ありがとうございました m(_ _)m
- 524 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/14(水) 23:14:00.92 ]
- tarって入力されたデータをそのままの順でアーカイブするけど
-Tで渡すファイル名をソートする意味ってあるかな?
- 525 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 18:42:17.16 ]
- tarはアーカイブの先頭からファイルを展開していく
遅いテープに書き込むときに、早めに参照したいファイルをアーカイブの先頭付近に書いておくと 早めに展開される そんな特性があるので、その特性を活かすためにアーカイブするファイルの順序を指定することは、 意味がある わざわざソートして渡してるなら、その特性を理解してないだろうから、意味ないだろう
- 526 名前:名無しさん@お腹いっぱい。 [2012/03/15(木) 21:04:05.76 ]
- どなたか↓わかる方、今週末中にお願いします。
──────────────────────────────────── 不定個数の整数の引数を与えて実行すると,それらの整数のGCMとLCMを計算して 表示するようなシェルスクリプトを作成せよ.使用シェルは/bin/shとする. 【実行例】 $ ./kadai15.sh 12 20 24 GCM = 4 LCM = 120 ────────────────────────────────────
- 527 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 21:51:58.41 ]
- GCMとLCMがわからん
- 528 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 22:02:52.24 ]
- lcmは最小公倍数だね。
gcmは最大公倍数? w
- 529 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 22:13:31.83 ]
- Greatest Common Measure
Least Common Multiple >>528 はアホ
- 530 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/15(木) 22:20:19.95 ]
- 最大公倍数
最小公約数
- 531 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 00:21:54.70 ]
- 本当にどうでもいいことだが、gcm ってメジャーなんでしょうか?
普通の数学では gcd が圧倒的で、gcm は数学教育の教科書でしか 見たことがない。
- 532 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 00:26:08.56 ]
- 数学板で聞いたら。
- 533 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 00:49:16.79 ]
- en.wikipedia.org/wiki/Greatest_common_divisor
ejje.weblio.jp/content/%E6%9C%80%E5%A4%A7%E5%85%AC%E7%B4%84%E6%95%B0
- 534 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 01:11:00.95 ]
- SEだが>>526がわからんくて死にたい。
整数と小数の判定ってシェルでどうやんの?
- 535 名前:531 mailto:sage [2012/03/16(金) 01:13:58.15 ]
- メジャーなんですねgcmだけに、と無理矢理言っておきます
- 536 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 05:58:58.34 ]
- gcd()
{ a=$1; b=$2 while [ $b != 0 ]; do t=$(($a % $b)); a=$b; b=$t done echo $a } t=$1; shift for i; do gcd=`gcd $t $i` lcm=$(($t * $i / $gcd)) t=$lcm done echo gcd:$gcd lcm:$lcm
- 537 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 07:15:25.61 ]
- >>536
不正解 引数 12 20 24 の時、 gcd:12 lcm:120 と表示される。 正しくは GCM = 4 あと、/bin/shでは動かない $(( )) とか
- 538 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 07:43:40.34 ]
- >>537
freebsd の /bin/sh で動いたが
- 539 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 07:54:03.72 ]
- >>538
>>1 >FreeBSDユーザは/bin/shの正体がashなので注意。 それより、GCMの計算が間違ってるので結局ダメ
- 540 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 07:54:54.99 ]
- >>536
posix 互換の /bin/sh なら実装してるんじゃね $((expression)) pubs.opengroup.org/onlinepubs/009695399/toc.htm
- 541 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:00:20.84 ]
- >>537
Solarisも/bin/shはkshになっちゃいましたよ、おじいちゃん
- 542 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:02:48.59 ]
- gcdだけ作って秋田。
gcd() { local a b r if [ $1 -gt $2 ]; then a=$1; b=$2 else a=$2; b=$1 fi r=$(( $a % $b )) [ $r -eq 0 ] && { echo $b; return; } gcd $b $r }
- 543 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:09:40.85 ]
- >>541
なってねーよ。嘘書くな。
- 544 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:37:43.03 ]
- >>543
なってるよ。おじいちゃん用のshは/usr/sunos/bin/shに隠居しました。
- 545 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:41:42.83 ]
- >>544
なってないよ。 opensolaris ≠ solaris あと、pdkshになってるopensolarisだとしても、 「正体はkshだから注意」ということで/bin/shのお題の回答としては不正解。
- 546 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:54:47.13 ]
- ぷぷぷ
- 547 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 10:59:30.51 ]
- Solarisなんていつまであるんだろうなぁ。
- 548 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 11:18:01.21 ]
- $((expression))がサポートされてなければexprに書き換えれば
すむ事だから大した問題じゃないよね。 多分、/bin/shってお題はcsh使うなカスって意味だろうね。 おじいちゃんはこんなところで重箱の隅つついてないで、外へで てゲートボールのエースでも目指した方がいいよ。
- 549 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 11:18:28.78 ]
- gcd(){
i=$1 while [ $(($1%i+$2%i)) -ne 0 ];do i=$((i-1)); done echo $i } g=$1 l=$1 while [ $# -gt 1 ]; do shift g=`gcd $g $1` l=$((l*$1/`gcd $l $1`)) done echo gcd=$g lcm=$l
- 550 名前:526 mailto:sage [2012/03/16(金) 11:44:30.22 ]
- >>548
>多分、/bin/shってお題はcsh使うなカスって意味だろうね。 違います。従来からの/bin/shを使えという課題です。 >大した問題じゃないよね それでは課題として点がもらえません。 大した問題かどうかは関係なく、課題通りの答が必要です。 引続き回答をお願いします。 表示形式も含めて課題です。
- 551 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 12:16:37.52 ]
- User Environment Feature Changes - Transitioning From Oracle Solaris 10 to Oracle Solaris 11
docs.oracle.com/cd/E23824_01/html/E24456/userenv-1.html
- 552 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 12:19:43.22 ]
- あらkshからbashになったのね。> Oracle Solaris 11の/bin/sh
- 553 名前:526 mailto:sage [2012/03/16(金) 12:23:58.00 ]
- 私の為に争わないでください
課題の回答だけお願いします
- 554 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 12:24:33.25 ]
- >>552
えっと……どこをどう読めばそうなるのかとても不思議
- 555 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 14:29:31.51 ]
- >>553
ちったぁ自分で考えろ
- 556 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 14:45:01.99 ]
- >>552
> The default shell, /bin/sh, is now linked to ksh93. The default user shell is the Bourne-again (bash) shell. the default user shell ってのは useradd したときのデフォルトとかの意味だろうね。 /bin/sh は ksh93 だ。
- 557 名前:526 mailto:sage [2012/03/16(金) 14:45:06.16 ]
- 時間が無い。早くしてください。
来週の月曜の朝10時までにお願いします。 過程とか不要です。答えだけ書いてください。 もし回答以外のことも書きたい場合はスクリプトを*で囲って 目立つようにしてください 書き方の例を示します **************************** a = 3 x + y = 5 ****************************
- 558 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 14:46:05.73 ]
- 今それどころじゃないからちょっと黙ってて。
- 559 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 14:51:59.23 ]
- ここまで、
「宿題は自分でやれ」 「来年はちゃんと講義聞こうな」 なし
- 560 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 15:38:56.29 ]
- 分からない人は黙っててください
- 561 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 18:41:04.43 ]
- >>560
それって、お前も黙らなきゃいけないんじゃないか?
- 562 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 18:44:07.77 ]
- すべて分かった上で言ってるんだよ。
- 563 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 18:45:05.35 ]
- ****************************
#! /bin/bash set -e function gcd() { local -i i j for ((i="$1";; i--)); do for j in "$@"; do ((j % i != 0)) && continue 2 done echo "$i" return done } function lcm() { local -i i=1 j for j in "$@"; do ((i *= j / "$(gcd "$i" "$j")")) done echo "$i" return } printf "GCM = %d\nLCM = %d\n" "$(gcd "$@")" "$(lcm "$@")" **************************** 空気を読んで? bashで。 大学生はもう春休みなはずだが、実習? それともこれだけできれば単位が貰える系か? # 今年は進級できるかなあ、自分。
- 564 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 18:47:50.70 ]
- >>563
だからぁ、bashじゃ駄目だっておっしゃってますが・・
- 565 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 21:19:30.14 ]
- >>548
> $((expression))がサポートされてなければexprに書き換えれば > すむ事だから大した問題じゃないよね。 letは使えないの?
- 566 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 21:21:16.68 ]
- もうできてる人が何人もいるんです
3/19の10:00まで待つと書きましたが、前倒して3/17の16:30までとします >>557 にあるフォーマットでお願いします
- 567 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 21:22:56.00 ]
- >>565
もちろんletも使えない。
- 568 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 21:41:50.80 ]
- >>563
最大公約数求めるのに引数デクリメントしながらすべて割って試すとか 総当たりの非効率アルゴリズム使ってボケるんなら、 最小公倍数でもインクリメントしながら順番に割って総当たりするアルゴリズムで ボケるべき。
- 569 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 21:49:10.39 ]
- つか, /bin/sh って言ってる奴いるけど, どの時点でどの機能が入った
/bin/sh まで許せるんだ? FreeBSD の ports で拡張機能すべて許可した v7sh では func(){} すら Syntax error なんだが... # 少なくとも ``#!/usr/bin/env bash'' くらいにしないと販促だ >>563
- 570 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 21:54:56.85 ]
- >>566
バカ共の相手が面倒になったので締め切りました。 やっぱりバカしか居ないんだな。
- 571 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 22:25:57.27 ]
- なりすまし多いね
- 572 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 22:27:13.29 ]
- >>557
できたよ。GCMとLCMの計算方法が対称的になるようにしたよ。 /bin/sh純正だ。アルゴリズムはウケ狙いだけどな。 #!/bin/sh GCM=$1 while :; do for i in "$@"; do if [ `expr "$i" % "$GCM"` != 0 ]; then GCM=`expr "$GCM" - 1` continue 2 fi done echo GCM = "$GCM" break done LCM=$1 while :; do for i in "$@"; do if [ `expr "$LCM" % "$i"` != 0 ]; then LCM=`expr "$LCM" + 1` continue 2 fi done echo LCM = "$LCM" break done
- 573 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 22:28:07.31 ]
- 自演も多いよ
- 574 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 23:17:57.60 ]
- 本人です
3/17 17:00までに提出しないと単位が足りなくなるのが分かったので質問してます レポートに貼り付けるのは私がしますので、3/17の16:30までにお願いします また他の皆さんについても、ソースにバグがないかどうか、早急なチェックとデバッグを 期待しています >>557 にあるフォーマットでお願いします
- 575 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 23:25:20.31 ]
- そろそろ飽きたわ。もう十分釣れただろ
- 576 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 23:37:15.49 ]
- ていうかもうできてんじゃないの?確かめてないけど
- 577 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 23:39:45.15 ]
- 編集前ディレクトリと編集後ディレクトリを比較して、
変更がないファイルを編集後ディレクトリから削除する シェルスクリプトを書こうとしています。 diffをディレクトリ同士で実行し同名ファイルを探し その同名ファイルをdiffし返値が空なら削除という操作を 再帰的に階層を掘って実行すれば良いと思うのですが、 どうも何から書けばいいのか詰まってしまいました。 奇特な方居ましたらアドバイスお願いします。
- 578 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/16(金) 23:45:20.44 ]
- >>577
まず、man diffをちゃんと嫁
- 579 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/17(土) 00:14:42.67 ]
- >>578
オプションよく読んでいませんでした。 読んで出直してきます。ありがとうございました。
- 580 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/17(土) 05:25:42.88 ]
- >>577
目的に対する作業の方法が間違ってる気がする。 何のために「編集前ディレクトリと編集後ディレクトリを比較して、 変更がないファイルを編集後ディレクトリから削除する」のか を書いた方が、適切な答えが帰ってくると思う。
- 581 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/17(土) 07:12:42.07 ]
- >>577
ひな形っぽいもの。階層が一つだけだからヒントにしかならんだろうけど。変数は出鱈目。 やりたいことのイメージは、こんなもんでしょ? # mkdir /tmp/mae # mkdir /tmp/ato # MAE=/tmp/mae # ATO=/tmp/ato # # touch $MAE/aaa # touch $MAE/bbb # cp -p $MAE/aaa $ATO/ # echo hoge > $ATO/bbb # # cd $ATO # for ii in `ls` > do > [ -f $MAE/$ii ] && diff $ii $MAE > /dev/null 2>&1 > [ $? = 0 ] && rm $ii > done # # ll $ATO bbb ちなみに HP-UX で検証。 ls > tmp.txt して while read LINE; do〜done < tmp.txt とか LINE=`head $NUMBER tmp.txt | tail -1` でも目的だけは達成できる感じ。
- 582 名前:526 mailto:sage [2012/03/17(土) 07:30:38.91 ]
- >>572 さんありがとうございます。/bin/sh命令のみですね。
これで提出します。
- 583 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/17(土) 15:36:57.64 ]
- >>572
こんなバカみたいな総当たりはダメだって言われちゃいました もっと数学的な解法をアルゴリズム化したものでないとダメです 結果が正しければいいってレベルじゃないんです 100万とか1000万とか、それ位大きな値になると、ちっとも終わらないじゃないですか 期限は今日の16:40までとします くれぐれもよろしくお願いします
- 584 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/17(土) 16:12:07.29 ]
- >>583
できたよ。100万でも1000万でも、正しく実行すればすぐ終るよ。 #!/bin/sh while :; do echo -n 'Enter GCM = '; read GCM for i in "$@"; do [ `expr "$i" % "$GCM"` != 0 ] && { echo 'Try again'; continue 2; } done; break; done echo GCM = "$GCM" while :; do echo -n 'Enter LCM = '; read LCM for i in "$@"; do [ `expr "$LCM" % "$i"` != 0 ] && { echo 'Try again'; continue 2; } done; break; done echo LCM = "$LCM"
- 585 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/17(土) 22:26:32.20 ]
- >>577
LANG=C diff -qrs a b の出力結果でなんとかする というかバージョン管理システムを使うのが良い気がする
- 586 名前:名無しさん@お腹いっぱい。 mailto:sega [2012/03/19(月) 12:31:35.64 ]
- A=*.txt
B=$A touch $B とすると、"*.txt"というファイルが出来てしまうんですが これ$Bを展開させたいときはどうすればいいんですかね
- 587 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 12:40:39.27 ]
- >>586
本当に >>586 のとおりに実行したのなら *.txt は展開される。 展開されないのはカレントディレクトリに *.txt にマッチするファイルがないから。 すでにファイルがなければ展開しようがない。
- 588 名前:586 mailto:sage [2012/03/19(月) 12:56:05.81 ]
- >>587
ヒントありがとうございます oppai.txt がある場合⇒ oppai.txtにタッチ oppai.txt がない場合⇒ *.txt を作成 という動きになりました まーこれはこれで使い物になりませんわ
- 589 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 13:11:29.40 ]
- 存在をチェックしてからtouchすればいいじゃない。
- 590 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 13:13:49.05 ]
- >>588
もし「存在しなければ作成したくない」という意図なら、 touch -c $B で桶。
- 591 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 13:45:15.79 ]
- >>586
エスパーすると、 A=*.txt B=$A mv $A /どこか touch $B みたいなことをやりたいのでは? それなら、 A=`echo *.txt` mv $A /どこか touch $A で桶。変数はAだけでよい。
- 592 名前:586 mailto:sage [2012/03/19(月) 14:20:52.93 ]
- >>590
天才や・・・ UNIX板には天才がたくさんいる みんなありがとう
- 593 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 14:28:02.20 ]
- いや、みんなは普通だよ。
- 594 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 15:43:16.30 ]
- >>591のアホさが光るな。
- 595 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 15:45:13.28 ]
- >>586
これなんでBをはさんでるの?
- 596 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 17:56:07.30 ]
- おそらく A=*.txt で *が展開されなかったから
Bに代入し直せば再解釈されて展開されると勘違いしたのだろう
- 597 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 19:53:24.01 ]
- 結局、どこで展開されたんだろうね
- 598 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 19:56:34.87 ]
- ん? A=*.txt でも B=$A でも 変数直接代入時は展開されないよ。
touch $B みたいにクォートなしで参照した時に初めて展開される。
- 599 名前:586 mailto:sage [2012/03/19(月) 19:58:57.99 ]
- >>598
ありがとう。それだけが心残りだったんだ
- 600 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 20:04:56.95 ]
- shを作ったBourneは天才だね。
- 601 名前:名無しさん@お腹いっぱい。 [2012/03/19(月) 20:08:20.98 ]
- あのソースコードは勘弁して欲しい。
- 602 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/19(月) 21:12:40.16 ]
- ソース読んだのか あんたスゲーや
- 603 名前:名無しさん@お腹いっぱい。 [2012/03/19(月) 22:06:26.63 ]
- ソースコードつーか、これな。
ttp://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h
- 604 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/20(火) 08:01:57.14 ]
- x68000.q-e-d.net/~68user/unix/pickup?keyword=test&target=command
のサイトに、 #!/bin/sh read input if [ $input = 'q' ]; then echo QUIT fi と言うシェルスクリプトを参考に if [ "$input" = 'q' ]; then と $input をダブルクォートで囲めばよい。しかしまだ落とし穴はある。たとえば "!" を入力すると、 [: =: unexpected operator とまたしてもエラーになってしまう。これは "$input" が "!" であるため、 if [ ! = 'q' ]; then として扱われたからだ。 ってありますけれど、何度!を入力しても、 [: =: unexpected operator って表示されません。 それに、 $ test !c = 'q' ; echo $? test cd /etc = 'q' ; echo $? test: too many arguments とエラーが表示されます。 どのような解釈をすると、!cがtest cd /etcに置換されるのでしょうか?
- 605 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/20(火) 09:04:17.23 ]
- > [ ! = 'q' ]
これはそのように解釈するtestもあるから注意しろ。くらいでいいと思う。 > どのような解釈をすると、!cがtest cd /etcに置換されるのでしょうか? ヒストリ置換だろ。
- 606 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/20(火) 17:36:56.09 ]
- >>605
今の時代、そのエラーが出るshを使っている人、いるのかね?
- 607 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/20(火) 17:41:15.64 ]
- 今の時代、
[ ! = ! ] [ [ = [ ] [ ] = ] ] [ = = = ] [ -f = -f ] など、すべて文字列の比較として期待通りに動作する
- 608 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/20(火) 17:51:22.47 ]
- しかし未だに [ x"$hoge" = x"yes" ] などと書いてる人を見掛けるな
#!/bin/bashとか書いてるのに
- 609 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/20(火) 19:57:58.15 ]
- スクリプトインジェクション対応だよ
- 610 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/20(火) 21:45:56.60 ]
- [ "$hoge" = yes ] だとして具体的にどうインジェクトするんだよ
- 611 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/20(火) 23:34:08.60 ]
- >>610
- 612 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/21(水) 09:04:25.40 ]
- >>611
どうインジェクションするか解説お願いします
- 613 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/21(水) 10:08:32.37 ]
- hoge=']; /bin/sh;'
- 614 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/21(水) 10:47:17.62 ]
- ってゆーか、こういう場合は
case "$hoge" in yes) ...;; esac って書くよね、ふつー。[Yy][Ee][Ss] なんかに変えるのも簡単だし。
- 615 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/21(水) 11:14:27.91 ]
- >>613
>>610はダブルクオートで囲ってるから、[コマンドの第一引数として$hogeの中身が渡るんで、そのhogeの値はそのまま[コマンドが解釈する。 どうあがいてもインジェクションなんて無理だと思うんだが。
- 616 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/21(水) 11:26:14.79 ]
- てきとーに言ったんだろ。
もうカンベンしてやれ。
- 617 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/21(水) 12:19:06.39 ]
- 本人乙
- 618 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/21(水) 13:26:55.78 ]
- 違うよ。
- 619 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/21(水) 13:38:09.35 ]
- 最近のJavaScriptのようにeval使いまくりで威張る奴か。
- 620 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/21(水) 14:28:05.05 ]
- >>619
座布団
- 621 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/03/21(水) 15:37:01.15 ]
- 全部持ってって〜
|

|