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/
118 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/25(日) 06:28:13 ] >>102 単に興味本位で聞くけどsh-posixとkshを比較して 実際に機能として違う部分てどんなところがあるの?
119 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/26(月) 18:34:31 ] すごく久しぶりに man tcsh してみたのだが。 あれ、"THE T IN TCSH" なんて項目、昔あったっけ? turbo csh じゃないじゃん > 昔俺にそう教えた奴
120 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/26(月) 18:41:12 ] Tenex CSHの略だと思っていたが、Tenex & Tops-20だったんだな。
121 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/27(火) 00:44:41 ] TOPS-20 ねぇ。command line editing が欲しくてcshからtcshに移ったが、 それまでは、fep 使ってました。bash は、なじめんな。 今は、zsh 派です。
122 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/27(火) 04:53:35 ] >>118 102とは別人だけど、kshはksh88とksh93で非常に違う。 とくに後者はperlに遜色ないほどの汎用言語になっている。 kshはbashと同じくshベースということで、 bashがkshから採り入れた機能もけっこうある。ローカル変数とか
123 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/27(火) 17:22:33 ] >>119 え?違うんだ、知らなかった
124 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/27(火) 22:13:24 ] kshといえばwkshで一度でいいから遊んでみたかった。 もうwのないkshしかないからなぁ・・・
125 名前:名無しさん@お腹いっぱい。 [2007/02/27(火) 22:45:55 ] viで編集中は日本語のメッセージが正しく表示されていたのですが、シェルスクリプトを実行するとメッセージが文字化けします。どうすればよいですか。
126 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/27(火) 22:49:25 ] viが自動認識して処理してる? nkf -e < script nkf -j < script nkf -s < script nkf -w < script で化けないパターンを探してそれに置き換える。
127 名前:名無しさん@お腹いっぱい。 [2007/02/27(火) 22:51:13 ] >>125 その vi の実体は、賢い vi で、 シェルの ENV がついていけてないとか。
128 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/28(水) 00:25:54 ] Cシェル、Oracle10gで exp 〜 query\"where column_name in\( select col from tableB \) \" みたくqueryパラメータで副照会できないようなんで exp 〜 query\"where column_name in\( $COLUMN_NAMES \) \" なんて具合に変数を埋め込みたい。 シェル変数が展開されてからexportに渡されるようにする方法ないかな?
129 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/28(水) 00:54:58 ] >>126 nkf -g が無いバージョンかな?
130 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/02/28(水) 01:00:16 ] おお、そんなものが。 nkf -wができることに最近気づいたくらいアップデートしてなかったんで。
131 名前:名無しさん@お腹いっぱい。 [2007/02/28(水) 09:20:31 ] 浜田マキ子って人のジャーナル見てみなよ。 中国の恐さにぞっとすること請け合い。 あいつら本気で日本を侵略する気だ。 そして、手下はやはり立命館?
132 名前:118 mailto:sage [2007/03/01(木) 04:39:27 ] >>122 すんません書き漏れです 知りたいのはsh-posixとksh88の機能差です kshにksh88とksh93があってかなり違うってのは知ってるというか kshの情報には大抵2つのバージョンの比較が併記されてるもんだし ただsh-posixとksh88の比較は見たことがないし違いも見つけられなかったもんで
133 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/01(木) 06:28:17 ] >>132 ・ パターンマッチングがegrep相当に拡張 ・ [[ ほげ ]] (中身をメタキャラ解釈しないtestのようなもの) ・ 配列が使えた ・ emacs風コマンドライン編集 ってとこか。なおksh93はksh88と挙動が違ったりバグが直されたりしてるし、 ksh88とpdkshでも機能に違いがあるので、 ksh88で動けば他のkshで動作するとは限らない
134 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/01(木) 22:50:40 ] ksh に限らないが、バージョン依存の対応は本当に面倒だな。
135 名前:名無しさん@お腹いっぱい。 [2007/03/02(金) 00:10:52 ] こういうデータを、 ---- yes ・・・・ ・・・ ・・・・・ IPアドレス xxx.xxx.xx.54 ---- no ・・・・ ・・・・・ IPアドレス xxx.xxx.xx.123 ---- yes ・・・・・・・・・ ・・・・・ IPアドレス xxx.xxx.xx.23 こういうふうに加工したいのですが、 yes,xxx.xxx.xx.54 no,xxx.xxx.xx.123 yes,xxx.xxx.xx.23 ・・・・・・・・・ ・・・・・ の部分は2行のときもあるし10行のときもあります。
136 名前:135 [2007/03/02(金) 00:14:33 ] 最初の ---- と IPアドレス という文字をうまく関連付ければ 加工可能とは思うのですが、 具体的にどうしたらいいのかよくわかりません。 最初の ---- を見つけたら その次の「IPアドレス」という文字列を捕まえて xxx.xxx.xx.123を確保する、 という形でしょうか。 うまい方法があればヒントをいただけますか? cat、more、grep、cut、sedなど一般的なコマンドは習得しています。
137 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 00:19:45 ] 1行1レコードじゃないときは めんどくさいから perl 使っちゃうな。
138 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 00:34:22 ] csplit input '/^----$/' '{*}' for file in xx*; do echo `sed -n '2p;${s/.* //;p}' $file`; done csplitってPOSIX標準だっけ?
139 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 00:34:30 ] 俺もperlかawkに1票。適材適所ってやつ。
140 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 01:17:00 ] awkで RSに---を入れてやればいいじゃない
141 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 01:52:51 ] ここはあえてCで
142 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 02:52:27 ] >>141 書いてみて
143 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 08:40:46 ] >>135 俺も awk に一票だが、 最初と最後をどうにかすれば grep と sed だけでもできそう。 grep -C 1 -x -e ---- | sed .... こんな感じで。
144 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 08:56:59 ] 143 | sed -n ' N; N; N; s/¥(yes¥|no¥)¥n/¥1 /; s/----¥n//; s/--¥n//; s/IPアドレス //; p' 改行ってどこのsedでも¥nと書けるのだっけ?
145 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 09:03:20 ] あー、最後の部分がきちんと処理できないな。
146 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 09:10:43 ] sed -n ' /¥(yes¥|no¥)/h; /IPアドレス /{ H; x; s/¥(yes¥|no¥)¥n/¥1/; s/IPアドレス /,/; p }' input どだっ!?
147 名前:135 [2007/03/02(金) 13:43:23 ] みなさんありがとうございます。 僕はまだレベルが低いですし awkは(難しくて)使えないので >>143 さんの grep -C オプションでやってみよと思います。
148 名前:名無しさん@お腹いっぱい。 [2007/03/02(金) 15:27:32 ] 変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするにはどうすればいいですか。
149 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 15:32:33 ] >>148 ちょっと、質問が複数の意味に取れるけど、 ls > "$1"/"$2" ってことか?
150 名前:148 [2007/03/02(金) 16:42:33 ] >>149 できたっす。バックスラッシュいれてたっす。
151 名前:名無しさん@お腹いっぱい。 [2007/03/02(金) 17:25:16 ] 変数1で指定したディレクトリに変数2のファイル名でlsの結果をリダイレクトするときに、すでにファイルが存在する場合、上書き確認のメッセージを出して処理を分岐させるにはどうすればいいですか。
152 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 17:27:36 ] test -f ファイル [ -f ファイル ]
153 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 18:47:44 ] その調子で、1から10まで全部ここで聞くのか?
154 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 19:02:57 ] シェルスクリプトの犬小屋でも作るか?
155 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 19:07:44 ] いらね。
156 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 21:48:30 ] >>152 便乗質問ですが、よく、ファイルがあるかどうかを判断するのに、 test -fを使えと言われるのですが、実行しても何も起こりません。 何か設定が必要なのでしょうか?
157 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 21:58:24 ] test -f hoge && echo found
158 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 22:18:29 ] 「ファイルがあるかどうか」なら、test -fじゃなく、test -e使え。 test -fだとレギュラーファイル以外はないものと判定されるぞ。 (デバイスファイルとか、broken symlinkとか、socketとか)
159 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 22:36:23 ] >>158 だめーっ。Bourneではtest -eは使えなーい。test -fが定石。
160 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 22:40:52 ] if exist %1
161 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 23:04:59 ] >>156 何かが起こるように書けばいい。 test を実行しただけで何も起こらないのは当たり前。
162 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/02(金) 23:15:29 ] Bourne Shellのif文で、ifの次に来るのはコマンド(列) test...も [ ... ] もコマンドを実行してる。 実行した結果のステータスコードで分岐するだけ。
163 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 00:09:47 ] >>159 >>162 の通り、testはシェルの内部コマンドではない。Bourneかどうかは関係ない。 まあそれはそれとして、autoconf infoの"Limitations of Builtins"から抜粋。 POSIXも信用せずにportableにしたいならどおぞ。 ... use `test -f' or `test -r'. Do not use `test -x', because 4.3BSD does not have it. Do not use `test -e' either, because Solaris 2.5 does not have it. To test for symbolic links on systems that have them, use `test -h' rather than `test -L'; either form conforms to POSIX 1003.1-2001, but older shells like Solaris 8 `/bin/sh' support only `-h'.
164 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 00:37:34 ] うちのシェルでは内部コマンドなのだが。
165 名前:162 mailto:sage [2007/03/03(土) 01:05:35 ] >>164 そういえばそうか。シェルの実装はtestを内部コマンドとして定義しても いいんだっけか。すまん間違えた。
166 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 01:21:37 ] testは外部コマンドだから条件分岐は出来るだけcaseを使おうって話を どっかで聞いたことがあるけど、 UNIX黎明期を除けばどのシステムでもシェル組み込みコマンドとして実装されている。 ループで最頻出のコマンドが外部呼び出しじゃ実用的な速度が出ないだろうしね。
167 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 01:30:36 ] >>166 KernighanとPikeのUnix Programming Environmentにそういう記述があった希ガス。 UNIX第7版とかの時代の話だが。
168 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 07:57:52 ] 162は俺なのだが……、俺は「外部コマンド」とは書いてないぞ。
169 名前:163=165 mailto:sage [2007/03/03(土) 11:51:37 ] >>168 すまん番号間違えた。 漏れは163と165だた
170 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 12:08:23 ] >>166 適当なループ回して試してみろ。 testが内部コマンドである現在のシェルでも、 case使った方が、if [ ... ] よりも若干速いよ。 おそらく、内部コマンドとはいえ、独立したコマンドとして 内部的に実行するオーバーヘッドがtestにはかかるんだろう。 caseの場合はシェル本体が直接解釈するから オーバーヘッドはtestよりも少ないと。
171 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 14:06:00 ] >>170 釣りか天然か... 判断に苦しむ。
172 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 14:20:05 ] >>171 釣りじゃないだろ。実験してみろ。time sh -c '...' とかで計れる。 確かに caseの方がちょっと早い。
173 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 14:34:36 ] >>171 おかしなところがあるなら具体的に指摘してみればいいじゃない
174 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 14:37:35 ] だね。あと、zshだと何故か違いが顕著になる。 $ time zsh -c 'for i in `seq 1 10000`; do [ a = a ] && :; done' real 0m3.051s user 0m2.705s sys 0m0.207s $ time zsh -c 'for i in `seq 1 10000`; do case a in a);;esac; done' real 0m0.915s user 0m0.703s sys 0m0.204s ↓おまけ。[ ]の代わりに [[ ]] にすると、内部コマンドじゃなく、 直接のシェル文法になるので、早くなる。 $ time zsh -c 'for i in `seq 1 10000`; do [[ a = a ]] && :; done' real 0m1.708s user 0m1.201s sys 0m0.402s
175 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 15:41:12 ] >>173 おかしなところは推測の部分。単に実装の違いだけでしょ。 ksh(93) case 0.65 real 0.46 user 0.17 sys test 0.58 real 0.46 user 0.10 sys pdksh case 23.23 real 22.45 user 0.20 sys test 4.96 real 4.74 user 0.14 sys bash2 case 3.52 real 3.21 user 0.24 sys test 4.26 real 3.93 user 0.25 sys ash case 0.38 real 0.28 user 0.09 sys test 0.52 real 0.45 user 0.05 sys
176 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 17:55:22 ] >>175 その実装の違いを推測してるのではないか? なので、おかしくない。 ちなみに俺の環境では、kshでもtestよりcaseの方が速かったよ。
177 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 18:59:53 ] つまり、testよりcase使え、って言うテクは今でも生きてるってわけか。
178 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 20:43:22 ] bash3 [[ real 0m1.758s user 0m1.562s sys 0m0.160s bash3 case real 0m1.515s user 0m1.341s sys 0m0.150s 確かに少しだけど、case の方が速いね
179 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 20:53:55 ] >>178 いや、[[じゃなくて [ と caseを比較するという話だが。 速い順に、 case > [[ > [ となると思う。
180 名前:名無しさん@お腹いっぱい。 mailto:sage [2007/03/03(土) 21:13:01 ] >>179 あ、そうだったっけか。 bash3 [ real 0m2.388s user 0m2.042s sys 0m0.370s
181 名前:名無しさん@お腹いっぱい。 [2007/03/04(日) 21:32:58 ] Bashにおいて以下の条件で動くシェルスクリプトを書く場合、どのように書けばよいのでしょうか? ディレクトリ名とその中にあるファイルサイズが0のファイル名を出力する。 補足1:ディレクトリが特定されていない場合は、現在シェルが働いているディレクトリ名を出力する。 補足2:もし引数がディレクトリ名でない場合は、すべてのコマンドラインの引数にエラーメッセージを出力する。 補足3:ファイル名の一番最初の文字が、「.」の場合は無視するようにする。
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