トップページunix
1001コメント301KB

シェルスクリプト総合 その7

■ このスレッドは過去ログ倉庫に格納されています
0001ミスターシェル2006/09/07(木) 13:00:11
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
0034名無しさん@お腹いっぱい。2006/09/09(土) 11:24:30
>>32
/usr/xpg4/bin/id -u
0035名無しさん@お腹いっぱい。2006/09/09(土) 11:53:15
>>34
絶対PATHを決めうちすると今度はSolaris以外で動かない。
psもポータブルじゃないし、
最もポータブルなのは >>33 か?
0036名無しさん@お腹いっぱい。2006/09/09(土) 12:08:21
ポータブルという意味では>>28のほうがいいかな
0037名無しさん@お腹いっぱい。2006/09/09(土) 12:26:59
>>36
だから、ps -o user というオプションが使えない psもあるんだって。
あと、Linuxの一部では tail -1 も使えない。tail -n 1 にしないと。

よって、>>33 が最もポータブル。
0038名無しさん@お腹いっぱい。2006/09/09(土) 12:41:11
>あと、Linuxの一部では tail -1 も使えない。tail -n 1 にしないと。

マジかよ……。
たしかに引数の指定のしかたは現代的ではないけど、
過去に作られたスクリプトとの互換性とか移植性とかってのは考えないんだろうか。
0039名無しさん@お腹いっぱい。2006/09/09(土) 12:58:55
一部ってのが何を指すのかわからん
イヌックスのその辺りのコマンドは全部GNUじゃないの?
0040名無しさん@お腹いっぱい。2006/09/09(土) 13:02:43
GNU coreutilsの一部のバージョンで、tail -1形式のオプションが削除されたらしい。
0041名無しさん@お腹いっぱい。2006/09/09(土) 13:11:10
Solarisで動けばそれでいい。
0042名無しさん@お腹いっぱい。2006/09/09(土) 14:37:42
>>40
あまりに不評で戻らなかったっけ?
一部のディストリビューションで独自にやってるのかな。
0043名無しさん@お腹いっぱい。2006/09/09(土) 21:23:28
readlinkコマンドってSolarisには無いよね?
シンボリックリンクの内容をポータブルに読むにはどうすればいい?
0044名無しさん@お腹いっぱい。2006/09/10(日) 20:03:31
不可能。OOoだかmozillaだかで
ls -l "$file" | sed 's/.*-> //'
というような処理をしているのを見たことがあるけど、
当然lsの実装に依存するしファイル名が->を含んでいたら終わり。
どうしても必要ならperlを呼ぶのが一番まし。
0045名無しさん@お腹いっぱい。2006/09/11(月) 18:26:46
埋めは荒らしの一種だage荒らし!
0046名無しさん@お腹いっぱい。2006/09/11(月) 20:20:29
/var が容量80%超えたら警告メール送るようなシェルスクリプトきぼん。
もうかれこれ10回くらいこれでサーバーダウンしてます(T_T)
0047名無しさん@お腹いっぱい。2006/09/11(月) 20:39:32
>>46
dfもフォーマットがあんまりポータブルじゃないのでアレだが、
これでどうだ?


while :
do
for i in `df -k /var`; do
case $i in
[89][0-9]%|100%) df -k /var | mail omae@example.jp;;
esac
done
sleep 60
done

でも、メール送っても根本的な解決にならないよ。
0048名無しさん@お腹いっぱい。2006/09/11(月) 22:21:43
1分置きにメールが送るのかよ!!
そしてこれが /var を圧迫し、結局サーバが落ちるのだった。続く
0049名無しさん@お腹いっぱい。2006/09/11(月) 22:45:43
>>47
100%オーバーも考えたほうがいいと思う。
0050名無しさん@お腹いっぱい。2006/09/11(月) 23:18:51
snmpトラップでなんとか
0051名無しさん@お腹いっぱい。2006/09/13(水) 15:24:45
テンプレにある
xargs の -O とか find の -printOってオプションは
どういう動き?何のマニュアルなら載ってる?

