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

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

■ このスレッドは過去ログ倉庫に格納されています
0001うはwwwww2006/03/26(日) 00:56:22
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>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 でトレースしましょう。
0473名無しさん@お腹いっぱい。2006/05/20(土) 11:03:22
ぐぁ、リロードしたら既に解答が…
ここって案外人多いのね。
0474名無しさん@お腹いっぱい。2006/05/20(土) 11:25:28
>>472
-Eでnewline(\n)が扱えるようになるsedもあるんだよ。
お前のsed(gnu sed)は行末の\でnewlineとみなしてるだけで、行末の\を
newlineとみなさないのもある。

gnu sedなら
sed -e '/hoge/{N
N
s/[^\
]//g
}' data
でも行ける。
0475名無しさん@お腹いっぱい。2006/05/20(土) 11:57:11
そういえば ed は /hoge/,/hoge/+2 という範囲指定ができるんだが
sed はできないんだな。
0476名無しさん@お腹いっぱい。2006/05/20(土) 12:15:10
>>474
> -Eでnewline(\n)が扱えるようになるsedもあるんだよ。
いや、だから -E は POSIX 準拠でもないはずだが。

上のコマンドは間違ってた。a \ じゃなく a\ です。Append コマンドは。
スペース入れると POSIX & SUS 違反。GNU なんかじゃ通っちまうがな。

まあ、洩れ自身 GNU に冒されてるのは認めし、GNU を嫌う気持ちも分かる。
スペースいれちまったことは素直に謝りたい。

後、GNU sed なら N なんぞ使わず、/hoge/,+2 とでもしといた方が良い。
0477名無しさん@お腹いっぱい。2006/05/21(日) 11:57:07
>>463
:g/hoge/.,.+2s/.*//

ってvimじゃないのか。
0478名無しさん@お腹いっぱい。2006/05/22(月) 02:42:26
お勧めはしないが、sed のバージョンに
依存したくないのならこんな方法もある。

#!/bin/sh
i=0
while read x ; do
 y=''
 if [ "$x" = 'hoge' ] ; then
  i=2
 elif [ "$i" -gt 0 ] ; then
  i=`expr "$i" - 2`
 else
  y="$x"
 fi
 echo "$y"
done < file
0479名無しさん@お腹いっぱい。2006/05/22(月) 12:36:14
hogeを含む行だし、-2の意味わかんないし
0480名無しさん@お腹いっぱい。2006/05/25(木) 17:12:36
ある機械のHTTPサーバが落ちている(ポート80にconnect(2)できない)
かどうかを調べるのにはどうしたらよいでしょうか?

HTTPで自分の状況を公開している装置Mがあります。
これの状況を定期的に wget 1.8.2 で調べようとしてるのですが、
時々MのHTTPサーバが落ちています。(OSは動いててping等に応答。)
サーバが落ちていると、wget はいつまでも終了しません。
HTTPでつながらない時にはすぐあきらめるにはどうしたらよいでしょう?

wget の --timeoutオプションは、connect(2)成功後のreadに対する指定
らしく、効果ありませんでした。

wgetするマシンはFreeBSD 4.10で、/bin/sh で書いてます。
0481名無しさん@お腹いっぱい。2006/05/25(木) 17:45:23
ピンポンダッシュにはやっぱりnmap?
04824802006/05/25(木) 17:56:25
ピンポンした後ダッシュせず、相手の顔色(HTML response)を確認したいっす。
でも、相手出ないのに玄関でずっと待ってるのも変で。

nmapごもっともですが、大鉈っぽくないですか?
0483名無しさん@お腹いっぱい。2006/05/25(木) 18:07:46
>>480
wget http://... &
sleep 5
kill $!
0484名無しさん@お腹いっぱい。2006/05/25(木) 18:41:40
>>480
リトライが0(=infinity)になってない?
1.10.1なら--connect-timeoutがあるよ。
0485名無しさん@お腹いっぱい。2006/05/25(木) 21:18:45
>>480
Smokepingが良いよ。
単体のコマンドはechopingとか
0486名無しさん@お腹いっぱい。2006/05/26(金) 17:45:13
すいません。質問があります。
あるファイルの中の情報が
正しいフォーマット(各情報がタブで分けられている)
かどうか確認する方法はありますか?
たとえば、example.txtというファイルの中が

