シェルスクリプト相談 ..
[2ch|▼Menu]
591:デフォルトの名無しさん
07/05/04 00:27:06
a.txt
2
4
23
87
483
3
b.txt
89
34
111
8
3
97
とある場合
program a.txt b.txt
と打てば
以下のようにに表示されるシェルスクリプトってできませぬか?

2+89=91
4+34=38
23+111=134
87+8=95
483+3=486
3+97=100

592:デフォルトの名無しさん
07/05/04 00:35:51
>>591
スクリプトにするまでもないが、

#!/bin/sh
paste a.txt b.txt | awk '{ print $1 "+" $2 "=" $1 + $2}'


593:デフォルトの名無しさん
07/05/04 00:36:40
あああ、paste $* | awk 以下略

594:デフォルトの名無しさん
07/05/04 22:00:14
ああpasteって知らなんだサンキュー

595:デフォルトの名無しさん
07/05/10 19:24:42
自演さらしあげ

596:デフォルトの名無しさん
07/06/18 22:07:54
既存ファイルの一部のみ書き換える事ってできますか?
(ファイル名変えずに)

NHK,1
NTV,4
TBS,6
FTV,8
ANB,10

というテキストがあったとして
sed 's/N/X/g' という操作をして

XHK,1
XTV,4
TBS,6
FTV,8
AXB,10

としたいです。

597:デフォルトの名無しさん
07/06/18 22:23:39
別のファイルに出力した後で、mvかcp

598:デフォルトの名無しさん
07/06/18 22:34:19
-i オプションあるならそれ使え

599:デフォルトの名無しさん
07/06/19 06:36:31
(mv file file.bak&& sed -e 's/N/X/g' >file) <file

600:デフォルトの名無しさん
07/06/19 06:47:14
sed -i 's/N/X/g' file

601:デフォルトの名無しさん
07/06/19 10:04:16
sed -i ってどんな機能??

602:デフォルトの名無しさん
07/06/19 10:23:41
手元のsedにはないオプションだ。

603:デフォルトの名無しさん
07/06/19 10:47:04
なら perl 使っとけ。
perl -i -pe 's/N/X/g' file

604:デフォルトの名無しさん
07/06/19 23:36:49
edでいいんじゃね?

605:デフォルトの名無しさん
07/06/27 00:30:13
ファイルのある文字列を含む行と行の間を取得するにはどうしたらいいのでしょうか?
例えば「abc」「def」を含む行の間、2・3・4行目を取得をしたいです。
grepでやろうとしたのですが、どうしてもうまくいきません。。

abcaa
aaaaa
bbbbb
ccccc
defbb

606:デフォルトの名無しさん
07/06/27 00:36:36
>>605
sed -n '/abc/,/def/p' < text | sed '1d;$d'

なんか冗長なのと、該当箇所が複数あると駄目だな。


607:デフォルトの名無しさん
07/06/27 00:37:59
パイプの後段を sed '/abc/d;/def/d' にすれば該当箇所が複数あってもOKかも。


608:デフォルトの名無しさん
07/06/27 00:47:05
>>605
sed -n '1,/abc/b; /def/q; p'

609:605
07/06/27 01:12:46
レスありがとうございます。

無理やりawkで冗長なものを作ろうとしてました。
もっと修行して出直します。

610:デフォルトの名無しさん
07/06/27 01:37:53
>>609
別にawkでいいんじゃね。ラクだし
↓複数箇所でも大丈夫
awk '/aaa/{f=1;next} /bbb/{f=0} f{print}'

611:デフォルトの名無しさん
07/06/29 23:03:01
つーかやり無理一行で作らんでも、perlとかで普通に作ればいいんじゃね。
冗長だろうがなんだろうが。

612:デフォルトの名無しさん
07/07/01 12:04:28
awkでがんばって一行で作ったのの速度と
perlでシコシコださく書いたのの速度は
どっちが速いですかね

613:デフォルトの名無しさん
07/07/01 12:11:24
別に全然頑張ってない

614:デフォルトの名無しさん
07/07/01 12:19:38
awkで一行で書けるものがperlで一行で書けない理由は無い。

615:デフォルトの名無しさん
07/07/01 15:09:13
一行に納める必要はないです。
バックリファレンスなどの特殊な機能を使わなければ
遅延評価DFAで動くawkは行数が増えても遅くなりません。
逆に頑張って一行で書いてもあんまり高速化しません。

616:デフォルトの名無しさん
07/07/04 23:12:58
九九の表を作るスクリプトなんですけど
cshで@を使わないで書き直したらどうなりますか?

#!/bin/csh -f

echo " | 1 2 3 4 5 6 7 8 9"
echo "--|------------------"

foreach i (1 2 3 4 5 6 7 8 9)
eaco -n " $i|"
foreach j (1 2 3 4 5 6 7 8 9)
@ seki = $i
@ seki *= $j
printf "%3d" $seki
end
echo ""
end
echo "--|------------------"


617:デフォルトの名無しさん
07/07/04 23:21:45
@を使わないならBourne Shellでやるようにexprを使えば?


618:デフォルトの名無しさん
07/07/04 23:25:05
>>617
Borne shellで書き換えは出来るんですけど
課題としてcshで@を使わないで書き直すように指示されてるんです

619:デフォルトの名無しさん
07/07/04 23:35:33
ばか?

620:デフォルトの名無しさん
07/07/05 00:28:33
しつもん

スイッチのポートとその先のPCのMACをSNMPで対応付けたいのですが、

#!/bin/bash
while [MACアドレスがある限り];do

snmpwalk -c コミュ IP .1.3.6.1.2.1.17.4.3.1.1 >aa
snmpwalk -c コミュ IP .1.3.6.1.2.1.17.4.3.1.2 >bb
snmpwalk -c コミュ IP .1.3.6.1.2.1.17.1.4.1.2 >cc
snmpwalk -c コミュ IP .1.3.6.1.2.1.31.1.1.1.1 >dd

grep MAC aa > mib
grep mibの右側 bb >bridge
grep bridgeの右側 cc >ifindex
grep ifindexの右側 dd >port

paste MAC,port >output.txt
done <mac.txt

みたいなたらい回ししか出来ないんですか?