AIXにものってないよ。
AIXとかソラリスにもないのに載せる必要
あるのか?


0052名無しさん@お腹いっぱい。2006/09/13(水) 15:26:51
O は知らんけど 0 なら GNU のにあるよ。
0053名無しさん@お腹いっぱい。2006/09/13(水) 15:30:12
>>51
じゃあ逆に聞くけど、(Sambaサーバとかで)「Program Files」みたいな
スペース入りのディレクトリorファイル名がバリバリに使われてる環境で、
正しく find | xargs するにはAIXではどうやってるの?

それとも問題に気づいてない?
0054名無しさん@お腹いっぱい。2006/09/13(水) 17:42:03
>>51
ttp://www.linux.or.jp/JM/html/GNU_findutils/man1/xargs.1.html
0055名無しさん@お腹いっぱい。2006/09/14(木) 00:02:07
>>51
Solarisのxargs(1)

入力データは行の集まりとして解析されます。引数は空白文字により 区切ら
れます。xargs を使って find dir -print や ls などのコマンドの出力を、
実行対象コマンドの入力とする場合、ファイル名に空白文字や復帰改行文字が
含まれていると、処理の結果は予測できません。これを防ぐには、見つかった
各ファイル名を引用符つきの文字列に変換するスクリプトを find を使って呼
び出し、そのスクリプトを xargs にパイプでつなげるようにしてください。
なお xargs が使う引用符の規則は、シェルの規則とは異なります。同じ規則
を採用しないのは、既存のアプリケーションが現状の規則に依存しているのに
対し、シェルの構文規則はそれと互換性を持たないためです。文字列を xargs
が正しく解釈できる形式に変換 する簡単な方法は、各文字の前にバックスラッ
シュ(\fR) を付加することです。
0056名無しさん@お腹いっぱい。2006/09/14(木) 00:08:25
>>51
SUSv3のxargs(1)

Note that input is parsed as lines; <blank>s separate arguments. If
xargs is used to bundle output of commands like find dir -print or ls
into commands to be executed, unexpected results are likely if any
filenames contain any <blank>s or <newline>s. This can be fixed by
using find to call a script that converts each file found into a
quoted string that is then piped to xargs.
0057名無しさん@お腹いっぱい。2006/09/14(木) 00:26:42
質問させてください。LinuxでBASHです。(長文失礼します)

ファイル名:file_a
データ:
1,abc,b,c
2,def,e,f
3,ghi,h,i

これを先頭の数字次第で別ファイルに吐き出したいのですが、
#!/bin/sh

for REC in `cat file_a`
do
echo "$REC" >> record.dat
NUM=`cat record.dat | cut -d "," -f1`
case $NUM in
  1) cut -f1- record.dat >> text1.txt ;;
 2) cut -f1- record.dat >> test2.txt ;;
 *) echo "error";;
esac
     rm record.dat
done
--
forでfile_aを一行ずつ読んで、一時的にrecord.datに格納し、先頭の文字でcaseで振り分けるというやり方をして動かしています。
これで上記のデータであれば動くのですが、
データ:
1,a bc,b,c
2,def,e ,f
3,ghi,h,i
という風に半角スペースが入るとそこで改行と認識されるようで、一行単位で認識をしません。

何か良い方法はないかアドバイスをいただけないでしょうか。よろしくお願いします。
0058名無しさん@お腹いっぱい。2006/09/14(木) 00:59:14
>半角スペースが入るとそこで改行と認識されるようで、一行単位で認識をしません。

for に与える引数リストが改行区切りだなんてどこに書いてあった?
行単位で認識されると思ってるのがまず勘違い。

改行区切りで欲しければ read を使う。

while read a; do
case "$a" in
1,*) echo "$a" >> text1.txt;;
2,*) echo "$a" >> text2.txt;;
*) echo error;;
esac
done < file_a

sed -n -e '/^1,/w text1.txt' -e '/^2,/w text2.txt' file_a
0059572006/09/14(木) 01:43:28
>>58さん

>for に与える引数リストが改行区切りだなんてどこに書いてあった?
>行単位で認識されると思ってるのがまず勘違い。
>改行区切りで欲しければ read を使う。