picture.jpg<tab>jpg
word.txt<tab>txt
music.mp3<space>mp3

だとすると、
このファイルのフォーマットは正しくない(3行目がスペースで分けられている)ので、
falseを返すというようなスクリプトを知りたいです。
よろしくお願いします
0487名無しさん@お腹いっぱい。2006/05/26(金) 17:50:20
>>486
「正しい」の定義がよくわからんが
grep -v ' ' <example.txt >/dev/null && echo false
とか。
' ' の中は TAB 文字で。
0488名無しさん@お腹いっぱい。2006/05/26(金) 17:58:17
>>487
「falseを返す」というのは「falseという文字列を表示する」という意味なのかw
0489名無しさん@お腹いっぱい。2006/05/26(金) 18:05:58
>>488
まぁ、例として挙げたまで。
その辺は好きなように変えてくれ。
04904862006/05/26(金) 18:21:45
説明が下手ですんません。
あるファイルの中の各ラインの情報が
すべてタブキャラクターで分けられているか確認したいのです。

上記のexample.txtの場合、
1行目と2行目は

picture.jpg<tab>jpg
word.txt<tab>txt

とタブで分けられていますが、
3行目は

music.mp3<space>mp3

タブではなくスペースで分けられているので、
このexample.txtの書式は間違っているということが知りたいのです。
0491名無しさん@お腹いっぱい。2006/05/26(金) 18:28:37
>>490
それなら >>487 がすでに答えてるじゃん。

もっと厳密にするなら
grep -v '\<.*\> \<.*\>'
でいいかな。途中の空白に見えるところは TAB文字でね。
0492名無しさん@お腹いっぱい。2006/05/26(金) 18:28:56
>>490
> あるファイルの中の各ラインの情報が
> すべてタブキャラクターで分けられているか確認したいのです。
さっきと変わってないな。
ここをきちんと定義しないとまともな解は出てこないよ。
たとえば以下のような行をどう扱うか
これじゃわからんでしょ。

a<space><tab>b
a<space>b<tab>c
<tab>b
a<tab><tab>b
a<tab>b<tab>c
0493名無しさん@お腹いっぱい。2006/05/26(金) 19:22:02
>>490
a=$(cat $1 | wc -l)
b=$(cat $1 | sed -nr "/[^\t]*\t[^\t]*/p" | wc -l)
[ $a = $b ] && echo "OK" || echo "NG"
0494名無しさん@お腹いっぱい。2006/05/26(金) 20:16:12
カレントディレクトリ内(サブディレクトリ含む)の特定の拡張子を持つファイルを
一括で処理させたいと思い以下のようなシェルスクリプトを組んだのですが
サブディレクトリ内の一部ファイルが重複して処理されてしまいます
どこがダメなのでしょうか?

recursive_func()
{
for i in *
do
if [ -d $i ]
then
cd $i
recursive_func
cd ..
fi

if echo $i | grep '\.c$' > /dev/null || echo $i | grep '\.h$' > /dev/null
then
//ここに処理
fi
done
}

recursive_func
0495名無しさん@お腹いっぱい。2006/05/26(金) 20:21:54
>>494
find と xargs じゃだめなん?
0496名無しさん@お腹いっぱい。2006/05/26(金) 20:40:57
>>494
シェル変数iはローカル変数じゃないよ。
再帰呼び出しした時に iの値を変化させてしまうから、
呼び出し元の iまで狂ってしまう。
0497名無しさん@お腹いっぱい。2006/05/26(金) 20:41:55
>>495
find自体は知ってたんですが、まさかこんな使い方があるとは知りませんでした・・・orz
下の様に書き換えることで目的の処理は達成できました
ありがとうございました&お騒がせしました・・・


