1 名前:名無しさん@お腹いっぱい。 [2009/07/01(水) 09:42:48 ] シェルスクリプトの総合スレです。 スクリプトのお勉強・自慢・腕試しなどにどうぞ。 まずは注意点、リンク、地鎮祭など(>>1-6 くらい)をご覧ください。 □お約束 ・特記なき場合は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 でトレースしましょう。 前スレ シェルスクリプト総合 その14 pc12.2ch.net/test/read.cgi/unix/1233179688/
59 名前:amatsuno ◆y1bfd53lWE [2009/07/13(月) 13:02:32 ] 質問させて下さい。 AIX(ksh)で、以下を行おうとしています。 コマンドなどわかりましたら、教えて下さい。 やりたいこと) csvファイルを読み込んで、データを抜きだす。 csvファイル) A_table,3,DEF_ind,JKL_ind,TUV_ind,out.txt のように書かれたリストが複数行有ります。 出力ルール) csvファイルの第1カラム目に書かれたテーブルを見て、 その中から該当の文字列を呼び出します。 該当の文字列は、 第2カラムで指定された数字分、第3カラム目から先のカラムに書かれたものになります。 (上記の場合、第2カラム目が3なので、第3カラム目から第5カラム目までとなります) そしてその出力を最終カラムで指定したファイルに出力します。 上記の出力結果は、 DEF_ind JKL_ind TUV_ind をout.txtに出力します。 すいませんが、 わかるかた、宜しくお願いいたします。
60 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/13(月) 13:21:29 ] >>59 ほれ、 awk -F, '$1=="A_table"{out=$($2+3);for(i=1;i<=$2;i++)print $(i+2)>>out}'
61 名前:amatsuno ◆y1bfd53lWE [2009/07/13(月) 13:47:11 ] >60 ありがとうございます。 ただこれを実行したところ、1箇所だけ問題があるようで、 3カラム目から先が永遠に出力されてしまい、ひたすら空白行が出ます。 第2カラム目で指定しらカラム数で止めるには、 どうすれば良いのでしょうか? たびたびで申し訳ございませんが、宜しくお願いいたします。
62 名前:amatsuno ◆y1bfd53lWE [2009/07/13(月) 13:51:46 ] >60 もうしわけございません。 61はデータ側の問題でした。 スクリプトは完璧でした。 誠に申し訳ございません。 ありがとうございました。
63 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/13(月) 14:02:13 ] 不正なデータとして、 第2カラムが数値以外だと、ループがおかしくなるな。 そういう場合でも安全なように、 for(i=1;i<=$2;i++) を、 for(i=1;i<=$2+0;i++) にしておいた方がいいかも。
64 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/13(月) 14:13:42 ] >>59 >>60 awkはシェルにあらず。 シェルスレならシェルで解決。 #!/bin/sh IFS=, while read line do set $line case $1 in A_table):;;*)continue;;esac shift max=$1 shift eval out=?$$# i=1 while [ $i -le $max ]; do echo "$1" shift i=`expr $i + 1` done > "$out" done
65 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/13(月) 14:19:55 ] awkも可だよ。
66 名前:amatsuno ◆y1bfd53lWE [2009/07/13(月) 14:33:33 ] >>64 このawkを含んだ処理のkshは、 1.リストからデータの抜き出し 2.抜いたデータのインデックス検索 3.インデックス検索でたデータのバックアップ 4.バックアップデータのソート になります。 その一部でしたので、 ここで質問させていただきました。
67 名前:名無しさん@お腹いっぱい。 [2009/07/13(月) 23:23:55 ] 質問させてください。 テキストファイルの最後からN行を削除するにはどうしたらいいでしょうか? 例えばa.txtの最後から2行を削除して保存したいです。よろしくお願いします。
68 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/13(月) 23:36:53 ] >>67 head -n `expr ?`wc -l < a.txt?` - 2` a.txt
69 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/13(月) 23:39:34 ] >>68 「保存」してねえぞ (echo '$-1,$d'; echo wq) | ed -s a.txt
70 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/13(月) 23:41:10 ] >>68 全角?はなんのおまじない?
71 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/13(月) 23:43:51 ] >>69 printfコマンドって、使えない環境もあるのかな。 あと「wq」は使えなくて「w」と「q」の2コマンドなら OKという環境はよくあるね。
72 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/13(月) 23:44:10 ] >>69 ありがとうございます。 でも結構難しいですね。もうちょっと簡単に短くできませんでしたっけ?
73 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/14(火) 00:47:11 ] 度々すみません。 たしかheadで出来たと思うのですが a.txtの最後から2行を削除して保存。とか出来ませんでしたっけ?
74 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/14(火) 01:09:23 ] 保存はともかく、 末尾の指定行数をカットできるのはGNUのおせっかいheadくらいじゃないか
75 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/14(火) 07:38:51 ] >>70 半角バックスラッシュが?に化ける模様。 そう解釈すれば >>68 が正解。
76 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/14(火) 08:06:31 ] Safari@Macかね?
77 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/14(火) 16:19:50 ] >>71 >printfコマンドって、使えない環境もあるのかな。 SunOS4 とか。
78 名前:amatsuno ◆y1bfd53lWE [2009/07/14(火) 17:52:11 ] この前はありがとうございました。 もうひとつ教えて下さい。 前回教えていただきましたリストを1行にまとめる方法を教えて下さい。 変更前のファイル(b_ind)の中身);0 DEF_ind JKL_ind TUV_ind 変更後のファイル(a_ind)の中身); DEF_ind,JKL_ind,TUV_ind 上記では3行ですが、実際は1-8のいずれかの行数となります。 このような複数行をカンマ区切りの1行にしたいのです。 DBからバックアップを取る時の指定のインデックスのため、 カンマ区切りの1行記載が必要となりました。 すいませんが知っている方、 宜しくお願いいたします。
79 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/14(火) 18:01:02 ] >>78 >>60 のスクリプトをちょっと修正すればいいだけだよ。 awk -F, '$1=="A_table"{out=$($2+3);for(i=1;i<$2+0;i++){printf $(i+2) ",">>out}print $(i+2)>>out}'
80 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/14(火) 19:17:06 ] >>78-79 awkはシェルにあらず。 シェルスレならシェルで解決。 #!/bin/sh IFS=, while read line do set $line case $1 in A_table):;;*)continue;;esac shift max=$1 shift eval out='$'$# i=1 while [ $i -lt $max ]; do echo -n "$1", shift i=`expr $i + 1` done > "$out" echo "$1" >> "$out" done
81 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/14(火) 21:01:22 ] 経験的にsedとawkはrcスクリプトで使われてるのでOK
82 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/14(火) 21:16:41 ] 経験的にイマドキのOSはrcスクリプト自体を使わないのでNG
83 名前:amatsuno ◆y1bfd53lWE [2009/07/15(水) 09:40:43 ] >>79 できました。 ありがとうございます。
84 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/15(水) 16:09:35 ] >>82 テンプレ読み直してこい あまりキチガイめいたこと言うなよ
85 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/16(木) 00:53:20 ] #!/bin/rc もベル研純正シェル
86 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/17(金) 21:39:49 ] >>34 awkはシェルにあらず。 シェルスレならシェルで解決。 #!/bin/bash n=$((-$1)) shift for file in "$@"; { i=1 while IFS= read -r line do ((i++ == n)) && { echo "$line" break } done < "$file" }
87 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/17(金) 21:52:56 ] bash使うなよ
88 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/17(金) 22:25:33 ] bashはLinux板でやれ
89 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/17(金) 22:39:05 ] >>87-88 bashに過剰反応するな。 kshでもzshでも動くから、bash依存とまでは言えない。 #!/bin/ksh n=$((- $1)) shift for file in "$@"; { i=1 while IFS= read -r line do ((i++ == n)) && { echo "$line" break } done < "$file" }
90 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/18(土) 00:36:24 ] POSIX準拠だから#!/bin/shでもいいはず、といってみる
91 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/18(土) 01:40:37 ] /bin/shにはPOSIX shellを置く、なんてことはPOSIXに書いてない
92 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/21(火) 13:50:12 ] シェルスクリプトでドラッグアンドドロップできる?
93 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/21(火) 14:12:21 ] >>92 目的は何?
94 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/21(火) 14:32:02 ] >>93 目的がわかっても答えられないのに逆質すんな。
95 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/21(火) 14:38:10 ] あぁ、釣りか。 つられちゃったw てへっ?☆
96 名前:92 mailto:sage [2009/07/21(火) 15:19:06 ] ちょっと思いついたので聞いてみただけです。目的はありません。
97 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 01:01:27 ] シェルスクリプトで手マンできますか?
98 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 01:03:03 ] >>97 目的は何?
99 名前:sage [2009/07/22(水) 15:28:06 ] 質問させてください。 標準入力から入力した値を処理するシェルスクリプト(Bシェル)を作成しています。 入力値に\(バックスラッシュ)が入る可能性があるので、 readのオプションに「-r」を付けて、入力値をすべて受け取れるようにしようと思ったのですが、 「-r」オプションをつけると「英数字以外の文字が使用されています。」というメッセージが出力され オプションが使えないようです。 例) OS:Solaris10 $ cat aaa.sh #!/bin/sh read aaa echo $aaa read -r ppp echo $ppp $ $ ./aaa.sh III ←コマンドラインから入力 III ←出力 ./aaa.sh: -r: 英数字以外の文字が使用されています。 ←オプションを付けたreadに対してのエラーメッセージ 質問ですが、Bシェルでは、readに「-r」オプションは使えないのでしょうか? (manを見る限り使えないとは言ってないように思われたのですが) もし、使えないとすると、何か他に方法をご教授頂けないでしょうか? (出来る限りBシェルでしたいと考えているのでこのコマンドだけkshで実行するなどでしょうか) よろしくお願いします。
100 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 15:45:09 ] どうみても使えるとは書いていませんが、何を見ているのでしょうか? docs.sun.com/app/docs/doc/816-5165/sh-1?l=Ja&a=view
101 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 16:14:27 ] >>99 Solarisの/bin/shのreadは、-rには対応していません。 bashか、zshか、kshを使いましょう。
102 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 16:18:57 ] >>99 どうしても /bin/sh だけでやりたい場合、 read -r aaa の代わりに、 aaa=`head -1` とやる方法がある。
103 名前:sage [2009/07/22(水) 16:32:21 ] ありがとうございます。 >>100 -r 使えないんですね。 docs.sun.com/app/docs/doc/819-1210/read-1?a=view を見て、標準のオプションなのかなと思い込んでました。 >>101 やっぱり他のシェルにするべきなのか 検討します。 >>102 その様な方法もあるんですね。勉強になります。 今回使用できるのか検討します。
104 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 16:32:27 ] なるほどねえ
105 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 16:34:43 ] >>103 > docs.sun.com/app/docs/doc/819-1210/read-1?a=view sh のとこに -r 書いてないじゃん。
106 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 16:39:22 ] docs.sun.com に書いてあるのは、外部コマンド版の /usr/bin/readじゃん。 中身はkshスクリプト。 これって、結局シェル変数が親プロセスに渡らないから意味ないし、 外部コマンド版の /usr/bin/cd と並んで意味不明コマンドのひとつなんだよな。
107 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 16:40:44 ] >>106 いや、/usr/bin/read 以外にシェルの内部コマンドについても書いてあるよ。
108 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 16:44:04 ] >>107 そんなことは知ってるよ。 そうじゃなくて、/usr/bin/readのアフォさ加減について話題を振りたいわけだが。
109 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 16:46:03 ] >>106 の書き方じゃ知ってたかどうかわからんよ。
110 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 16:50:18 ] 質問者の >>99 が、shの内部コマンドのreadは使えなくても、 shから/usr/bin/readを呼び出せば使える、と勘違いしていた可能性もあるわな。
111 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 17:04:48 ] >>108 POSIX標準では、 ・$0 "$@"で実装できるからシステムの負担にはならない ・いい使い方があるかも知れない ・対称性のため などと存在理由を説明しています。
112 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 17:26:25 ] >>111 >・対称性のため なら、なぜ、eval exit export wait などについては 外部コマンド版がないのか合理的な説明をお願いします。
113 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 17:35:26 ] POSIX仕様には書いてありません。
114 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 17:41:28 ] POSIX標準がそう決めた理由を聞いているのに、 「POSIX仕様には書いてありません」は循環論法。
115 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 17:53:32 ] >>111 に理由聞いてもしょうがないんじゃね。
116 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 17:56:28 ] 使えない外部コマンドがあるくせに、 Solarisでは /usr/bin/[ が削除されてるんだよなぁ。 ほんとわけわからん。
117 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 17:57:33 ] >>116 使いたいの?
118 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 17:59:48 ] v7shをもってきて使いたくなるかもしれないじゃないか
119 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 18:16:31 ] >>117 使いたいかどうかじゃなくて、 /usr/bin/[ は、呼び出せば動作する。 一方、/usr/bin/read とか、/usr/bin/umask とかは readや umaskの動作はしない。 動作するものを削除して、動作しないものを配置することの馬鹿さを言ってるんだが。
120 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 18:56:40 ] あってもなくても害がないならどっちでもいいじゃん。 馬鹿と非難するほどのことでもないと思うけど。
121 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 19:39:41 ] これ、正しいか? docs.sun.com/app/docs/doc/819-1210/read-1?a=view > 例 1 read コマンドの例 > > 以下に示す /usr/bin/read の例は、入力ファイルの内容を、各行の先頭フィールドを最後尾に 移動して出力するものです。 > example% while read -r xx yy > do > printf "%s %s\n" "$yy" "$xx" > done < input_file
122 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/22(水) 20:12:29 ] マニュアルのバグだね。send-prしといてね。
123 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 03:48:55 ] AIX5.2,5.3で2Gを超えるディレクトリをtarで固めるにはどうすればいいのでしょうか?
124 名前:名無しさん@お腹いっぱい。 mailto:SAGE [2009/07/23(木) 15:41:48 ] man tarとすると、ustarヘッダーの書式を使用すると、ファイルサイズを最大8GBにできます。 とあるのですが、具体的にどうすれば2GB以上のファイルをtarで扱えるようになるのでしょうか?
125 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 17:05:40 ] まず、適切な質問の方法を学びましょう。
126 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 17:05:54 ] これは「シェルスクリプト」なのか ? まぁとりあえずAIX 5.2では可能らしい ttp://d.hatena.ne.jp/aix_memo/20090202/1233564844 US-TARかどうかは適当に固めたものを用意してcatで確認したらいい ustarの文字が入ってたらUS-TARの形式 ほかに ファイルシステムの問題かも知れない。何使ってる ? /tmpの残り容量の問題かも知れない。十分ある ?
127 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 17:52:21 ] >>125 まず、適切な回答の方法を学びましょう。 わからないなら黙っていましょう。
128 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 17:58:09 ] AIXスレ行け。
129 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 18:06:20 ] >>127 クズは黙ってろ。
130 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 18:15:49 ] >>123 の質問がとくに不適切とも不備な質問とも思えない。 実際にAIXで2GB超のファイルをtarで固めた経験がある者なら >>123 を見ただけで即答できるはずだ。 質問の仕方に注文を付けたり、さらに「○○の結果は?」とか追加情報を求める回答者は その追加情報があっても答えられないダメ回答者。
131 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 18:17:42 ] おかしな煽り野郎が張り付いている模様です。 しばらく放置しましょう。てか、元の質問がシェルスクリプトの質問じゃねぇし。
132 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 18:18:36 ] シェルスクリプトスレで質問するのは適切ではない。言い訳してないで。消えろ。
133 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 18:20:43 ] その tarを シェルスクリプトの中で使う予定なんですぅ、、
134 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 18:22:24 ] 言い訳してないで。消えろ。カス。
135 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 18:27:49 ] AIX5.2とAIX5.3です。 以下のようなシェルを発行したところ、 dir以下に2GBを越えるファイルがあるとエラーになります。 どのように修正すればよろしいか? #!/bin/sh tar cvf hoge.tar dir
136 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 18:36:21 ] 詰まらん。消えろ。クズ。
137 名前:名無しさん@お腹いっぱい。 mailto:SAGE [2009/07/23(木) 20:43:57 ] >>126 ありがとうございます。 USTARの文字ははいっていました。 TMPには空きがあります。 ファイルシステムについては、よくわかりません。
138 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/23(木) 21:51:51 ] >>137 2G制限ならulimitを確認。 8G制限はどうにもならないのでGNU tarでも使ったら? で「シェルスクリプトで必要だから」という理由で環境依存の 質問をシェルスクリプト一般のスレでやっても煙たがられるだけ というありがたい指摘を、そろそろ受けいれたらどうかな?
139 名前:名無しさん@お腹いっぱい。 mailto:SAGE [2009/07/23(木) 23:39:41 ] >>138 ありがとうございます。 今帰りなので、週末に調べてみます。
140 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/26(日) 07:59:26 ] ulimitはunlimitedでした。引続きお願いします。
141 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/29(水) 12:57:14 ] スレ違いだと何度いったらわかるんだ。池沼。消えろ。
142 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/31(金) 20:12:20 ] すみません、お力を貸してください。 aaa.txtの中身が、 aa\n bb\n cc\n として、これをシェルスクリプトで unko=$(cat aaa.txt) echo ${unko} とすると、 aa bb cc と改行がスペースに置換されていますが、これを改行のまま格納することはできないでしょうか。 上記はあまりいい例ではないので「cat aaa.txt」でいいだろ、と思われるかと思いますが。。。 ftp -nvとかの標準出力を一旦変数に入れといて、後から結果解析及び出力したく、しかも、諸事情でtmpファイル(←すみません、ちんぽファイルではなくて一時ファイルです)を作るのはNGなので、なんとか改行をスペースに置換させないで変数に入れて実現したいのです。 どなたか、ご教示お願いいたします。OSは、HP-UX、Bashです。よろしくお願いします。
143 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/07/31(金) 20:48:07 ] >>142 echo "$unko"
144 名前:名無しさん@お腹いっぱい。 [2009/08/01(土) 23:50:17 ] シェルを2つ以上コマンドで開くことは出来る? 今はパネルからクリックしてるので大変。 でも、コマンド売っても出てこない>< ちなみに端末エルミネーターはBASH。
145 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/01(土) 23:52:35 ] はいはい 15点
146 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/02(日) 05:00:19 ] >>142 配列(パイオツじゃないよ)使うんじゃだめなの?
147 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/02(日) 09:40:59 ] >>146 >>143
148 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/02(日) 13:13:29 ] >>142 シェル変数の展開時は、ダブルクォートでくくるのが原則。 それで、改行もスペースもそのまま保存される。 逆に、単純に展開する場合は ${ } でくくる必要はない。
149 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/03(月) 00:52:02 ] . や source で起動されても、自分の名前を取れる方法ありますか? 当然$0だとだめなわけですが [root@miu tmp]# cat a.sh #!/bin/sh echo $0 [root@miu tmp]# source a.sh bash [root@miu tmp]#
150 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/03(月) 01:39:05 ] . や source は起動されてないし
151 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/03(月) 02:40:17 ] そこをなんとか・・
152 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/03(月) 04:37:49 ] bash依存 $ echo 'echo $BASH_SOURCE' > /tmp/t.sh $ . /tmp/t.sh /tmp/t.sh
153 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/03(月) 06:26:10 ] >>152 bash3以降依存だね。bash2だと動作しない。
154 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/03(月) 07:19:14 ] >>149 先頭で自分の名前を変数に代入すれば?
155 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/03(月) 07:24:49 ] >>154 全然解決になりません。 同じスクリプトを複数のファイル名でハードリンクしていて、 呼ばれた名前によって動作を切替えたいので。
156 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/03(月) 07:28:15 ] もう $BASH_VERSION チェックして $BASH_SOURCE 使えよ。
157 名前:名無しさん@お腹いっぱい。 [2009/08/03(月) 08:19:17 ] そもそも.でもsourceでも名前わかってなきゃ呼べないよね 呼べるってことは名前わかってるじゃん あほじゃないの? $_とかでもいいんじゃないの?
158 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/03(月) 08:39:57 ] >>157 惜しいけど、 hoge=file source $hoge みたいに、変数経由で呼ぶと、 $_ では名前を取得できないから NG。
159 名前:名無しさん@お腹いっぱい。 mailto:sage [2009/08/03(月) 08:43:04 ] >>157 シェル依存。 ashとかでは、sourceファイル内一発目の $_ は、$0 と同じ値になってる。よって不可。