関係ないけどどうして演算結果を変数に入れるのがあんなに変な形式なんだろう?


621:デフォルトの名無しさん
07/07/05 00:40:18
>>618
#!/bin/csh -f

echo '
@を使わないことに何の意味があるの?'
echo 'あんた馬鹿じゃねーの?'

622:デフォルトの名無しさん
07/07/05 01:02:45
>>618
Bourne Shellでやる「ように」と書いたのが見えませんでしたか?
・cshでも``記法は使えるでしょ?
・exprはBourne Shellの内部コマンドじゃないでしょ?


623:デフォルトの名無しさん
07/07/05 01:37:06
>>620
コマンド置換を山ほどネストすれば一時ファイルはもっと減るんじゃね?
つかこの程度のことにbash使うな
で、変な形式って?


624:デフォルトの名無しさん
07/07/06 00:53:44
文字列+数値(たまに数値の無い行がある)の並んだファイルを置換したいです
○○○1
××××200
△△
□□66

とか並んでるのを、
○○○2
××××201
△△
□□67

みたいに。
sedで左 >file1
sedで右 | sed -e "s/\([0-9][0-9]*\)/&+1/" | bc >file2
paste file1 file2 > file3
で解決かと思ったら、△△の行がbcで勝手に詰められて結果がずれてしまう…
私の頭ではこれ以上思いつきませんでした。助けて


625:デフォルトの名無しさん
07/07/06 00:56:27
awkでいいじゃん。

626:赤帽勉強中
07/08/02 21:45:16
・lftpを使用してファイルアップロードと削除を行う(mirrorは使わない)
・アップロードと削除の対象ファイルはリストから読み込ませる

って機能のスクリプトを作ろうとしているんですけど、
ファイル名をリストから読み込ませてのアップロードと削除がどうやれば良いのか。。。
どなたかlftpに詳しい方、アドバイスを下さいませ。(-∧-;) ナムナム

627:デフォルトの名無しさん
07/08/02 22:19:08
lftp使ったことないのでmanを見てみたが、manの範囲でできる。

実行するコマンドをテキストファイルに羅列して
lftp -f そのファイル

標準出力からコマンドを食わせることができればきれいなんだけどな。

cat <<EOF > commands
user hoge pass
cd hoge
EOF
sed 's!^!put !' < put_file_names >> commands
sed 's!^!del !' < del_file_names >> commands
lftp -f commands

とかそんな感じじゃね?