find . \( -regex ".*\.c" -o -regex ".*\.h" \) -exec //ここに処理 \;
0498名無しさん@お腹いっぱい。2006/05/26(金) 20:45:38
>>496
そういうことだったんですか。シェルスクリプトはちょっと齧っただけなので
ついCの感覚で書いてました・・・
元の方も関数先頭で local i とすることでうまく動くようになりました
わざわざありがとうございました
0499名無しさん@お腹いっぱい。2006/05/26(金) 20:50:03
>>494
hoge.c っていうディレクトリがあったときに
おかしくなりそうだな。
0500名無しさん@お腹いっぱい。2006/05/26(金) 21:12:25
>>499
grepしてるとこelifにすりゃ良くね?
0501名無しさん@お腹いっぱい。2006/05/26(金) 21:15:16
>>500
答え言うなよ。
空気嫁。
0502名無しさん@お腹いっぱい。2006/05/26(金) 21:16:18
いや、ファイル名の拡張子判定するならgrepなんか使わん。

case "$i" in
*.c|*.h)
ここに処理;;
esac

で桶。
0503名無しさん@お腹いっぱい。2006/05/27(土) 19:29:58
ディレクトリが空かどうかを表示するにはどうすれば?
0504名無しさん@お腹いっぱい。2006/05/27(土) 19:34:00
kshにて環境変数を複数行定義したファイルを
スクリプト内で読み込ませ、全行正常に読み込んだか判定したいのですが

. /環境変数定義ファイル
echo $?

環境変数定義ファイルの途中で読み込みエラーが発生しても
最終行が正常ならば、echoは0を返すのですが
読み込みエラーを発見する方法ってありますか。

0505名無しさん@お腹いっぱい。2006/05/27(土) 20:16:47
各ディレクトリにファイルが何個あるか高速に調べる方法はありますか?
0506名無しさん@お腹いっぱい。2006/05/28(日) 02:13:45
>>505
速度重視ならシェルスクリプトはやめといた方がいい。
0507名無しさん@お腹いっぱい。2006/05/29(月) 04:12:25
>505

a) .で始まるファイルは数えられなくてもいーんなら
find . -type d | while read DIR ; do printf "$DIR: %d\n" `find $DIR/* -prune ! -type d | wc -l` ; done

b) それじゃあ困るよという場合は
find . -type d | while read DIR ; do printf "$DIR: %d\n" `ls -aF $DIR | fgrep -v '/' | wc -l ` ; done

iBook(500MHzのG3)で試したら、、、

a)の例
# time find /usr -type d | while read DIR ; do printf "$DIR: %d\n" `find $DIR/* -prune ! -type d | wc -l` ; done
real 1m1.054s
user 0m7.870s
sys 0m42.810s
#

b)の例
# find /usr -type d | while read DIR ; do printf "$DIR: %d\n" `ls -aF $DIR | fgrep -v '/' | wc -l ` ; done
real 1m18.302s
user 0m10.340s
sys 0m53.310s
#

約17秒ほど差がでますた。(当社比約1.3倍)

※うちiBookの/usrはファイル19240コ、ディレクトリ973だぉ
0508名無しさん@お腹いっぱい。2006/05/29(月) 04:19:57
>>506
iBookでやってみた感じだと、%SYSの方の比率が大きいくて
wcやfgrepの負荷は%USRの比率が大きいぉ。

とゆーことで、
ファイル名・ディレクトリ名をファイルシステム内でぐるぐる走査する時間に多くが費やされるっぽいぉ。

ならば、シェルスクリプトでも大差ない鴨よ?
lsやfindを上回るCのアプリ書くのも難しいし。
0509sage2006/05/29(月) 04:53:11
find /usr -type f | wc でいいんじゃないの?
0510名無しさん@お腹いっぱい。2006/05/29(月) 09:44:08
find /usr -type f -printf "%h\n" |uniq -c
が速いんじゃないかな。
0511名無しさん@お腹いっぱい。2006/05/29(月) 09:50:51
>>509 質問欲嫁。>>505 は「ディレクトリ毎に」ファイル数を数えたいらしいぞ。
>>507 >>510 は一応ディレクトリ毎に結果を表示するから、回答になってる。