知りませんでした。
ありがとうございます、試させていただきます。
0060名無しさん@お腹いっぱい。2006/09/14(木) 01:55:34
>>57
区切り文字はIFSで設定する。
↓IFSを改行に設定

#!/bin/sh

IFS="
"

for rec in `cat file_a
echo $rec
done
0061名無しさん@お腹いっぱい。2006/09/15(金) 07:36:45
ファイル中に複数存在している特定の区切文字列で囲まれたブロックを、区切
文字列をも含んだ形で、それぞれ個別のファイルとして書き出したいと考えて
います。ファイル名は重複さえしなければどのような名称でも構いません。

なお、 bash 上で、

$ awk '/^開始/,/^終了/{print}' ~/tmp/data.txt > ~/tmp/data2.txt

のようにすることで、 data.txt 中に含まれる

開始
あああああああああああああああああああああああああ
あああああああああああああああああああああああああ
あああああああああああああああああああああああああ
終了

のブロックが、全て data2.txt に出力できることはわかりました。

しかし、これでは単一のファイルとなってしまい、目的とは異なります。

このような形で切り出したブロックを単一のファイルとしてではなく、それぞ
れ個別のファイルとして出力させるには、条件処理を追加する必要があること
はわかるのですが、どのように記述すればよいのかでつまずいています。
0062名無しさん@お腹いっぱい。2006/09/15(金) 08:02:35
作ろうとしているファイルの命名則がわからないと、
もしくはそれを決めないと、何とも言えん。
0063名無しさん@お腹いっぱい。2006/09/15(金) 08:30:21
>>61
awk使っていいなら簡単じゃん。

awk '
/^開始1/,/^終了1/{ print > "data1.txt" }
/^開始2/,/^終了2/{ print > "data2.txt" }
/^開始3/,/^終了3/{ print > "data3.txt" }
' data.txt
0064名無しさん@お腹いっぱい。2006/09/15(金) 09:14:54
>>62
ファイルの名称は重複さえしなければ、どんな名称でも構いません。
見つかった順に 0001.txt, 0002.txt,...のような形でも構いませんし、ラン
ダムに生成した名称でも構いません。

>>63
あっ ごめんなさい。
ファイル中に複数存在するブロックというのが、数百のオーダーで存在してい
ます。
また、区切り文字列は全て同じもの(今回の例では「開始」〜「終了」)です。
0065名無しさん@お腹いっぱい。2006/09/15(金) 09:39:15
情報小出し、仕様あとづけキタ。俺はパス。awkスレ行け。
シェルスクリプトと直接関係ないし。
0066名無しさん@お腹いっぱい。2006/09/15(金) 09:46:50
>>64
簡単じゃん。


awk '
BEGIN { n=0 }
/^開始/{ n++ }
/^開始/,/^終了/{ print > n ".txt" }
' data.txt
0067名無しさん@お腹いっぱい。2006/09/15(金) 10:15:44
>>65
情報を小出しにするつもりはなかったのですが、結果
としてそうなってしまいました。
書き込む前にもうちょっと冷静に読み返すべきでした。
ごめんなさい。

>>66
ありがとうございます。
ご教示頂いた方法で希望通りの処理を実現できました。
0068名無しさん@お腹いっぱい。2006/09/15(金) 10:39:57
終了マーカーがいるみたいだから厳密には目的と違うかもしれないけど、
csplitも使えるかな。
0069名無しさん@お腹いっぱい。2006/09/15(金) 15:26:51
>53 なるほどブランク入り等のファイルね。
find は大丈夫そうだけど
[root@cis_svr_p]# find . -name *bb* -exec ls -l {} \;
-rw-r--r-- 1 root system 0 Sep 15 15:16 ./xx/aa bb
-rw-r--r-- 1 root system 0 Sep 15 15:17 ./xx/aa bb dd
-rw-r--r-- 1 root system 0 Sep 15 15:17 ./xx/ aa bb dd

xargs はないと困りそうだね。

15年以上UNIXシステムに携わってるけどブランク入りファイルが
メンテナンスの対象になるシステムは見たことないや。
学校系に多いのかな。

0070名無しさん@お腹いっぱい。2006/09/15(金) 15:30:15
>>69
だから Sambaサーバーって言ってるだろ。
スペース入りのファイルなんて日常茶飯事的にユーザーが作るよ。
0071名無しさん@お腹いっぱい。2006/09/15(金) 15:47:00
Samba なんて使わんしなぁ。
Windows でかためた方が楽じゃん。
0072名無しさん@お腹いっぱい。2006/09/15(金) 15:59:32
最近だと、KDE/GNOMEを使ってるユーザー(シェル不使用)だと、
UNIXユーザーでも普通にスペース入りのファイル名作るよ。
0073名無しさん@お腹いっぱい。2006/09/15(金) 17:36:43
Windows serverライセンス料高い。
0074名無しさん@お腹いっぱい。2006/09/15(金) 20:02:00
>70

ちなみにユーザーが作ったファイルを
find やら xargs で何するの?
0075名無しさん@お腹いっぱい。2006/09/15(金) 20:05:31
学校とかなら、setuidされたshがホームに転がってたりしないかくらいは
チェックするんじゃないか。
0076名無しさん@お腹いっぱい。2006/09/15(金) 20:26:06
そういうディレクトリはnosuidだRO
0077名無しさん@お腹いっぱい。2006/09/15(金) 21:31:28
それだとsetuidというものを教えられないじゃん。
0078名無しさん@お腹いっぱい。2006/09/15(金) 21:44:38
tmpの掃除とか。
0079名無しさん@お腹いっぱい。2006/09/16(土) 00:05:52
教えるときはその時だけ、専用のディレクトリ使えばよい。
0080名無しさん@お腹いっぱい。2006/09/16(土) 08:23:03
いずれにしても、スペースが入ると誤動作する xargsの仕様を正当化する理由にはなってない。
find ... -print0 | xargs -0 が使えない環境では、xargsを使わず、
find ... -exec ... で個別に -exec するのが正しい。(プロセスが無駄でも)
0081名無しさん@お腹いっぱい。2006/09/16(土) 17:59:11
>>80
-print0がつかえず、かつファイル数が多すぎるときは?
0082名無しさん@お腹いっぱい。2006/09/16(土) 18:00:30
>>81
GNU findutilsを入れる。
0083名無しさん@お腹いっぱい。2006/09/26(火) 21:09:46
test
0084名無しさん@お腹いっぱい。2006/09/26(火) 21:51:53
って、コマンドだったんですね。目から鱗です。
0085名無しさん@お腹いっぱい。2006/10/04(水) 16:47:35
UNIXTIMEをテキストファイルに500行ほど書き込んであるのですが、
それをシェルで一括で変換したいんです。

echo ########## | awk '{print strftime("%c",$1)}' >tempuni.txt

みたいな感じで
どのようにやればいいでしょうか?

お願いします
0086名無しさん@お腹いっぱい。2006/10/04(水) 16:53:54
>>85
イマイチ仕様が不明確だが、

$ echo 1157601611 | date -d "1970-01-01 `cat` seconds"
Thu Sep 7 04:00:11 JST 2006

↑みたいにできればいいのかな?
タイムゾーンは別途考慮のこと。

では、後出しの仕様どうぞ
0087名無しさん@お腹いっぱい。2006/10/04(水) 16:56:15
シェルってゆうなクズ。
0088名無しさん@お腹いっぱい。2006/10/04(水) 16:59:21
「シェルで一括変換」ならOKっしょ。
0089名無しさん@お腹いっぱい。2006/10/04(水) 17:00:15
何かのパズルか宿題じゃなければシェルでやらない方がいい問題だな。
0090名無しさん@お腹いっぱい。2006/10/04(水) 17:01:41
>>86
そんな感じです。
それをファイルの中のUNIXTIMEを1行目から500行目まで一括で変換したい。

1157601611
1157601612
1157601613
1157601614
 ・
 ・
 ・
みたいにならんでます

>>87
すいません。コマンドでした。
でもシェルでも出来ると思って・・・。
0091名無しさん@お腹いっぱい。2006/10/04(水) 17:05:17
>>90
じゃあ、hoge.txt に
1157601611
1157601612
1157601613
1157601614

が書かれてるとして、
以下を実行


for t in `cat hoge.txt`
do
date -d "1970-01-01 09:00 $t seconds"
done
0092名無しさん@お腹いっぱい。2006/10/04(水) 17:12:32
>>91
ありがとう御座います。

temp.txtに書き出しながら処理するにはどうしたら良いですか?
0093名無しさん@お腹いっぱい。2006/10/04(水) 17:15:11
>>92
done の行を
done > temp.txt
にすればいいだろ。ただのリダイレクトだよ。
0094名無しさん@お腹いっぱい。2006/10/04(水) 17:17:41
というか、質問者の >>85 自体がすでに答えになってるのに、
何を質問したいのか意味不明。

>>85 のやりかたでやるなら、

awk '{print strftime("%c",$1)}' > tempuni.txt < hoge.txt

で桶。
もしかして、単に入力ファイルのリダイレクト方法を知らなかっただけ?
0095名無しさん@お腹いっぱい。2006/10/04(水) 18:40:49
質問です( ・ω・)∩

CSVファイルの特定のフィールドの日付を書き換えなきゃなりません。

たとえば三番目のフィールドを199912から200001のように全行書き換える
にはどうしたらいいのでしょうか。

日付計算は終わってます。${B_YEAR}${B_MONTH} →${A_YEAR}${A_MONTH}
に入れ替えたいのですがsed使ってもなかなかうまくいきません。

awkで特定のフィールドを表示する方法ならわかるのですが、特定のフィールド
を置き換えた上で他のフィールドをそのまま表示する方法がわかりません。
0096名無しさん@お腹いっぱい。2006/10/04(水) 18:54:49
CSVはどういう書式のCSVかによって難易度がまるで違うので
厳密な仕様をください。""中の"や,の扱いとか。
0097名無しさん@お腹いっぱい。2006/10/04(水) 19:59:49
>>91
date -f hoge.txtは使えないのかなあ
0098名無しさん@お腹いっぱい。2006/10/04(水) 20:07:02
>>97
date -f は、UNIX時間の形式(ただの数字)には対応してない。
(やってみればわかるが)
なので、>>91 で正解。
0099名無しさん@お腹いっぱい。2006/10/04(水) 20:27:02
>>98
cat hoge.txt |sed -e "s/.*/1970-01-01 & second/;" |date -f -
で出来た
0100名無しさん@お腹いっぱい。2006/10/04(水) 20:37:30
>>99
お約束の突っ込み。「catが無駄です」
0101名無しさん@お腹いっぱい。2006/10/04(水) 20:38:07
CVSファイルには日付とか入っています
""はないです。

YYYYMM,HOGE,0,YYYYMM,YYYYMM,------中略-------,YYYYYMM,0,0,0,0
のような感じで日付が何箇所あります。現時点では各日付の関係
がわかりません。 m(_ _)m
0102名無しさん@お腹いっぱい。2006/10/04(水) 20:39:40
>>99
いや、わざわざ sed 通すくらいなら >>94 でいいだろ。1プロセスで済むし。
0103名無しさん@お腹いっぱい。2006/10/04(水) 20:48:16
>>102
manにdate起動のオーバーヘッド云々って書いてある。
0104名無しさん@お腹いっぱい。2006/10/04(水) 20:51:48
>>103
欲嫁。>>94 って言ってるんだよ。dateなんて1度も起動しないよ。
0105名無しさん@お腹いっぱい。2006/10/04(水) 22:15:56
awkはbash以上に使えるなw
0106名無しさん@お腹いっぱい。2006/10/05(木) 01:02:04
WINDOWS上でシェルスクリプトを作成して、UNIXサーバー上で実行させたいのですが、
WINDOWS上でシェルスクリプト動作確認をする方法はありますか?
0107名無しさん@お腹いっぱい。2006/10/05(木) 01:13:36
>>106
cygwin
0108名無しさん@お腹いっぱい。2006/10/05(木) 01:28:44
bashからawk使えばいいじゃん

バカくせぇ
0109名無しさん@お腹いっぱい。2006/10/05(木) 13:16:35
>>101
cutやpasteコマンドを使うところなのかもしれないし、
シェルスクリプトとは言い難いが
perl -apF, -e '$, = ","; $/ = "\n"; splice(@F, $n, 1, $F[$n]を加工); print @F' < csvファイル
で出来ない?
0110名無しさん@お腹いっぱい。2006/10/05(木) 13:17:05
-apF,のとこ、pじゃないやnだ。
0111名無しさん@お腹いっぱい。2006/10/05(木) 23:37:13
>>95
GNU sed を使うという手もある。

例)
$ echo 'abcdef' | sed 's/a\(b\)c\(de\)f/x\1y\2z/'
xbydez
0112名無しさん@お腹いっぱい。2006/10/07(土) 03:06:18
>>109 >>111 ありがとぅございますっっヽ(●´∀`)人(´∀`●)ノ
Solaris環境で自分で勝手にはgnu sed使えないのですが
perlは入っているので試してみます。∩(´∀`)∩ワァイ♪
0113名無しさん@お腹いっぱい。2006/10/07(土) 10:54:57
シェル内の変数が0の時の挙動についておしえてください。