628:赤帽勉強中
07/08/02 23:10:38
>>627
レスありがとうございます♪おかげで何とかなりそうですよ。
実はmanを見たりググったりしていたんですが何じゃこりゃ?って感じで理解できていませんでした(汗
まだまだ全然勉強が足りませんですね。。。ヾ(´▽`;)ゝアセアセ

629:デフォルトの名無しさん
07/08/03 00:52:33
ふつうrsync

630:デフォルトの名無しさん
07/08/03 12:59:17
ついでなので、ワタシの使っているコマンドライン公開
lftp -u USER,PASS HOST -e 'set ftp:passive-mode 0;set ftp:ssl-allow 0;mirror -Rev' 2>&1

>>629
ftp しか使えない環境でも、rsync って使えますか?


631:デフォルトの名無しさん
07/08/03 14:37:12
>>630
使えません

632:デフォルトの名無しさん
07/08/03 14:49:39
sshオーバーで耐えろ

633:デフォルトの名無しさん
07/08/13 00:26:07
シェルスクリプトでURLのリンク先を開くにはどうしたらいいでしょうか?

634:デフォルトの名無しさん
07/08/13 01:06:27
>>633
汎用的なのは telnet + expect
SSL や TLS を使用しているなら openssl
接続先が http なら wget とか curl とか
ftp なら ftp コマンド

635:デフォルトの名無しさん
07/08/14 04:04:17
UNIXパワーツールの92Pに
PS1='`date "+%D %T"` $PWD $ '
というカスタマイズが紹介されていたんですが
+%D %Tをダブルクォートで囲むのは何故なんでしょうか?

636:デフォルトの名無しさん
07/08/14 08:04:47
>>635
そのPS1への代入の段階で展開させず、PS1に%Dを引き渡すため。
勿論それは、プロンプト表示の段階で展開されることを期待している。

637:デフォルトの名無しさん
07/08/14 16:05:22
>>636
シングルクォートで囲んでいるので、ダブルクォートで囲まなくても
代入の時点ではdateコマンドは実行されないのではないでしょうか?

638:デフォルトの名無しさん
07/08/14 16:19:05
>>637
date +%D %T
と実行してみろ。話はそれからだ。

>>636
それでは"が必要な理由の説明になっていない。

639:デフォルトの名無しさん
07/08/18 22:55:46
>>635
論点とは違うが、

PS1='\d \t \w \$ '

これと大差ない気がする。

640:デフォルトの名無しさん
07/08/20 08:41:29
>>639
それ移植性ある?(PS1に移植性も何もないが、移植性のある.profileとか
一時期凝ってたんで)


641:デフォルトの名無しさん
07/08/21 01:16:48
>>640
移植性というか、依存するのはシェルのバージョンだから、

URLリンク(www.linux.or.jp)

bash なら上の「プロンプト」の項に載っている奴は
少なくとも bash 2.05b 以降で使えるはず。

ついでに bash 3.2.17 の info を確認したら、二つ新しいのがあった。
これには移植性が無いって事だな。w

`\D{FORMAT}'
The FORMAT is passed to `strftime'(3) and the result is inserted
into the prompt string; an empty FORMAT results in a
locale-specific time representation. The braces are required.

`\A'
The time, in 24-hour HH:MM format.

642:デフォルトの名無しさん
07/08/22 01:59:47
echo $
とすると$が出力されるのに
echo $"" や echo $''
とするとなにも出力されなくなるのはどうしてなんでしょうか?

643:デフォルトの名無しさん
07/08/22 02:15:52
>>642
後者は$が変数参照の一部と見做されるから。
抑止するには$を''で囲むか\でエスケープすればいい。

644:デフォルトの名無しさん
07/08/22 02:31:25
>>643
>>後者は$が変数参照の一部と見做されるから。

変数名が空の文字列の変数を参照しようとするってことなんでしょうか?

645:デフォルトの名無しさん
07/08/22 11:25:41
そんなようなもんじゃない?
その割には、そんな変数は定義できないと思ったけど。

646:デフォルトの名無しさん
07/08/22 15:26:44
bash の話だと、 $"" と $'' は特殊な quoting の構文になってる。
zsh にも $'' はあるみたいだね。

647:デフォルトの名無しさん
07/08/28 19:47:15
man hogeの結果に対してgrepをしたい場合、どのように書けばいいのでしょうか?

648:デフォルトの名無しさん
07/08/28 21:41:37
うちのMacではそのまま man man | grep -i optionとかできるんだけど、
これって特殊?


649:デフォルトの名無しさん
07/08/28 21:51:12
>>647
PAGERをcatにしたらどう?

650:デフォルトの名無しさん
07/08/28 22:04:53
>>648
いやそんなことはないと思う
linuxとかでもそうでしょ

んでも、grep前にcol -bとかはさんだほうがモアベターだと思う

651:647
07/08/28 22:18:05
今の環境はUbuntuなんですが
デフォルトの状態でman hoge | grep "文字"
をやるとエラーか文字化けか再フォーマットしてます〜というメッセージが出て止まってしまう
みたいです。
言われたとおりPAGERをcatにしてみたら普通の文字はgrepできるようになったんですが、
man ls | grep -i
のように-iの行を見ようとすると

man: コマンドはステータス 13 で終了しました: /usr/bin/zsoelim /tmp/zman9mAoS0 | iconv -c -f EUC-JP -t UTF-8 | /usr/bin/tbl | /usr/bin/nroff -mandoc -Tutf8 | /usr/bin/col -b -p -x | /usr/bin/pager -s

このようなメッセージが出て終了してしまいます。

652:デフォルトの名無しさん
07/08/28 22:47:15
nroff -man manページのtroffソース | grep ...
はどう?


653:デフォルトの名無しさん
07/08/28 23:51:44
grep -e -i

654:647
07/08/29 09:18:30
>>652
実行してみると↓のようなエラーが出てきました。
普通にmanを実行するときちんと表示されるのに、それをリダイレクトしたりすると
文字化けするあたり、どこかがおかしいのだと思います。

653さんのようにやってみたところ日本語の部分が文字化けしてることを
除けばmanの情報をgrepできるようになりました。


655:デフォルトの名無しさん
07/08/29 10:30:44
>>654
grepで、オプション文字列と誤解されそうなキーワード(具体的には-で始まる)を検索する場合は、
-eなどでガードする必要があります。
なんてのは、シェルスクリプトと何にも関係ないマニュアルページを読めば済むことじゃないか。
鼬害だ、このすっとこどっこい。

656:デフォルトの名無しさん
07/08/29 12:51:20
おまいの選択している文字コードがmanファイルの文字コードと
違うんだから最初に LANG= で指定すると幸せになれるかもな。

657:647
07/08/29 15:05:01
>>655
すいません、すっとこどっこいでしたorz

>>656
ja_JP.UTF-8以外に設定するとmanが英語で表示されてしまうみたいです。
この際、英語中心で読むようにしていこうかと思います。



658:デフォルトの名無しさん
07/08/29 17:48:29
そうか。
ちなみに俺は euc.jp の文字コードを使っているので
普通にman manすると文字が化けるが
man -P cat man | grep man
で日本語の所もgrepでけたぞ。

659:デフォルトの名無しさん
07/09/02 21:33:33
bash並にファイル操作が簡単で普通に数値計算できる言語はないものかねえ

660:デフォルトの名無しさん
07/09/02 22:36:05
>>659
具体的にどんなものをイメージしている?
計算部分は別プログラムを呼ぶのじゃダメ?
awkでもperlでも、寧ろいっそ、octaveでも。

661:デフォルトの名無しさん
07/09/05 10:56:27
もう死にそうだからダメ元で助けてくれるえろい人頼ってみる

YYYYMMDDNNNN.hogeというバイナリファイルが山ほどあり、NNNN部分は連番ではなくばらばら
その中身を表示させるコマンドがある。表示内容が

--内容ここから
ヘッダ(ファイルにより行数ランダム)

1 : YYMMDD hhmm filesize
2 : YYMMDD hhmm filesize
--ここまで

YYYYMMDDNNNN.hogeのファイル名をYYMMDD.hhmmにリネームする
awkで頑張ってみたけどヘッダの行数が統一されてないせいでお手上げ
一つ一つ表示させてはcpでリネームしてるんだが死にそう。
空白行の次の行だけをテキストか何かに出力する方法というか書き方って無い?

662:デフォルトの名無しさん
07/09/05 11:20:04
>>661
sed -e '1,/^$d' -e q YYYYMMDDNNNN.hoge

663:デフォルトの名無しさん
07/09/05 11:20:56
訂正

sed -e '1,/^$/d' -e q YYYYMMDDNNNN.hoge

664:デフォルトの名無しさん
07/09/05 11:23:07
>>662-663
thx、やってみる

665:デフォルトの名無しさん
07/09/05 20:10:59
A="a\ta"
echo $A ってすると次のようにメタキャラクタが展開されちゃうんだけど
a[タブ]a
これをecho $A |コマンド で展開せずに使いたいの。

ノーミソたりなくてやり方がさっぱり!おしえてエロい人!
kshつかってます。

666:デフォルトの名無しさん
07/09/05 22:29:17
>>665
echo '$A' | こまんど
ってことか? シェルスクリプト以前の問題だと思うが。

667:デフォルトの名無しさん
07/09/05 22:39:13
>>665
板違い。エロイ人に聞きたいなら。
URLリンク(sakura01.bbspink.com)

668:デフォルトの名無しさん
07/09/05 23:14:51
>>665
sed 's/<tab>/\\t/g'
っていうことをしたいのだろうか


669:デフォルトの名無しさん
07/09/05 23:29:15
echo "${A}"

670:デフォルトの名無しさん
07/09/05 23:56:37
>>668
どうもありがとう!それです!
Winのディレクトリ表記が全部タブに変換されてこまってました。

671:デフォルトの名無しさん
07/09/21 16:39:07
とあるお気に入りのウェブサイトで、アドレスは一定のまま、
不定期に交換される画像(例えば URLリンク(www.example.com) ) を
毎日定時にチェックし、変更があったらそれをダウンロードし、
ファイル名にその日の日付を加えて保存する、という処理をさせたいです。
どのように書けばいいんでしょうか?

672:デフォルトの名無しさん
07/09/21 17:06:57
>>671
curl -I --header 'If-Modified-Since: Fri, 21 Sep 2007 09:00:00 GMT' URL

とかやって、HTTPステータスが 304 Not Modified かどうかを見る。



673:デフォルトの名無しさん
07/09/22 14:40:26
欧米エロサイトのサンプル画像取得か?

674:デフォルトの名無しさん
07/09/22 14:49:05
NASAのImage of the Dayとか。


675:デフォルトの名無しさん
07/09/22 17:02:35
>>672
別にHEADする必要なくね?更新確認と取得はHTTPならワンアクションで
できるわけで。

676:デフォルトの名無しさん
07/10/18 22:26:18
質問させてください。
main.shというシェルスクリプトがあり、
main.shの中で、sub.shを実行させています。
sub.shは、5秒くらいで処理が完了します。
その後に、last.shというシェルを実行させたいのですが、
シェルコマンドで、"○○秒待つ"といったコマンドはありますでしょうか。
環境はbashになります。よろしくお願いします。




677:デフォルトの名無しさん
07/10/18 22:33:10
sleep ミリ秒

678:デフォルトの名無しさん
07/10/18 22:35:13
そもそもsub.shは非同期なの?
終わるのを待てばいいだけの話だったりはしないんだよね?


679:デフォルトの名無しさん
07/10/18 22:37:01
>>676
sleep 5

あと、『シェルブリッド』 じゃなくて 『シェルブリット』 だから。
そこは絶対間違えないように。

680:675
07/10/18 22:44:34
>>677-679
ありがとうございます!
>>678
cronに登録したかったので
待つコマンドが無いかと思ってました。



681:デフォルトの名無しさん
07/10/18 22:47:19
ふと思ったんですが、sleepコマンド使うと、
PCのリソースを全て停止してしまうとかあるんでしょうか

682:デフォルトの名無しさん
07/10/18 23:29:41
ない

683:デフォルトの名無しさん
07/10/19 00:19:22
ふと思ったんですが、この方は自分で調べるとかないんでしょうか

sleepなんて基本中の基本じゃん。


684:デフォルトの名無しさん
07/10/19 01:02:09
main.sh
------------
#!/bin/bash
bash sub.sh
bash last.sh
------------

で、いいのではないかと思うのは気のせいか。


685:デフォルトの名無しさん
07/10/19 01:19:02
>>684
たぶん>>678も同じ疑問を持って書いたんだと思う。


686:デフォルトの名無しさん
07/10/19 09:31:43
>>683
sleep というコマンドを知らなかったとき、
この情報に辿り着くために必要な検索単語ってなんだ?

687:デフォルトの名無しさん
07/10/19 13:52:26
シェル 秒 待つ
URLリンク(www.google.co.jp)


688:デフォルトの名無しさん
07/10/20 00:00:31
シェルスクリプトの本くらい立ち読みでいいから流し読みしろよ。

流し読みで覚えられないなら買え。

それやった上でsleepなんぞ知らないって言うなら諦めろ。


689:デフォルトの名無しさん
07/10/20 08:04:10
usleep

690:デフォルトの名無しさん
07/10/20 12:16:49
usleepなんて無いだろw

691:デフォルトの名無しさん
07/10/20 17:44:38
何怒ってんのかね
気に入らなけりゃスルーすればいいのに


692:デフォルトの名無しさん
07/10/20 19:20:58
>>691
オマエモナーw


693:デフォルトの名無しさん
07/10/20 19:52:12
usleepのuがμのつもりだったと理解したときASCIIの世界に生きる人に同情した。


694:デフォルトの名無しさん
07/10/20 20:17:49
おいおい
そこまで意地張ったのになんでnanosleepなんだよ!!
かなり天邪鬼だ

695:デフォルトの名無しさん
07/10/21 22:04:14
>>693
マイクロは uC という表記方法もあるよ

696:デフォルトの名無しさん
07/10/21 23:15:22
>>695
結局それも「字形が似てるから代用」には違いないんでしょ?

697:デフォルトの名無しさん
07/10/21 23:46:50
μなんてDBCSローカルな文字つかって喜んでる椰子キモイ

698:デフォルトの名無しさん
07/10/21 23:50:13
μ(greek small letter mu)ならいいのか

699:デフォルトの名無しさん
07/10/22 10:48:43
技術系だと割と当たり前に使うけどなぁ。usecとかum、uFとか。或いは組み合わせでug/lとかも。

700:デフォルトの名無しさん
07/10/22 14:35:50
それだってu(ユー)にマイクロの意味があるわけじゃないだろ?
あくまでμの代用であることには違いないと思うが。



701:デフォルトの名無しさん
07/10/22 17:57:36
不毛だ

702:デフォルトの名無しさん
07/10/22 22:38:48
習慣

703:デフォルトの名無しさん
07/10/23 00:39:35
bashスクリプト中で
cmd echo "foo-san"
ってやると
echo "foo-san"
foo-san
って感じに、実行されるコマンドの内容が先に表示される関数って、定番なのありますか?
cmd() を echo $*;eval $* にしてみたけど、" とか ' とかの処理が旨くいかない。
DOS の echo on モードみたいのでもいいかも。

704:デフォルトの名無しさん
07/10/23 00:47:46
>>703
set -x

705:デフォルトの名無しさん
07/10/23 00:49:12
echo "." |xargs -t

706:デフォルトの名無しさん
07/10/23 09:52:26
>704
おーなるほど、そういうコマンドがあるのかー。勉強になりました。

>705
ありがとうございます。
でも echo つかうと、ダブルクォーテーションが表示されないのが、ちょっとかな、と。

707:デフォルトの名無しさん
07/10/23 11:10:16
>>706
set -v

708:デフォルトの名無しさん
07/10/24 21:03:29
親フォルダ内でシェルスクリプトを開いて、
Folder1に移動し、ABCを実行する。
1時間おきにプロセスABCがあるかチェックする。
終了したら、親フォルダに移動しFolder2でも同じことをする
というスクリプトを書いたんですけど、
whileのdoで文法エラーが出て困ってます。

#!/bin/sh

for i in 1 2
do
cd Folder$i
nohup ./ABC &

while[$isAlive -eq 1]
do 
sleep 1h
isAlive='ps -ef | grep " ABC " |\
grep -v grep | wc - |'
done

cd ..
done

709:デフォルトの名無しさん
07/10/24 21:18:40
while[$isAlive -eq 1]

while文の文法の一部ではない。
[というコマンドの最後に ] いう引数があるコマンド行(リスト)。
よって空白が必須。



710:708
07/10/24 21:31:41
>>709
whileのところはできました。
ありがとうございます。

今度は、forのdoがおかしいって出ました。
forのなかでwhile制御することってできないんでしょうか?


711:デフォルトの名無しさん
07/10/24 21:41:40
エラーメッセージ書いてー。

'(単一引用符)は`(逆向き単一引用符)の間違いだよな?
wc - |(マイナス、スペース、縦棒) は wc -l(マイナス、エル) の間違い?


712:708
07/10/24 22:21:55
10行目、doが、syntax error
です。って表示されました。

逆向き単一引用符で、wc -lエルです。
失礼しました。

713:708
07/10/24 22:24:03
連投すいません。
エラーは、forじゃなかったです。
whileのところでした。

714:デフォルトの名無しさん
07/10/24 23:01:32
もっかいきっちりコピペしろ

715:デフォルトの名無しさん
07/10/25 00:23:06
俺が同じマシン使ってたらABCという名前で永久に終了しないプログラムを動かしてやる。

716:708
07/10/25 03:03:38
>>714
ごめんなさい。もいっかい書き直します。
これの、whileのdoで文法エラーがでます。

>>715
永久に終了しない・・・作ってほしい

#!/bin/sh


for i in 1 2

do

cd Folder$i

nohup ./ppln &


while[ $isAlive -eq 1 ]

do

sleep 1h

isAlive=`ps -ef | grep " ppln " | grep -v grep | wc -l`

done

cd ..

done

717:デフォルトの名無しさん
07/10/25 04:58:38
>>716
while と [ の間にスペースが足りないのはコピペミスだよね?

最初の while のチェックの時に $isAlive が未定義。
で、 [ コマンドが引数が足りないってエラーを吐く。
だから [ コマンドに与える変数はクォートで括っておくが基本。

while [ "$isAlive" -eq 1 ]

あと pgrep があれば while の処理はもっと簡単に書けるよ。

718:デフォルトの名無しさん
07/10/25 08:21:46
ただ、>>715 がいうように、
既に誰かが同じ名前の無関係なプロセスを走らせていたらどうする?
「永久に」っていう細かいところでただの煽りとか思わずに、本質読み取らなきゃ。

719:708
07/10/25 16:02:00
>>717
ご指摘通りに作り直したら動きました。修正したものを張っときます。

>>718
おっしゃるとおりです。全然見えてませんでした。
実際に、スクリプトの名前を”ABC-sc.sh”としたら、
プロセスの出力が”2”とされてしまい、うまくいきませんでした。
もうちょっと改良について考えたいと思います。
プログラミングとかLinuxは初心者で、まだまだ勉強しないといけないって感じてます。


#!/bin/sh
for i in 1 2
do
cd Folder$i
nohup ./ABC &

sleep 20
isAlive=`ps -ef | grep "ABC" | grep -v grep | wc -l`

echo "$isAlive"
while [ "$isAlive" -eq 1 ]

do
sleep 1h
isAlive=`ps -ef | grep "ABC" | grep -v grep | wc -l`
echo "$isAlive"
done
cd ..
done

720:デフォルトの名無しさん
07/10/26 01:12:26
>>719
$! という変数は知ってる?

nohup ./ABC &
echo "$!" # ← ABC の PID が表示される

これなら >>718 の罠にはかからないよ

721:デフォルトの名無しさん
07/10/26 09:35:42
バックグラウンドで動かす意味なくね?

722:デフォルトの名無しさん
07/10/28 21:40:09
引数に対応した干支を表示するシェルスクリプトを
Bshellで作成したいのですが、作成方法を教えて頂けないでしょうか?

723:デフォルトの名無しさん
07/10/28 22:31:24
eto=`expr ¥( $1 + 8 ¥) % 12`
年は西暦。子年を0にしたかったので8を加えてある。


724:デフォルトの名無しさん
07/10/29 12:33:07
>>719
ps -efではなく、psのフォーマット指定を使えば混乱が減らせると思う。
# >720も手だけど。
ps -efだと、例えば引き数が"ABC"なプロセスでも混乱してしまうよ。

725:デフォルトの名無しさん
07/10/31 01:21:20
>>716
初心者のくせに我輩を煽るとはいい度胸してるな。おととい来やがれ。
度胸に免じて、厨房どもに一つテクを授けてやろう。

kill -0で生存確認しろ。

726:デフォルトの名無しさん
07/12/04 08:34:30
質問お願いします!
適当なファイルを作ってその中には数字を記述しておいて、キーボードからそのファイルを読み込んで、その記述してある数字に+2を行った結果を画面上に出力するというシェルを作りたいのですが、どのようにすればよいか教えていただけませんでしょうか?

readとループ文を使って作りたいんですが自分で調べてもあんまりわかったんでみなさんのお力をお貸しいただけないでしょうか?

727:デフォルトの名無しさん
07/12/04 10:07:29
#!/bin/sh

read num
while `test $num`
do
echo `expr $num + 2`
read num
done

ちょっと違うか。

728:デフォルトの名無しさん
07/12/04 11:34:29
awk使っていいなら凋落。
awk '{print $1 + 2;}' 適当なファイル

729:c
07/12/04 13:14:06
% cat x
100
% cat add2
#!/bin/sh
num=`cat $1`
expr $num + 2
% ./add2 x
102



730:デフォルトの名無しさん
07/12/04 13:18:06
ん? こっちか?
% cat x
100
200
500
% cat add2
#!/bin/sh
exec < "$1"
while read num
do
  expr $num + 2
done
% ./add2 x
102
202
502



731:>>726
07/12/04 14:04:57
>>727 >>728 >>729 >>730
回答サンクスです!
いろいろな考え方ができるのですね。勉強になりました。
ぜんぶやってみたいと思います。助かりました!ありがとうございます。

732:デフォルトの名無しさん
07/12/05 00:36:45
シェルってゆうな。クズ。

733:デフォルトの名無しさん
07/12/06 20:46:08
>>732
やっぱりフルネームで言わなきゃ駄目なのか?

734:デフォルトの名無しさん
07/12/06 21:02:25
まあそれ抜きにしてもアレだろ

735:login:Penguin
07/12/07 18:11:42
午前2時まで、pingを10秒ごとに打ちたいのですが
きれいな書き方おしえてください

736:デフォルトの名無しさん
07/12/07 18:29:03
# crontab
*/10 0-1 * * * ping toTarget

737:デフォルトの名無しさん
07/12/07 18:32:54
いけね、10分ごとにしちまったw おまけにpingが無期限実行だぜ。

つーことで訂正。
# crontab
0 0 * * * ping -i 10 -c 720 toTarget

738:735
07/12/07 18:35:34
>>737さま
ありがとう!

739:デフォルトの名無しさん
07/12/13 10:55:42
既にシェルスクリプトじゃなくてUNIXよろず相談室だな(w

740:デフォルトの名無しさん
07/12/22 18:52:32
Linuxのpasswdみたいにコマンドを打った後に出てくる質問に答えていく場合は
#!/bin/sh

passwd aaaa
pass
pass
とかじゃ無理みたいなのですが、どうすればいいのでしょうか?

741:デフォルトの名無しさん
07/12/22 20:04:22
ホントによろず相談室だなぁ……

>>740
リダイレクトでもしてみたら? passwdコマンドがリダイレクトを受け付けるとも思えないけど知っておいて損はないし。

742:デフォルトの名無しさん
07/12/22 20:19:44
>>740
対話的処理をしたいときは expect

743:デフォルトの名無しさん
07/12/22 21:11:49
>>740
Tclに嫌気が差したら Expect.pm (Perl)

744:740
07/12/23 00:02:58
>>742
で以下のようにしてみたのですが
#!/bin/sh

passwd testid
expect \"*:\"
send "test\n"
expect \"*:\"
send "test\n"

cronのメールで
useradd: user testid exists
New UNIX password: New UNIX password: New UNIX password: passwd: Authentication information cannot be recovered
Changing password for user testid.
aaaa: line 6: expect: command not found
aaaa: line 7: send: command not found
aaaa: line 8: expect: command not found
aaaa: line 9: send: command not found
といわれました。
expectが見つからない・・?何か入れる必要あるんでしょうか?

745:デフォルトの名無しさん
07/12/23 00:32:51
cronから起動されるときのPATHがどうなるかmanで勉強する。

which expectしてみる。
$PATHの値を見てみる。
locate expectしてみる。
パッケージ管理システムを使ってるならそれを使ってインストールされてるか見てみる。(rpm系Linuxのrpm -q expectみたく)
/usr/localや/optなどのそれっぽいディレクトリの下のどこかにあるのかもしれない。

あと、expectの使い方って

expect -c "
...
spawn passwd #パスワードコマンド起動
expect ログイン要求を待つ
send ログイン名
云々
"

じゃなかったっけ?


746:740
07/12/23 14:11:46
>>745
ズバリですね。yum install expectとしたらインストールされていないらしく入れますか?と。
expect -c "
spawn passwd id
expect \":\" ; send 〜でできました。
大変参考になりました、ありがとうございます。

747:デフォルトの名無しさん
07/12/29 11:20:36
初心者的な質問で,申し訳ないです。
ヒアドキュメントで変数に代入する方法がわからなくて。

list=<<EOT
A
B
C
EOT
echo $list

としても$listには何も代入されなくって。

748:デフォルトの名無しさん
07/12/29 11:33:39
ヒアドキュメントは、PerlやらRubyやらでは変数への代入に使うけど、
シェルスクリプトでは、コマンドの標準入力をすげ替えるモノじゃないかな。


749:747
07/12/29 12:23:18
>>748
なるほど,標準入力のかわりだったのですか。
ということで

read list <<EOT #--> A

としたらという結果。あともう一歩というところまできました。


750:747
07/12/29 12:38:15
とりあえず
while read line; do list="$list $line";done <<EOS
A
B
C
EOS
echo $list


ん〜,改行がなくなってしまう...

751:デフォルトの名無しさん
07/12/29 13:21:26
そりゃぁ、echoすれば改行は消えるね。

752:デフォルトの名無しさん
07/12/30 21:26:09
>>750
ダブルクォートをつけてみな。

echo "$list"


見た目がいまいちかもしれんが、こうやって代入する事もできるよ

list='A
B
C'


753:デフォルトの名無しさん
08/01/01 18:50:43
zshとbashじゃそこの挙動違うんだな

754:デフォルトの名無しさん
08/01/02 15:16:56
シェル初心者ですが
pingして反応が無かったらまたAにGOTOして
というのを書いているつもりなんですが
これをcronで実行させると
A:: not found となります。
GOTOさせる場合の正しい書き方を教えてください

#!/bin/sh
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
HOST=192.168.1.6
TIMEOUT=5

A:;
/sbin/ping -t $TIMEOUT -o $HOST
if [ $? != 0 ]; then
goto A;
else
/bin/echo "$HOST is Alive!"
fi


755:デフォルトの名無しさん
08/01/02 16:35:27
あっ、gotoでなくてもいいのか
こうすればいいてことですね

while [ $? != 0 ]
do
/sbin/ping -t $TIMEOUT -o $HOST
done


756:デフォルトの名無しさん
08/01/04 05:20:05
>>755
すでに解決しているようだが、こんな書き方もできる。

until /sbin/ping -t $TIMEOUT -o $HOST
do
:
done

757:デフォルトの名無しさん
08/02/09 17:00:30
自分に渡されたコマンドオプションをそのままほかのコマンドに渡したいのですが
うまくいきません

runruby.shに
cmd=ruby
${cmd}" $@"
と書いて
./runruby -e 'puts "Hello"'を実行すると
ruby: No such file or directory --  -e (LoadError)と言われてしまいます


758:デフォルトの名無しさん
08/02/09 17:11:50
>runruby.shに


>./runruby -e 'puts "Hello"'を実行すると
runruby.shはどこに行った?
それと、そのrunruby.shによるとrubyに" -e"を渡すことになるぞ。

759:757
08/02/09 17:18:29
>>758 申し訳ございません 間違いました
./runruby.sh -e 'puts "Hello"'でした

runruby.shの内容を
cmd=ruby
${cmd} ${@}
にしてみたらエラーメッセージはでなくなったのですがHelloも表示されず終了しましたorz

760:デフォルトの名無しさん
08/02/09 17:22:54
なんで"$@"にしないの?

761:757
08/02/09 17:31:24
>>760
できました!!
ありがとうございます

762:デフォルトの名無しさん
08/02/09 17:33:10
つまり、rubyコマンドはコマンドライン引き数の先頭が空白だとファイル名と看做すってことか。

763:デフォルトの名無しさん
08/02/09 17:39:39
bashでしか試してないけど、、、
${cmd}" $@" -> "ruby\ -e" "puts \"Hello\""
$cmd "$@" -> "ruby" "-e" "puts \"Hello\""
"${cmd} $@" -> "ruby -e" "puts \"Hello\""
"${cmd}" "$@" -> "ruby" "-e" "puts \"Hello\""

"$@" -> "$1" "$2" ...
"str$@" -> "str$1" "$2" ...
"str $@" -> "str $1" "$2" ...
って感じで展開されているのかな?

764:デフォルトの名無しさん
08/02/09 17:42:01
3つ目、
x "${cmd} $@" -> "ruby -e" "puts \"Hello\""
o "${cmd} $@" -> "ruby\ -e" "puts \"Hello\""

765:デフォルトの名無しさん
08/02/09 17:59:05
よく見たら、 "$@" じゃなくて " $@" なのかよ。


766:デフォルトの名無しさん
08/02/11 18:09:03
configureでif test x"$enable_shared" = xyes; thenっていうふうに
xを付け加えて比較してるのをよく見るのですがxはなんのためですか?

767:デフォルトの名無しさん
08/02/11 18:12:40
空文字列のときも大丈夫にするためかな
xつけないとtestで構文エラー出ちゃうでしょ?

768:デフォルトの名無しさん
08/02/11 18:13:32
$enable_sharedがマイナスで始まってる場合を考慮……はconfigureでは不要か。


769:デフォルトの名無しさん
08/02/12 01:38:48
変数をクォートしないとこうなるけど、この場合は関係ないか

$ x='-n 3 -o 1'
$ if test $x = 1; then echo ok; fi
ok


770:デフォルトの名無しさん
08/02/15 18:24:02
echo `df`
だと1行で出力されて
echo "`df`"
だと複数行出力になるのはなんででしょうか?

771:デフォルトの名無しさん
08/02/15 19:00:26
>>770
echo "foo
bar"
のようにダブルクォートの中では、改行が区切り文字にならなくなるから

772:デフォルトの名無しさん
08/02/15 19:44:39
>>771
ああ、そうか。改行って""の中だと改行として有効なのか。
ふむ、""がないと、単なる区切りになっちゃうわけですね。


773:デフォルトの名無しさん
08/02/15 22:27:13
>>767-768
configure普通autoconfで自動生成するから、
ハイフンで始まっていたり=だったりするのを考慮したコードが
不必要な部分でも出てくるだけ。

774:デフォルトの名無しさん
08/02/16 02:22:13
自分が所持している映画のDVDのリストを整理しているのですが、
CSV形式で、例えば次のようになっている時に、

"jean-luc godard","1967 week end"
"jean-luc godard","1965 pierrot le fou"
"jean-luc godard","1960 a bout de souffle"



"Jean-Luc Godard","1967","Week End"
"Jean-Luc Godard","1965","Pierrot Le Fou"
"Jean-Luc Godard","1960","A Bout De Souffle"

と一括変換したいのですが、どのようにすればいいのでしょうか?
やりたいことは、
1). まず、2番目のフィールドが"制作年 タイトル"となっているのを"制作年","タイトル"に分けたいのと、
2). 次に、総ての単語の頭文字を大文字にしたい、
ということなんです。

1). は sed で何とかなりそうなのですが、2). が分かりません。

どなたかお助け下さい。
あるいは他に正しいスレがあるようでしたら誘導をお願いします。

775:デフォルトの名無しさん
08/02/16 02:24:27
すみません。やはり 1). もよく分かりません。
どなたか助けてください。お願いします。

776:デフォルトの名無しさん
08/02/16 02:34:45
手抜きですが
perl -pe 's/\b(\w+)/\u$1/g; s/"(\d+)\s*/"$1","/'

777:デフォルトの名無しさん
08/02/16 03:11:07
ただシェルじゃないんだよなそれだと。。。
俺もPerlとかでしか思いつかないけど

778:デフォルトの名無しさん
08/02/16 03:14:45
>>774
シェルスクリプトだけでは無理でも(1)も(2)もawkでできますね。
取り敢えず(1)はこんな感じ。
awk -F, '{$2 = substr($2, 1, 5) "\",\"" substr($2, 6);} {print;}'

779:デフォルトの名無しさん
08/02/18 01:45:59
[root@hoge admin]# ls -l | grep forward
-rwsr-xr-x 1 root admin 300 2月 18 01:16 setforward.sh
[root@ibm admin]# cat setforward.sh
#!/bin/bash
# set variable
PATH=/home/
USER=$1
ADDRESS=$2

cd $PATH$1

cat << EOF > .forward
"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1"
EOF

cat << EOF > .procmailrc
:0 c
! $ADDRESS
EOF

[root@hoge admin]# ./setforward.sh admin test@example.jp
./setforward.sh: line 14: cat: command not found
./setforward.sh: line 20: cat: command not found

CentOS5.0です。
一般ユーザに、他のユーザの転送設定をさせたいと考えています。
こんな感じでcatコマンドが無いと言われてしまいます。
そのくせ、空っぽの.forwardと.procmailrcファイルが作成されます。
なぜcommand not foundになってしまうんでしょうか?

780:デフォルトの名無しさん
08/02/18 01:51:29
PATHは使っちゃだめよ

781:デフォルトの名無しさん
08/02/18 02:05:32
環境変数PATHはコマンド(実行ファイル)を検索するためのものだから、
違う変数名にしないと駄目よ。


782:デフォルトの名無しさん
08/02/18 02:13:29
>>779
大文字の変数は環境変数で使われる事が多いから
小文字を使った方がいいよ。

783:デフォルトの名無しさん
08/02/18 08:42:13
>>779
自分で勝手にサーチパスを潰しておいて、見つけてくれないと文句を言うとはなんてぇゆとりだ。

784:779
08/02/18 13:10:40
>780-783
ありがとうございます。 m(_ _)m

続けてもう一つ・・・
-rwsr-xr-x 1 root root 300 2月 18 01:16 setforward.sh

このシェルを動かして、一般ユーザで
他の一般ユーザの転送設定をしようとすると、
「cd」のところで"/home/user: 許可がありません"と
弾かれてしまいます。
SUIDをつけてあるのに、何がいけないんでしょうか?

またまたよろしくお願いします。


785:デフォルトの名無しさん
08/02/18 13:26:00
mount nosuid されてるとか。

786:デフォルトの名無しさん
08/02/18 13:38:28
>>784
別に cd する必要ないんじゃないか?

#!/bin/bash
# set variable
path=/home/
user=$1
address=$2

cat << EOF > "$path/$user/.forward"
"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1"
EOF

cat << EOF > "$path/$user/.procmailrc"
:0 c
! $address
EOF

787:デフォルトの名無しさん
08/02/18 21:46:42
OSによってはスクリプトのsuidを意図的に無視するモノがある。
Linuxとか。


788:779,784
08/02/19 01:49:15
>785-787
ありがとうございます。

/etc/fstabのマウントオプションは、「defaults」でした。
明示的に「async、auto、dev、exec、nouser、rw、suid」
としてみましたが、ダメです。

そして>786氏のスクリプトもダメでした。
最初のcatで弾かれます。

しかも786氏スクリプトは、ユーザ自身の転送設定を
しようとすると、.forwardファイルが
「"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1"
EOF

cat << EOF > "$path/$user/.procmailrc"
:0 c
! $address
EOF」となってしまい、 .procmailrcファイルは作成されませんでした。

引き続きよろしくお願いします。

789:デフォルトの名無しさん
08/02/19 04:03:08
>>788
最初の EOF の前後にごみが入ったんじゃないか?
まあ、見栄えを気にしないのなら echo でもいいけどな。

echo > "$path/$user/.forward" "\"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #$1\""
echo > "$path/$user/.procmailrc" ":0 c
! $address"

> 最初のcatで弾かれます。
原因は多分 >>787

790:779,784
08/02/20 04:11:45
さっき本屋で分かっちゃいました。

CentOS徹底入門 第2版
URLリンク(www.amazon.co.jp)
に書いてありました。
>787さんの通りでした。

なんとかならんものか、CentOSスレッドででも
質問してみます。
ありがとうございました。


791:デフォルトの名無しさん
08/02/20 10:25:28
>>790
sudo を(きちんと設定して)使えば。

ていうか、一般ユーザに他のユーザの転送設定をさせる理由がわからん。

792:779,784
08/02/20 14:07:08
>791
ありがとうございます。

自社でちっさいデータセンタを持っています。
で、その中に他の会社のドメインと同居してるんです。

複数ドメインを管理するGUIのソフトが未熟で、
会社に届いたメールを携帯に転送する場合があるんですが、
転送すると全部そっちに転送されちゃうんです。
それを回避するには、今のところCUIで手書きして
あげるしかないんです。

私は情シス部隊所属、DCは開発部隊のもの。
与えられたドメインごとの管理者ユーザは、CUIだと
他のユーザの$HOMEに入れないんですよ。
それで、SUIDつけたスクリプトならイケるんじゃないかと
考えた次第です。

なんか表現が未熟ですがご理解いただけましたでしょうか?


793:デフォルトの名無しさん
08/02/27 12:09:36
教えてください
日付の切り出しかたわかりません
data.txt
2/1 XXXXXXXX
2/2〜2/5 XXXXXXXXX
2/7〜2/8 XXXXXXX
2/12 XXXXXXXXXX
2/20〜2/28 XXXXXXXXX

と書かれた行があり 今日より以前の日付の行を削除するにはどうすればいいですか

正規表現板で聞いたのですが正規表現の問題と言うよりプログラムの方でたずねる
みたいナノデ
日付に〜が入っているためなおさら難しくさっぱりわかりません

794:デフォルトの名無しさん
08/02/27 13:02:15
シェルスクリプトで実装するのか?そうでないならスレ違いだが

795:デフォルトの名無しさん
08/02/27 15:19:20
>>792
今日より以前を削除とは?

今日が2/27で
2/5〜2/28 xxxxxx
というデータを

2/27〜2/28 xxxx
にしちゃうのか、そのまま生かすのか?

796:デフォルトの名無しさん
08/02/27 16:57:32
初心者な質問ですみません。
あるディレクトリの中に数百のファイルがあり、
AAA_01.txt
AAA_02.txt
...
のようなファイル名になっています。

それを、下記のように、AAAの箇所をDATE関数で日付を取得したいのです。
20080226_01.txt
20080226_02.txt
...

どのようにすればよろしいでしょうか。


797:デフォルトの名無しさん
08/02/27 17:15:22
>>796
日本語で

798:デフォルトの名無しさん
08/02/27 17:27:00
>>795
今日が2/27だと
2/20〜2/28 XXXXXXXXX
の行を残してそれ以前の日付の行を削除したいのです。

799:デフォルトの名無しさん
08/02/27 22:02:38
あーなるほど、PIMのスケジューラみたいなものを考えているってことか。
シェルスクリプトだけでどうこうできるフォーマットじゃないし、チルダの所為で
awkかなんかの一行野郎で済ませることも難しそうだ。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5114日前に更新/248 KB
担当:undef