回答が >>509 でいいんなら、そもそも質問しないだろ。
0512age2006/05/29(月) 11:08:01
おしえてくださいお願いします。shスクリプト等で1行目の
#!/bin/sh とか記述する行の事、何て言うんでしたっけ。
人の名前みたいな「○○の行」みたいな名前が付いてたと思うんですが。
0513名無しさん@お腹いっぱい。2006/05/29(月) 11:19:51
>>512
これ?
http://www.catb.org/~esr/jargon/html/S/shebang.html
0514age2006/05/29(月) 11:39:09
>>513
あー、それッス!有り難うございます!有り難うございます!
昨日の夜からのモヤモヤが吹っ飛びました!
0515名無しさん@お腹いっぱい。2006/05/29(月) 13:43:51
>>509
GNU findには-printfなんてのがあるのか・・・ベンリね

GNU find じゃない人は
find . -type f -exec dirname {} \; | sort | uniq -c
と書かないと動かん鴨

# FIFOなんかもファイルの数として数えたければ
# find . ! -type d -exec dirname {} \; | sort | uniq -c
0516名無しさん@お腹いっぱい。2006/05/29(月) 14:52:01
サーバーのシェルスクリプトをCGIでsystemコールして動かないんですが、
環境設定をapacheのhttpd.confに追加して動かす方法はあるのでしょうか?
いま環境設定はサーバー上で

FILE=data.ini
export FILE

で行っています。
シェルはLinuxのbashです。


0517名無しさん@お腹いっぱい。2006/05/29(月) 14:56:44
>>516
くだらねえ質問はここに書き込め! Part 125
http://pc8.2ch.net/test/read.cgi/linux/1147260130/
0518名無しさん@お腹いっぱい。2006/05/29(月) 15:09:11
【sed】シェルスクリプト総合@LINUX【awk】
http://pc8.2ch.net/test/read.cgi/linux/1121994321/l50
0519名無しさん@お腹いっぱい。2006/05/29(月) 16:57:12
>>516
SetEnv FILE data.ini

って、アンタそりゃーhttpdの使い方の話だから
シェルスクリプトの話じゃねーべ
0520名無しさん@お腹いっぱい。2006/05/29(月) 21:09:11
aaaというファイルが更新されたら次の処理に移るというスクリプトはどう書けばいいですか?

例]file_procという自作コマンドを実行してaaaというファイルが更新されたらファイルの最後に時刻を書き込む

1.file_proc1 aaaを実行
2.aaaというファイルが更新されるのを待つ
3.更新されたらそのファイルの最後に時刻を追加
4.file_proc2 aaaを実行
5.aaaというファイルが更新されるのを待つ
6.更新されたらそのファイルの最後に時刻を追加
 ・
 ・
 ・
 ・
0521名無しさん@お腹いっぱい。2006/05/29(月) 21:16:15
セマフォって概念を理解するといいと思うよ
0522名無しさん@お腹いっぱい。2006/05/29(月) 23:01:27
>>520
よくわからんがこんなんでええんかい?

----
FILE_WATCH=/home/foo/aaa
FILE_PREVIOUS=/tmp/watch.txt

if [ ! -f $FILE_WATCH ]
then
echo "$FILE_WATCH not found."
exit 1
fi

ls -l $FILE_WATCH > $FILE_PREVIOUS
while [ -1 ]
do
LS_CURRENT=`ls -l $FILE_WATCH`
LS_BEFORE=`cat $FILE_PREVIOUS`
if [ x"$LS_CURRENT" != x"$LS_BEFORE" ]
then
# file is updated
date >> $FILE_WATCH
fi
ls -l $FILE_WATCH > $FILE_PREVIOUS
sleep 10
done
----
0523名無しさん@お腹いっぱい。2006/05/30(火) 00:27:07
>>520
file_proc1 aaa && date >> aaa

