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 で。
852 名前:名無しさん@お腹いっぱい。 [2012/05/18(金) 05:23:42.76 ] v7shについて色々調べてるのですがどうしても関数を使用しようとすると test.sh: syntax error at line 2: `(' unexpected とエラーが出てきて使用できません。空白、頭にfunctionを付ける等いろいろ試してみましたがやはり変わらず・・・ UNIX version 7の頃のshには関数がないということでしょうか?
853 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 05:27:04.29 ] sage忘れました。申し訳ないです。
854 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 06:51:13.40 ] >>852 シェル関数はないよ。 代用として、シェル関数にしたい内容をシェル変数に入れて、その変数を実行する。 func='ls -l' $func で ls -l が実行される。引数を渡したい時は工夫して。
855 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 07:00:59.45 ] >>852 あんまり役に立たないかも知れないですが、無いと思います。 参考までに 1. Bourne Shell Tutorial www.grymoire.com/Unix/Sh.html The original version of the Bourne shell didn't have functions. If you wanted to perform an operation more than once, you either had to duplicate the code, or create a new shell script. 2. Linux におけるシェルの進化 www.ibm.com/developerworks/jp/linux/library/l-linux-shells/?cmp=dw&cpb=dwlin&ct=dwrss&cr=dwrss&ccy=jp&csr=012012 ただし、関数を定義する機能は欠けていました。 3. 知っている限りでは、ここが一番情報が多い traditional Bourne shell family / history and development www.in-ulm.de/~mascheck/bourne/ The Variants A summary of the most important changes ? Version 7 (1979) control structures, cmd substitution, () and {}, arbitrary variable names, trap, eval, special parameter substitutions, case ? System III (1981) #, [!...], colon parameter substitution, set -- ? SVR1 (1983) shift n ? SVR2 (1984) functions, built-ins: unset echo type, redirection for builtins 4. 3の下の方のSource codeにある、Nikola Vladov のマニュアルで、 man v7sh BUGS Coexists with but doesn't understand shell functions. 5. FreeBSD Portsはよく分かりませんが、 v7sh FreeBSD www.freebsdsoftware.org/shells/v7sh.html functions aren't supported and command line input is not 8 bit clean
856 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 15:41:41.74 ] >>854 >>855 ありがとうございます!やっぱりなかったんですね case文で;;を使用してもcase文抜けられないのも仕様なのかなぁ マニュアル読んだら使用できそうではあったんですけども・・・一応使用したテストスクリプト上げておきます。 #!/usr/local/bin/v7sh case $1 in a) echo "A!!" ;; b) echo "B!!" ;; c|d) echo "C or D" ;; [e-h]) echo "E kara H" ;; *) echo "NANIKORE?" ;; esac で結果が以下のようになりました。 $ test.sh a A!! NANIKORE?
857 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 16:34:52.98 ] 仕様じゃね? ソースあるんだから読んで解析してくれ 読みにくいってレベルじゃないけど
858 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 20:07:10.23 ] >>856 なんででしょうね? そのままコピペしてv7shで試しましたが、こちらでは期待通りの動作でした。 $ ./v7case.sh a A!! $
859 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/18(金) 22:31:03.13 ] >>858 謎ですね・・・v7shなんて過去のものですから大差があるとは考えにくいですし 通常のコマンド待ち状態で ;; を打つとエラーが出ますから case内でしか特殊な意味を持たないと思われるんですけどね・・・
860 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 17:44:12.51 ] msysgit(windows版git)付属のbashでログイン時のディレクトリをホーム以外にしたいんだけど、どうしたらいい? 例えば、$HOME/work/hogeでいつも作業するのでbash起動時にそこにいて欲しい。 $HOMEを書きかえると他にも影響があり過ぎるので別の方法教えてください。 適切なスレが見つからなかったので、誘導して。
861 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 18:49:28.23 ] etc/profileの最後にcd ~/work/hoge?
862 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 20:59:36.08 ] そんな単純なことでよかったのか... 恥ずかしいー
863 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/24(木) 21:28:32.29 ] $HOME/.bash_profileの方が良いんじゃ?
864 名前:名無しさん@お腹いっぱい。 mailto:sage [2012/05/25(金) 02:08:36.57 ] かなり遅れましたが>>834 です -xをつけて実行してみたところ、 # bash -x secrets.sh + echo -n : Invalid argument: apks.txt + echo -n : Invalid argument: output.txt secrets.sh: line 5: syntax error near unexpected toke' `do 'ecrets.sh: line 5: `do 以下のようになりました。