Windowsで使う下記のような内容のバッチファイルを作るために、
Solaris8上で簡単なスクリプトを作成しますた。


<バッチファイルの中身 (期待している実行結果)>
lha32 a D:\save\0.lzh D:\work\0\
lha32 a D:\save\1.lzh D:\work\1\
lha32 a D:\save\2.lzh D:\work\2\
 :
lha32 a D:\save\9999.lzh D:\work\9999\ (←9999部分は、実際は第1引数で指定)


<作ったスクリプト>
#!/bin/sh
COUNT=0
LAST=$1
while [ $COUNT -le $LAST ]
do
  echo "lha32 a D:\\save\\$COUNT.lzh D:\\work\\$COUNT\\"
  COUNT=`expr $COUNT + 1`
done
0114続き2006/10/07(土) 10:55:42
ところがこのスクリプトを実行すると、最初に実行されるCOUNT変数が0のときに
0の値が消えてしまう現象が出てしまいまつ。(´・ω・`)

<shの実行結果>
lha32 a D:\save.lzh D:\work    ←0が消えている
lha32 a D:\save\1.lzh D:\work\1\
lha32 a D:\save\2.lzh D:\work\2\
 :

試しにシェルの種類を変えてみたところ、ksh, zsh は sh と同じ挙動を示し、
bashのみ期待していた出力となりますた。

<bashの実行結果>
lha32 a D:\save\0.lzh D:\work\0\
lha32 a D:\save\1.lzh D:\work\1\
lha32 a D:\save\2.lzh D:\work\2\
 :


この現象について、
 ・何故、0が消えるのか?
 ・/bin/shを使った場合に0を表示させる方法

について教えてください。
おまいら、よろしくおながいします。
0115名無しさん@お腹いっぱい。2006/10/07(土) 11:39:34
man echo
0116名無しさん@お腹いっぱい。2006/10/07(土) 11:50:42
>>113
それは、echoコマンドの仕様が違うため。
Solarisなどの /bin/sh の echo は、bashの echo -e に相当する。

echo -e 相当だと、\ が、シェルと echoで2回解釈されるので、
単純な \ を出力させたければ、\\\\ と書かないと行けない。

よって↓で桶。

echo "lha32 a D:\\\\save\\\\$COUNT.lzh D:\\\\work\\\\$COUNT\\\\"
01171132006/10/07(土) 12:08:24
>>116
回答ありがとうございますた。
\がシェルと echoで2回解釈されるとは知りませんですた…。
0118名無しさん@お腹いっぱい。2006/10/07(土) 12:10:55
\0になりうる場所のみ二重化すればよいから、

echo "lha32 a D:\\save\\\\$COUNT.lzh D:\\work\\\\$COUNT\\"

でもいいな。
0119名無しさん@お腹いっぱい。2006/10/07(土) 12:42:08
>>118
ashとかだと、\1 でも 8進数の1と解釈するから、それはお勧めできない。
すべて \\\\ にするのが吉。
0120名無しさん@お腹いっぱい。2006/10/07(土) 13:00:20
エスケープだらけでややこしいな。
echo時は無難な/にでもしといて |sed とかしてまとめてエスケープつけると
見やすいかも。好きずきだが。
0121名無しさん@お腹いっぱい。2006/10/07(土) 13:02:25
ash(´゚c_,゚` )プッ
んな中途半端なもん使うなや