こんなのじゃだめなの?
0524名無しさん@お腹いっぱい。2006/05/30(火) 23:30:11
シェルスクリプトで実行しているコマンド
を実行した結果と一緒にファイルに出力したいのですが

set -x
としても
./abc.sh > aaa.txt
のように実行したときに
aaa.txtに実行した結果しか出力されません。

どうすればコマンドも出力できるようになりますか?
0525名無しさん@お腹いっぱい。2006/05/30(火) 23:37:57
>>524
./abc.sh > aaa.txt 2>&1
0526名無しさん@お腹いっぱい。2006/05/30(火) 23:39:45
>>524
スクリプトの一行目に、
echo -n $0
とか書いとけばいいんじゃないかと。
0527名無しさん@お腹いっぱい。2006/05/30(火) 23:42:56
>>526 は質問の意味をどう取り違えたのだろうか?
0528名無しさん@お腹いっぱい。2006/05/30(火) 23:57:10
set -v じゃだめなのかな?
0529名無しさん@お腹いっぱい。2006/05/30(火) 23:59:55
>>528 は質問の意味をどう取り違えたのだろうか?

つか、>>525 に答え出てるって。
0530名無しさん@お腹いっぱい。2006/05/31(水) 00:18:48
at- f abc.sh now + 1 minute
として数分待ってメールを読む
0531名無しさん@お腹いっぱい。2006/05/31(水) 08:46:30
> aaa.txt だと標準出力だけしか書き込まないから
2>&1ってつけると標準エラー出力もファイルに書き込む
0532名無しさん@お腹いっぱい。2006/05/31(水) 10:57:59
例えば
c123456 cs012
という文字列がhogehogeというファイルに記述されていた場合、
cs以下の数字3つを切り取り、それを変数numとする
更にその変数numに対して
整数a≦変数num≦整数b
という条件が満たされた場合にその旨を伝える

…というスクリプトを作っているのですが、どうもうまくいきません

if [ $num >= 0 ] ; then
if [ $num <= 61 ] ; then
echo
0533切れてる…orz2006/05/31(水) 11:01:11
if [ $num >= 0 ] ; then
if [ $num <= 61 ] ; then
echo "0 <= $num <= 61"
fi
fi

if [ $num >= 62 ] ; then
if [ $num <= 122 ] ; then
echo "62 <= $num <= 122"
fi
fi

と条件を指定したのですが、numの値如何に関わらず全てのecho文が表示されてしまいます
どうすればいいんでしょうか?
0534セル塩いちご2006/05/31(水) 11:23:27
>= を -ge に
<= を -le に

と直せばいいじゃないかな
0535名無しさん@お腹いっぱい。2006/05/31(水) 12:01:59
あと、カレントディレクトリに = というファイルができてしまってるはずだから、
削除するヨロシ。
0536名無しさん@お腹いっぱい。2006/05/31(水) 12:46:42
[ 0 -le $num -a $num -le 61 ]
とかの方が見やすそうな希ガス
0537名無しさん@お腹いっぱい。2006/05/31(水) 12:50:50
だったら、↓こういう書き方もあり。

if ((0 <= num && num <= 61)); then
0538名無しさん@お腹いっぱい。2006/05/31(水) 13:16:35
cshはこの辺が楽過ぎw
0539名無しさん@お腹いっぱい。2006/05/31(水) 17:48:58
cshは邪道
0540名無しさん@お腹いっぱい。2006/05/31(水) 17:53:53
>>537
罰手異存!
0541名無しさん@お腹いっぱい。2006/05/31(水) 17:56:48
ムゥ、罰手異存か……まだ使い手がいたとは……
0542名無しさん@お腹いっぱい。2006/05/31(水) 19:00:43
>>541
知っているのか雷電。
0543名無しさん@お腹いっぱい。2006/05/31(水) 20:21:14
>>534
そのようにすると「unary operator expected」と出て弾かれてしまいます…

>>535
分かりました。処理しておきます

>>536,537
すぐには無理ですが、明日にでも試してみます。ありがとうございます

>>538
諸事情によりshでやらなければならないので…残念です
0544名無しさん@お腹いっぱい。2006/05/31(水) 20:33:26
>>543
>そのようにすると「unary operator expected」と出て弾かれてしまいます…

だとすると、$numに何も代入されていない(空文字列)の可能性あり。

[ $num >= 62 ] だから、>= はリダイレクトとみなされ、引数ではないので
testコマンドには test $num 62 だけが渡り、$numが空文字列なので、
test 62 となって、これは62という文字列の長さが1以上あるので
常に真になる。

元の質問で常に真になるという現象の説明が付く。

ちなみに、正しく$numに代入されていれば、
[ $num -ge 62 ] で動かないとおかしい。
0545名無しさん@お腹いっぱい。2006/05/31(水) 21:05:05
そもそも$numにどうやって代入してるん?
テキストから読み取って代入ってシェルだと結構難しいよ
awkとかでやってるのか?
0546名無しさん@お腹いっぱい。2006/05/31(水) 21:27:49
>>545
えーっとですね…種明かしをすると、大学の課題の一環なんです。
手元にスクリプトファイルがないので、明日また質問させていただきます。
因みにawkは使わず(使い方がよく分からない)、sedで例としてあげたcs012の"012"部分を切り取って使っています。
先生によるとそれが文字列として認識されており、整数に直す処理をしてやればよいのではないか…との事です。
んが、そのやり方が分からずに困ってます…
0547名無しさん@お腹いっぱい。2006/05/31(水) 21:33:32
>>546
本当に先生がそう言ったのならその先生は信用しない方がいい。
シェルスクリプトの変数では文字列と整数を区別しない。
(testコマンドでの判定時に演算子によって区別するだけ)

あと、宿題なら回答はこれで打ち切る。
0548名無しさん@お腹いっぱい。2006/05/31(水) 23:26:11
>>546
だからそのsedで抜き出してる処理の部分を詳しく
そこが間違ってたらもともこもねえじゃん
012の部分を切り取ってるソースをここに書け
0549名無しさん@お腹いっぱい。2006/05/31(水) 23:52:48
整数の場合を分け、比較に >= <= を使う shell となると… まさか、csh?
0550名無しさん@お腹いっぱい。2006/06/01(木) 02:15:27
bash $ [ 010 -gt 8 ] && echo ok
ok

へー、これでもエラーでないのか。
知らなかった。
05515462006/06/01(木) 14:31:53
#!/bin/sh
friend="$HOME/.friendlist"
friend2="$HOME/.friendlist2"

echo "Do you use me?---y/n"
read first
while test x"$first" = xy
do

w | grep -v pts | sort | sed 's/\([^ ]*\) :0\/\([^ ]*\) *[^ ]* *[^ ]* *[^ ]* *[^ ]* *[^ ]*/\1\2/' | cat >>$friend

read first
for i in $first
do
grep "$i" $friend | cat >>$friend2
set tmp=`sed 's/^c[0-9]\{6\} cs\([0-9]\{3\}\)/\1/' $friend2`
num=`$tmp >& /dev/null`
echo "
$i is here.
"
grep "$i" $friend2
echo ""
done
0552名無しさん@お腹いっぱい。2006/06/01(木) 14:38:24
>>551
num=`$tmp >& /dev/null`

↑/dev/nullに捨ててどうするw こりゃだめだ。
0553名無しさん@お腹いっぱい。2006/06/01(木) 14:54:18
>>552
該当行を削除してif構文を>>537さんの提示してくれた文に書き換えた結果、エラーは吐き出されなくなったものの
if ((0 <= num && num <= 61)) ; then
echo "$i is in \"2nd bld.101A\"."
fi

if ((62 <= num && num <= 122)) ; then
echo "$i is in \"2nd bld.109A\"."
fi

if ((123 <= num && num <= 142)) ; then
echo "$i is in \"20th bld.107\"."
fi