それに\1になりうるのは\\$COUNTのところだけだろ。
0122名無しさん@お腹いっぱい。2006/10/07(土) 13:22:46
D:\\save じゃなくて、
D:\\tave とかだったら困るだろ。
\\\\ にしとけ。
0123名無しさん@お腹いっぱい。2006/10/07(土) 13:24:36
UNIXのコマンドは\をエスケープキャラクタとして使用するものが多い。
ディレクトリ区切りは/としておいて、最後に一括変換すればよい。

#!/bin/sh
COUNT=0
LAST=$1
while [ $COUNT -le $LAST ]
do
  echo "lha32 a D:/save/$COUNT.lzh D:/work/$COUNT/"
  COUNT=`expr $COUNT + 1`
done | tr '/' '\\'
0124名無しさん@お腹いっぱい。2006/10/07(土) 13:38:18
\(´゚c_,゚` )プッ
んな中途半端なもん使うなや
0125名無しさん@お腹いっぱい。2006/10/07(土) 19:02:19
適当に'〜'を混ぜて、\の部分をシェルには解釈させないようにすればいい。
というかむしろ変数展開部分だけ"〜"使え。ややこしいときは。

echo lha32 a 'd:\\save\\'"$COUNT.lzh" 'd:\\work\\'"$COUNT"'\\'
0126名無しさん@お腹いっぱい。2006/10/07(土) 20:28:15
echo に関してだけはbashがGJだとおもうな。
printf があるのに、エスケープシーケンスを解釈してしまうようなままにしとくのがいけない。
バッドノウハウの典型だな。
0127名無しさん@お腹いっぱい。2006/10/07(土) 20:32:36
やっぱ bash使えば直るよねぇ
0128名無しさん@お腹いっぱい。2006/10/07(土) 22:39:17
echoがエスケープシーケンス解釈しないのはBSD由来なわけだが。
んで、echoがエスケープシーケンスをデフォルトで解釈するビルドもできちゃう
どっちつかずなbashがGJなのかよw
0129名無しさん@お腹いっぱい。2006/10/08(日) 00:09:40
デフォルトは有効でもいいが、オプションで無効にできたりするといいがな。
0130名無しさん@お腹いっぱい。2006/10/08(日) 01:13:22
大多数のshができないものは基本無効、オプションで有効だろ?
0131名無しさん@お腹いっぱい。2006/10/08(日) 06:43:25
ちゃうだろ。
Solarisなどのecho(/bin/echoも含む)が、エスケープシーケンスを無効にする方法がないことをいってるんジャマイカン?
013295-1012006/10/10(火) 14:04:36
m(_ _)m アリガトォ〜 ゴザイマス★

/usr/bin/sed /usr/ucb/sed /usr/xpg4/bin/sed でも動作しました。
0133名無しさん@お腹いっぱい。2006/10/16(月) 01:05:51
sambaで共有している関係で「スペース」の入ったdirがある状況で、
特定拡張子のファイルを一括処理しょうと思い、

for file in `find . -name "*.hoge"`
do

のようにやると、スペースごとに変数fileに入ってしまうのだが
簡単な回避方法ありますか?


0134名無しさん@お腹いっぱい。2006/10/16(月) 01:25:32
find . -name "*.hoge" | while read line;do echo "@ $line @";done
■ このスレッドは過去ログ倉庫に格納されています