if ((143 <= num && num <= 162)) ; then
echo "$i is in \"20th bld.619\"."
fi

if ((201 <= num && num <= 245)) ; then
echo "$i is in \"20th bld.310\"."
fi

if ((301 <= num && num <= 320)) ; then
echo "$i is in \"20th bld.413\"."
fi

if ((321 <= num && num <= 340)) ; then
echo "$i is in \"20th bld.613\"."
fi
のようにしているのにnumの値に関わらず一番最初の処理しか実行されません…
0554名無しさん@お腹いっぱい。2006/06/01(木) 15:01:42
>>553
>該当行を削除して

削除してどうする。/dev/nullに捨てるのだけが余計。その他は必要。
あと、その前の行の set もおかしい。
これ本当にに自分で理解して書いたスクリプトじゃないだろ。
もっとシェルスクリプトの基本からやり直した方がいい。

0555名無しさん@お腹いっぱい。2006/06/01(木) 15:19:45
>>554
了解しました。確かに、理解せずに書いた部分がほとんどです。
勉強して出直すことにします。ありがとうございました。
0556セル塩いちご2006/06/01(木) 23:02:54
>>555

----
#!/bin/sh
set -x
----

と、「set -x」をつけて動かしてデバッグするといいじゃないかな
0557名無しさん@お腹いっぱい。2006/06/02(金) 11:57:20
----
#!/bin/sh -x
----
でいいんじゃないかな
0558名無しさん@お腹いっぱい。2006/06/02(金) 12:50:40
ファイルの頭から何バイト目を0xffとかに書き換えるってシェルスクリプトでどうやればよいでしょうか?
0559名無しさん@お腹いっぱい。2006/06/02(金) 12:54:53
>>558
perl使っちゃえよ。
0560名無しさん@お腹いっぱい。2006/06/02(金) 13:03:36
シェルスクリプトで八進数→十進数に変換する方法ってないものだろうか?
探しているんだが全然見つからん…orz
0561名無しさん@お腹いっぱい。2006/06/02(金) 13:09:14
>>560
bc使っちゃえよ。
0562名無しさん@お腹いっぱい。2006/06/02(金) 13:37:19
>>558
ヒント: head -c; tail -c

>>560
$ printf '%d\n' 0377
255
0563名無しさん@お腹いっぱい。2006/06/02(金) 13:49:34
>>562
サンクス。こんなやり方があったのか…
0564名無しさん@お腹いっぱい。2006/06/02(金) 14:56:10
$ echo 'ibase=8;377' | bc
255
$ perl -e 'print 0377,"\n";'
255
$
0565名無しさん@お腹いっぱい。2006/06/02(金) 23:45:58
シェルスクリプトの中で実行時間がちと長く掛かるコマンドを
実行している時に , 標準出力にディスプレイ 風車 ? が回って
いる様にみせるにはどうすればいいでしょうか ?
0566名無しさん@お腹いっぱい。2006/06/03(土) 02:51:19
俺はdcが大好き!

$ echo '8i377p' | dc
255
0567名無しさん@お腹いっぱい。2006/06/03(土) 03:10:32
>>565
ヒントをやるから後は自分でアレンジしな。

for i in a b c
do
echo -en "$i\r"
sleep 1
done
0568名無しさん@お腹いっぱい。2006/06/03(土) 08:02:28
bc って echo で標準入力にいれないと
ワンライナー計算ができないのが面倒くさい。
bc -e '1+2'
くらいできてもいいのに。
0569名無しさん@お腹いっぱい。2006/06/03(土) 08:32:25
>>568
dcは出来る子。
0570名無しさん@お腹いっぱい。2006/06/03(土) 11:44:41
>>568
exprは出来る子。
0571名無しさん@お腹いっぱい。2006/06/03(土) 12:02:32
bc…恐ろしい子!
0572名無しさん@お腹いっぱい。2006/06/03(土) 14:21:54
いまはprintfコマンドは普通にどこでもはいってるよね?
なんでつかわないんだろ。
■ このスレッドは過去ログ倉庫に格納されています