1 :
名無しさん@お腹いっぱい。 :
2008/05/20(火) 20:58:04 シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(
>>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 でトレースしましょう。
シェルスクリプト総合 その10
http://pc11.2ch.net/test/read.cgi/unix/1202725267/
□関連書籍と関連リンク:
FreeBSD Hypertext Man Pages
http://www.freebsd.org/cgi/man.cgi Linux JF (Japanese FAQ) Project.
http://www.linux.or.jp/JF/ Unix Programming Frequently Asked Questions 日本語訳
http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html UNIXプログラミング環境
http://www.amazon.co.jp/exec/obidos/ASIN/4871483517/ □人間初心者へのお願い:
・このスレはシェルスクリプトについてのスレです。
シェルの対話的な利用についての話やスクリプトと関係ないコマンドの
使い方の質問などはスレ違いなので無用に願います。
□シェルスクリプトでよく使うコマンド:
制御・条件判定系: [,test,expr,true,false,yes,getopts
テキスト処理系: cat,awk,sed,tr,sort,uniq,grep,wc,head,tail,cut,paste,comm,join
ファイル検索系: find,xargs
(スペースなどを含むファイル名を正しく処理するため、
findは -print0、xargsは -0オプションを常に付けることを推奨
ただし、Solarisでは未対応。どうするんだろ?)
ディレクトリ系: basename,dirname
出力系: echo,printf
対話コマンド制御系: expect
http/ftpの処理自動化: wget,curl
シェルにはAシェル系、Bシェル系、Cシェル系、と種類があるようですが、 僕のPCのシェルはXtermというものみたいです。 これは、シェル系に当てはめると何シェル系なんでしょうか?
>>7 端末(端末エミュレータ)とシェルは別の存在。
あなたは端末エミュレータの中でシェルを動かしているはず。
echo $SHELL
solarisのdfとかduで、サイズをギガ表記にしたいんだけどスクリプトでちょちょいとできないですかね?
solaris10以降は、-hオプションがついてる。
-hがないんですよ バージョンは失念しました
SolarisのdfってBLOCKSIZEはみないのか?
$(command) 1より `command` が推奨なのってなんで?
SunOSとかNEWS-OSとかでも動くから
1 が不要だから。
コマンドをパイプで複数実行する際に最初のコマンドでエラーだったら その後のパイプ以降は実行しないというのは可能ですか?
パイプってのは、あるコマンドを実行してそれが終わったら出力を 次のコマンドに流して、という仕組みではない。 どうしてもそういうことがやりたければパイプを使わない。 commandA > tmpfile.$$ && commandB < tmpfile.$$ # unix ではなく dos のパイプはこういう仕組みだったりする。
シェル用語では、コマンド1個だけでもパイプラインと言う。
パイプライン1(=command1)がエラーなら
パイプライン2(=command2)を実行しないのなら、
command1 && command2
でよい。
>>18 は command1 と command2 の標準入出力を、
pipe(2)でつなぐとは言っていないのだから。
こじつければ(形式的には)個々はパイプラインかもしれないが、 「パイプで複数実行」には到底ほど遠いだろう
22 :
名無しさん@お腹いっぱい。 :2008/05/22(木) 21:37:11
質問させてください。 a.txtファイルにbbbと言う文字があった場合、その文字を完全に削除するにはどうしたらいいでしょうか? ----- aaa bbb ccc ----- 例えばa.txtの内容が上ようなとき、下のように置換したい。よろしくお願いします。 ----- aaa ccc -----
grep -v bbb a.txt>b.txt
>>23 すみません。それをa.txtに保存したいです。
(rm a.txt; grep -v bbb > a.txt) < a.txt
$ sed -e '/bbb/d' -i '' a.txt
>>25 すみません。iノード番号を変えずに保存したいです。
>>26 ありがとう!sedでやりたかったです。
でもsedは使えるはずなのにエラーが出てしまいました。
エラー「sed: を読み込めません: そのようなファイルやディレクトリはありません」
バージョンが違うのでしょうか?ちなみにLINUXでやってます。
あ、できました。 sed -i '/bbb/d' a.txt みなさん初心者にも親切に教えてくれてやさしいですね。 ありがとうございました。
>>29 おいおい、
sed -i '/bbb/d' a.txt
だと i-node番号変わるぞ。i-node番号変えちゃ駄目(
>>27 ) じゃないのか?
それは俺の創作だ。正直すまんかった。
>>22 >>27 iノード番号を変えずに a.txtを修正する方法の正解の md5を貼っておくぞ。
25fe9a9dfa4248593f6aa361db01a222
さあ、オマエラ考えてみろ。
cat a.txt > tmp; sed '/bbb/d' tmp > a.txt; rm tmp
なんでiノード番号変わっちゃだめなの?
>>34 a.txtが他のファイルとハードリンクしていた場合、
sed -i とかだとハードリンクが切れてしまう。
printf "g/bbb/d\nwq\n" | ed a.txt
>>36 sed -iって、viなんかで編集するのとは違う理屈で動いているってことかな?
GNU sedのソースを見てみたが、inplace編集では、テンポラリファイルを 開いて書き込んだのちリネームしているね。 sed-4.1.5/sed/execute.c:658 (開く方) sed-4.1.5/sed/execute.c:712 (閉じる方)
オーナーを保存できないじゃないか
41 :
名無しさん@お腹いっぱい。 :2008/05/25(日) 08:58:02
カレントディレクトリに、 hoge-1.22.3.tar.gz hoge-1.23.tar.gz hoge-1.24.1.tar.gz fuga-3.31.1.tar.gz fuga-3.5.4.tar.gz : みたいなソースのtarボールがたくさんあります。 これらのファイルのファイル名を見て、 最新バージョンだけ残して、最新以外のファイルを削除するシェルは どうやったら発行できますか? なお、タイムスタンプは当てにならないので、 あくまでファイル名だけで判断してください。
シェルってゆうな。クズ。 発行ってゆうな。クズ。
定番の突っ込み乙。で回答は?
>>43 そもそも最新バージョンとそれ以外を同じところに溜めたのが間違い。
パッケージ名の定義、バージョンの新旧の定義をしろ。
断る。
×断る。 ○能力不足のためできない。
「答えられないなら黙ってろ」というポリシーは変えたのか? www
ぽまいら へるぷ! hoge0501-0000.wav hoge0501-0100.wav hoge0501-0900.wav の複数ファイルをmp3で小さくしたいのですよ hoge0501-0000.wav → hoge0501-0000.mp3 ってか0000の部分を0000のままにしたいのですが… なんかいい知恵を!!! おながいします lameとかgogoの使い方は大丈夫ですw
>>52 infile=hoge0501-0000.wav
outfile=`basename $infile .wav`.mp3
あとは lameとかで $infile と $outfile を参照。
>>52 おお、ファイル名そのものを変数としるのね
dクス! さっそくやってみます!!
あのぉ〜。。。。。
>>53 を連続で処理するには?
for infile in "$@";do outfile=`basename $infile .wav`.mp3; 変換する ;done
57 :
便乗炭! :2008/05/26(月) 00:17:11
>>56 ご丁寧にありがとうございます orz szo ヘコヘコ
58 :
名無しさん@お腹いっぱい。 :2008/05/27(火) 18:01:23
質問です。 if文で現在起動中のデーモンを確認するにはどうしたらいいでしょうか?
そんな事どうだっていいだろうがカス
図星かw
pgrepは戻り値返すよ。 if pgrep hoge; then 何か fi で桶。
>>64 pgrep で確認してるのであって、if で確認してるわけじゃないと思うが。
>>66 本人がいいって言ってるんだから、それがすべて
>>66 Cでも何でも条件で確認して、ifはその結果で分岐するだけだと思うが。
69 :
名無しさん@お腹いっぱい。 :2008/05/28(水) 21:18:30
1から100までの乱数を得るとかってでないですかね
>>69 echo $((RANDOM*100/32768+1))
ありがとうございます 変数であるんですね ちなみに32768というのは?
2の15乗。15bit乱数だから。
bash依存乙w
だからksh由来だと何度(ry
純正シェルだとどうやるの?
純正ってナニ?
bshじゃないか? bashじゃ無いオリジナルの
むかし、Bee Shell(ミツバチシェル)ってのを使ったことがあるせいか、 Bourne Shellのことはshか/bin/shと書いた方がいいような気がする。
sh が bashのリンクになってるのって最近のlinuxだけ?
>>79 HP-UXやAIXはksh改変版が使われている。
なんで、kshで拡張された便利機能もほとんど使えるようになっている。
>>80 UbuntuやDebianの/bin/shはdash
能書きはいいから、純正シェルでのやりかた答えろ
純正シェルなんて言葉どこで覚えてきたんだ?
はーーーーーーい
89 :
69 :2008/05/29(木) 10:47:07
すいません
>>79 をループして繰り返すと
3
20
43
70
81
10
15
49
60
87
みたいに1から100の間で増えて戻って増えてを繰り返します
この規則性をなくせないですか?
>>89 echo $(($(head -c 2 /dev/urandom | od -An -d)*100/65536+1))
おお 意味はまったく理解不能ですがこれでいけそうです ありがとうございます
純正シェルではどうやるの?
純正シェルでは rm /bin
わからないならオナってろ
>>92 いちいち五月蝿いよ。
よりポータブルに直したい奴は、直して自分で書けばいいよ。
>>99 >1
> bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
って事なんじゃね。
つまり嫌味を言いながら実はこの決まりを代行してるツンデレ。
あと>92-94は>73-76の74が足りないな。おしい。
うるさいのが一人いるなッ
ッ
でも、言ってることは正しいな 書くべきだよねえ
>>100 明記できる奴は明記すればいい。
ポータブルに直せる奴は直せばいい。
>>92 みたいな屑が一番邪魔。
質問者が環境をちゃんと書けばいいんだよ。
質問者の環境にかかわらず、純正シェルで動くことが条件。
質問テンプレ 使っているOS名・バージョン: (※LinuxユーザはLinux板へ) 使っているシェルの名前・バージョン: 使っているシェルのフルパス: 移植性: 上記環境で動けば十分 / 多くの環境で動かす必要がある
GNU/Linux, *BSD使い始めたころから補完ができるってだけの理由で特に理由もなくBash使ってるけど 他に何か良いShellないかな。 Bashに特に不満はないけど。
zsh使ってみれば
>>109 氏からの回答が欲しい場合は
>>109 に従ってね。
でも俺はエスパーだから、OSとかバージョンとか書かなくても回答できちゃうよ。
気軽に質問してね。もち、Linuxユーザーの質問もOK。
114 :
名無しさん@お腹いっぱい。 :2008/05/30(金) 11:41:59
カレントに移動しないと起動できないソフトがあります。
これを、カレントを移動しなくて済むようにするシェルはできませんか?
>>109 さん以外の方、回答をよろしくお願いします。
CentOS bin/bashの条件式での質問です。 前提としまして、file1、file2、file3、file4という似たファイル名が 複数あるとします。 そこで条件式内で、[ -e file* ] というようなfileから始まるファイルに一致させたいのですが どのように記述したら宜しいのでしょうか?
>>115 そういう場合はlsの戻り値を使う。
if ls file* > /dev/null 2>&1 ; then
hoge
fi
>>116 スレ間違えてしまいすいません、誘導ありがとうございます。
>>117 lsの戻り値を条件式で使えたとは盲点でした。多少分からない
箇所がありますので調べつつ挑戦します。ありがとうございました
>>114 普通に、
#!/bin/sh
cd /path/to/hoge
exec ./hogesoft "$@"
で桶。cdしてしまうように見えるが、シェルスクリプト自体が別シェルなので
カレントディレクトリは実行時のディレクトリから変わらない。
こんなスクリプトを書いてプロセス監視&常時起動させていますが、 数時間走らせると、★の行を食ったまま、停止してしまいます。 orz 原因&解決策か、もしくはタイムアウトを設定する方法を ご教示いただけませんでしょうか。。 #!/bin/sh while true do ★ret=`ps -ef | grep "collector.php" | grep -v grep | wc -l` if [ $ret -eq 0 ]; then php /hoge.php & fi sleep 1 done
pgrepないの?
>>122 まず、wc -lしたりretに代入したりしてるのが無駄。
grepは戻り値返すから、
if ps -ef | grep "collector.php" | grep -v grep > /dev/null; then
で桶。
>>122 発想を転換しろ。
もし、php /hoge.phpを起動して、落ちたら再度起動、ってやりたいだけなら、
while :
do
php /hoge.php
done
だけでOK。&は付けない。sleepもpsも必要なし。
>>123 ,124
ありがとう、おっしゃる通り。
試してみます。
>>125 惜しい。
実はhoge.phpは1種類ではなく、3種類存在します。
実際はret〜fi間が、3個あり、hoge1.php〜hoge3.phpを対象にチェックしています。
#
>>122 のコードで、collector.phpとhoge.phpは同一です。コピペミススマソ。
#!/bin/sh
while true
do
★ret=`ps -ef | grep "hoge1.php" | grep -v grep | wc -l`
if [ $ret -eq 0 ]; then
php /hoge1.php &
fi
★ret=`ps -ef | grep "hoge2.php" | grep -v grep | wc -l`
if [ $ret -eq 0 ]; then
php /hoge2.php &
fi
★ret=`ps -ef | grep "hoge3.php" | grep -v grep | wc -l`
if [ $ret -eq 0 ]; then
php /hoge3.php &
fi
sleep 1
done
hoge1.php の終了を待たずに hoge2.php や hoge3.php の
プロセスチェック&起動を行いたいため、末尾に&を付けている次第です。
hoge1.php〜hoge3.php毎にシェルスクリプトを3個作成すれば
>>125 の通りで期待が叶いますが、それはそれで無駄な感じがしまして。
>>126 シェルスクリプトひとつでできる。
while文の最後のdoneに &を付けるのがポイント。
while :
do
php /hoge1.php
done &
while :
do
php /hoge2.php
done &
while :
do
php /hoge3.php
done &
>>127 げ、すげぇ。できました。。プロセスが3つ立ち上がるのですね。
ありがとうございます!!
シェルスクリプトすごいっすねぇ。。。感動。
質問: grep の -q オプションってどの grep(1) でも使えたっけ?
年中無休発狂妄想爆裂憤死寸前粘着真性キチガイ包茎池沼病気猿男(狂猿)◆QfF6cO2gD6による気違いカキコの続き:
初心者もOK! FreeBSD質問スレッド その95
http://pc11.2ch.net/test/read.cgi/unix/1210728872/706-708,710,712 706 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 16:24:19
AAとコピペばっか
707 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 16:25:33
アク禁報告を誰もしてないのが不思議w
してても無視されてるのか
708 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 16:31:15
>>704 假性ですが何か?
710 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 17:45:14
粘着キチガイ男(狂犬)をアク禁にしたらリアルに無差別殺人起こす可能性が高いからな。
712 名前:名無しさん@お腹いっぱい。[sage] 投稿日:2008/05/31(土) 17:59:51
ビビって書き込み止めたのか?と煽ってみる
--------------------------------------------------------------------------------------------
UNIX板のあちこちのスレッドを荒らしている凶悪メンヘラ・真性キチガイ猿粘着◆QfF6cO2gD6。
いつも荒らしを憎むようなレスをするが、実際に荒らしているのは自分。
気色の悪い年中無休発狂粘着真性キチガイ包茎池沼病気猿男(狂猿)◆QfF6cO2gD6があちこちのスレに
遂に理解できないような基地害カキコをし始めた!気持ちが悪い…。
>>129 unlike GNU grep, traditional grep did not conform to
POSIX.2, because traditional grep lacked a -q option and
its -s option behaved like GNU grep’s -q option. Shell scripts
intended to be portable to traditional grep should avoid both -q
and -s and should redirect output to /dev/null instead.
ヘブライ語でおk
要約すると、-qオプションがない古いgrepもあるから、 grep hoge > /dev/null にした方が移植性が高いってこと。
Bitte schöen
136 :
名無しさん@お腹いっぱい。 :2008/06/01(日) 08:07:21
質問です。 5から10までの数字をランダムに、しかも2桁に揃えて表示させたい。 空欄を埋めてください。 #!/bin/sh 空欄 echo $randtime
>>136 randtime=`expr 0$((RANDOM*6/32768+5)) : '.*\(..\)'`
rand() { dd if=/dev/random bs=1 count=2 2>/dev/null | od -A n -t u } randtime=$(printf "%02d" $(( 5 + $(rand) % 6 )))
純正シェル、かつ、printf(1)なし環境でも動く方法: randtime=`expr 0\`expr \\\`date +%S\\\` % 6 + 5\` : '.*\(..\)'` ` `が3重ネストしてるので注意。
140 :
名無しさん@お腹いっぱい。 :2008/06/01(日) 19:57:10
(;ω;)たちけて〜 #!/bin/sh i=0 while [ $i -le 23 ] ;do time=`printf $i"%02d\n"` i=`expr $i + 1` echo $time done ↓結果↓ ↓目的↓ 000 0000 100 0100 200 0200 ・・・略 1000 1000 1100 1100 ・・・略 2300 2300 0000〜2300 最初から出力4桁にしたいでつ・・・ どこがおかしいのかおせいて〜(;ω;)ブワッ
printf "%02d00\n" {01..23}
>>140 i=0;while [ $i -le 23 ];do printf '%02d00\n' $i;i=`expr $i + 1`;done
>>141 bash依存失格。
seqが使えるなら seq -f "%02g00" 0 23 awkで書くなら awk 'BEGIN { for (i = 0; i < 24; i++) printf("%02d00\n", i) }'
printfがないOSもある。 i=0;while [ $i -le 23 ];do expr 0"$i"00 : '.*\(....\)';i=`expr $i + 1`;done
exprはどこにでもあるの?
exprもないOSのために、 純正シェルで、内部コマンドのみで実現。 z=0;set -;while [ $# -le 23 ]; do [ $# -ge 10 ] && z=; echo $z$#00; set "$@" d; done
cat -n とか nl とか使う手もあるよね
149 :
名無しさん@お腹いっぱい。 :2008/06/02(月) 01:37:46
Bシェルで質問です。 あるディレクトリのstyファイルの文字コードを全てnkf -sで変換するシェルを作りたいのです。 しかし、全てのファイルに対して操作する方法がわかりません。 つまり、 nkf -s *.sty > *.sty2 mv *.sty2 > *.sty rm *.sty2 みたいなことがやりたいんですが、この部分どうしたらいいのでしょうか。
150 :
名無しさん@お腹いっぱい。 :2008/06/02(月) 01:58:11
>> 149 for i in *.sty; do nkf -s $i > $i.sjis; mv $i.sjis $i; done
find使う
>>149 nkf -s --overwrite *.sty
シェルってゆうなってうるさい奴ってなんなの?バカなの? スクリプトのスレなんだから分かるだろうが。氏ねよめんどうくせえ
HDDのバックアップを効率的に行なうシェルを発光したいんですが、 初心者でも簡単にできますか?
スルーできないやつってなんなの?
157 :
名無しさん@お腹いっぱい。 :2008/06/02(月) 11:27:00
お助けください。 .(ドット)で区切って後ろから1番目と2番目を抜き取るにはどうしたらいいでしょうか? 例えば aaa.bbb.ccc.dddをccc.dddに置換したいです。
>>157 sed 's/[^\.]*\.[^\.]*\.//'
cut -d. -f3-
あ、前2つを削るんじゃなく後ろ2つを残すのか。
>>157 hoge=aaa.bbb.ccc.ddd
expr $hoge : '.*\.\([^.][^.]*\.[^.][^.]*\)'
と言うシェルが発酵できます。
純正シェル、内部コマンドオンリーバージョンを求めるなら、 hoge=aaa.bbb.ccc.ddd IFS=. set $hoge while [ $# -gt 2 ]; do shift; done echo $1.$2
echo "aaa.bbb.ccc.ddd" | sed -e 's/^\(.*\)\.\([^\.]*\)\.\([^\.]*\)$/\3.\2/'
ごめん。なんで \2 \3を入れ替えたんだろう?w echo "aaa.bbb.ccc.ddd.eee" | sed -e 's/^\(.*\)\.\([^\.]*\)\.\([^\.]*\)$/\2.\3/'
腐ってやがる 早すぎたんだ
>>155 rsyncかddでググれ。
話はそれからだ。
echo ^G
vbell限定だた
while : do xset led 1 sleep 1 xset -led 1 sleep 1 done
for hoge in *.*.* do mv $hoge $(echo $hoge |awk -F. '{print $(NF-1)"."$NF}') done
あ、違った
banner をもっと長い文字列で使いたいんですが
そうですか
自分で発光したシェルをコマンド化するにはどうするんですか? もしかして、コンパイルとか打つんですか?
そーでーす
ふたつのテキストファイルがあったとします。 テキストファイルの中の文章は単語が改行で区切られています。 $ cat 1.txt apple book cat desk earth fuck $ cat 2.txt april born cook dinner engine fuck 1.txt と 2.txt で完全一致しているものを抽出するシンプルな方法を 探しています。何か良い方法ありませんか?
sortしたものをdiffやcommに食わせるのが簡単だけど。 並べ替えアウト?
それぞれ、中身に同じ行がないなら、 sort 1.txt 2.txt | uniq -d かな
sh -c 'echo $1' a b c で、b が出るのは正常?
正常
183 :
名無しさん@お腹いっぱい。 :2008/06/03(火) 03:43:47
質問です。 aaa=`commando1` bbb=`commando2` このような「``」内のコマンドを1つにまとめるにはどうしたらいいでしょうか? 例えば #!/bin/sh temp=`ls -l $1` pram=`echo $temp | cut -d " " -f 6-8` echo $pram tempとpramで分けてるものを1行でまとめたいです。
ネストすればいい。
>>183 ネストする必要ない。というか、tempに入れる必要ない。
pram=`ls -l $1 | cut -d " " -f 6-8`
>>184 一般論の話だろ。
その例に限れば、それでいいけど。
POSIXシェルを仮定して「$()」使うのが正解。
>>183 一般論として、
aaa=`command1`
bbb=`command2 $aaa`
なら、
bbb=`command2 \`command1\``
で桶。
純正シェルで動かないから。
>>189 という正解があるのに、わざわざポータビリティを落す $()を使う必要ないから。
3重、4重のネストが必要なときはどうするのだ? www 大半のシステムで使用できる$()を避けて可読性を劣化させる必要は無い。 このスレに巣食っている原理主義者以外は$()使うのが正解。
可読性を言うなら、むしろネスティングを避けて
一旦別変数に入れる方式の方がいいぞ。
>>183 の質問の逆をやれってことね。
>>194 Solarisは大半のシステムじゃないのかい?
Solaris?なにそれ、おいしいの?
Solarisを見落としていた
>>194 の負けだな
>>194 3重ネストは \\\`command\\\`
4重ネストは \\\\\\\`command\\\\\\\`
何か問題ある?w
Solarisならば、普通kshかxpg4シェル。
202 :
名無しさん@お腹いっぱい。 :2008/06/03(火) 20:09:41
質問させてください。 テキストファイルの内容が以下のようになっています。 日付 文字列 上記文字列に改行コードが存在する場合、以下のようになります 20080602 aaabbbccc 20080602 dddee ef ff 20080602 ggghhhiii これをこのように正しく変換するにはどうしたらいいでしょうか? 20080602 aaabbbccc 20080602 dddeeefff 20080602 ggghhhiii
203 :
名無しさん@お腹いっぱい。 :2008/06/03(火) 20:18:28
202の続き とりあえずない頭を絞って先頭文字が「2008」でない行に|を入れて以下のような レイアウトにし 例) 20080602 aaabbbccc 20080602 dddee |ef |ff 20080602 g |gg |hhhi |ii 過去ログにあったコマンドを参考に以下のコマンドを実行しましたが 「(rm a.txt; sed 'N; s/\n|//; P; D' > a.txt) < a.txt 」 例) 20080602 aaabbbccc 20080602 dddeeef |ff 20080602 ggg |hhhiii と、いった感じですべて変換することができません。 よろしくお願いします。
>>202 これでどうだ。
頭に余分な空行が出るのは無視してね
↓
while read line
do
set $line
if [ $# = 1 ]; then
echo -n $1
else
echo
echo -n $1 $2
fi
done < file.txt
echo
205 :
名無しさん@お腹いっぱい。 :2008/06/03(火) 21:33:33
>>204 ありがとうございます。
すみません。わたしの記載漏れになりますが文字列の中にはスペースも存在します。
詳しく言いますとこの文字列とはSQLなのです。
なので「select * from table」のようになります。
せっかく考えて頂いたのにすみませんでした。
後出し乙。これで回答を得られることはないであろう。
わしが代わりに答えてあげよう。 正解のmd5じゃ。 9c42265ebade7ace4e45b75b8d41f7ab
初心者な質問ですいません。 自分で書いたシェルをコマンドとして発光するにはどうするんですか?
発酵させるには、ながーい時間がかかるよ
>>207 お題を自分で解いた(かもしれない)だけで、答えたことになってないよな
>>207 そのmd5逆算したところ、確かに動きました。感謝です。
すげぇなおい
>>202 どっちも書き方として邪道かつ汚いけど結果オーライなら。
cat $SQL_FILE | awk '{ if(/^20[0-9]+ /) { printf "\n"; } printf $0; } END { printf "\n" }'
cat $SQL_FILE | perl -ne 'chop; print "\n" if(/^\d{8}\s/); print; END{ print "\n" }'
全然シェルスクリプトじゃない件
#!/bin/sh awk '{ if(/^20[0-9]+ /) { printf "\n"; } printf $0; } END { printf "\n" }'
awkスレと聞いて
217 :
215 :2008/06/04(水) 15:27:14
まぁ
>>6 にも入ってるし、sed awk はテキスト処理では欠かせないな。
>>213 は、改行コードの扱い方が珍妙で、よく出来てると思った。
192168000001 を 192.168.0.1 に変換するスマートな方法を教えてください。 一オクテットが、3 ケタずつに区切られています。
echo 192168000001 | sed 's/.../& /g' | awk '{print $1+0 "." $2+0 "." $3+0 "." $4+0}'
220 :
202 :2008/06/04(水) 23:45:50
>>213 ありがとうございます。
出来ました。
なるほど改行コードを削除することに躍起になっていましたが、
マッチした時だけ前に改行コードを付けるというやり方もあるんですね。
なかなか思いつかない発想だったので勉強になりました
echo 192168000001 | sed 's/.../&./g;s/¥.0*/./g;s/¥.¥./.0./g;s/¥.$//' s/¥.00?/./ とか書きたいにゃー。
echo 192168000001 | sed 's/.../& /g;s/ $//;s/ /./g'
sh -c 'echo fugafuga' と eval 'echo fugafuga' が異なるのは、どのような時なのでしょうか。 fugafugaの部分は任意です。
>>223 たとえば、
set hoge
sh -c 'echo "$@"'
と、
set hoge
eval 'echo "$@"'
は異なる。
すいません スペース区切りの文字列をカンマ区切りに変えたいんですが、 スペースが一つとは限りません a hoge b ge c h これを a,hoge b,ge b,h こんな感じです bashでできないですか? awkも使えます
すいません 条件がもう一つ カラム数は固定じゃないです
sedは禁止? sed 's/ */,/g'
while read line do set -- $line echo -n $1 shift for i in "$@" do echo -n ,$i done echo done
何をどう試したんだ
>>228 echo 'aaa bbb ccc' | sed 's/ */,/g'
,a,a,a,b,b,b,c,c,c,
$ echo 'aaa bbb ccc' | sed 's/ */,/g' aaa,bbb,ccc
sedなら正解は、 sed 's/[ ][ ]*/,/g' だな。
>>234 をコピペして実行してみろw
$ echo 'aaa bbb ccc' | sed 's/ */,/g'
,a,a,a,b,b,b,c,c,c,
この問題を避けるには、
>>235 が正解。
「この問題」って、専ブラを使わずに煽る○○がいる問題って意味だな
>>235 これの意味がよくわからんのだが・・・
なんでこれでいいの?
[ ] の意味と
>>230 がキレた理由はわかるかね?
242 :
239 :2008/06/06(金) 01:37:14
>>240 >>241 すまん
shなんだけどlinux(fedora8)
じゃだめなんかな?
sh-3.2$ echo 'aaaaaa bbbbbbb ccc' | sed 's/[][]*/,/g'
,a,a,a,a,a,a, , , , , , , , , , , , , , ,b,b,b,b,b,b,b, , , , , , ,c,c,c,
sh-3.2$
243 :
239 :2008/06/06(金) 01:39:25
自己解決 []じゃなくえ[ ]だったわ あほだおれ
あの夜、俺は初めて彼女とMMXした。 「もうそろそろiiyama? 君のI/ODATAを確かめたいんだ。XT」 MITSUMIあうと、彼女のMECはALBATRONとしていた。 緊張した俺は焦り彼女のソケット478をAOpenしようとした。 「ちょ、ちょっとRADEON!何をSis」もう俺は既にエレコム。 Sound Blasterのホックを外すとはちきれそうなPioneerがBarracuda でもBIOSTARは意外と玄人志向だった。 「恥ずかしいわ。あまりミネベア・・・」 SCSIをTORICAるとKEIANをSOLTEKした痕がアルファデータ。 あそこはSUPERMICROだった。OMEGAドライバも少し鼻についた。 しかし、彼女のCREATIVEを刺激しつつ俺のセレロンを 彼女のSerial-ATAからASUSに這わせると、「FireWire〜ン」 「もう、ATI」「COREGA欲しいんだろ?」「早くリテール」 俺は激しくTSUKUMO。「インテルはいってるっ!IEEE!1394!」 「あぁ・・・もうDell!」
OFSのあるawkなら、 awk 'BEGIN { OFS=","} { $1 = $1; print $0 }'
ダサい専ブラ
たしかにダサい専ブラだな。
ブラウザ依存も、Bash依存同罪。 ポータビリティ考えて書き込めよ。
sed -r 's/ +/,/g' の方が良くね?
どこのsedだよ
/bin/sed
$ type sed sed is a shell builtin
大半のシステムで使用できる sed -r を避けて可読性を劣化させる必要は無い。
このスレに巣食っている原理主義者以外は
>>251 使うのが正解。
自分が読めない = 可読性が低い
sed 's/ */,/g' これなら文句はねえよな?
>>258 >>228 とは違う。こっちはちゃんと を使ってるんだが
まだ空白がつながって見えるかな?
ナマの空白をつなげたら、HTML仕様的にはくっつくのが当たり前だよ
>>226 tr -s ' ' ,
でいけないか。
sed 's/ * /,/g'
結婚を考えていた彼女が処女じゃなかったんです7 1 :最強の負け組み:2008/03/01(土) 05:37:53 ID:YrfLoASe ショックでした。 もしやもしやと思っていたのですが 面と向かって告白された時は目の前が真っ暗になりました。 「処女とかそんなの関係ない!」 そう自分に言い聞かせてきましたが、やはり限界がきてしまい 彼女に別れを告げました。 知り合いに言うと 「は?そんなくっだらない事であんないい子と別れたの? ばっかじゃね?もうあんな子絶対知り合えないぞ?」 とボロかすに言われました。 頭では判っているのに心で理解できないんです。 私自身、もう頭の中がぐちゃぐちゃで訳がわかりません。 彼女を傷つけてしまったのでしょうか? 別れの時、彼女は黙って頷き 「じゃあね」 と笑って去っていきました。 もう私には彼女の気持ちがどうなのか あの微笑がなんだったのか理解できないのです。 やはり私は馬鹿な事をしたのでしょうか?
>>263 echo じゃあね
: -P
exit
ふともも画像が100〜400x810pxくらいのサイズであったとします。 横幅が1440pxを超えないように画像を結合するスクリプトを書きたいのです。 結合する画像の組み合わせは特別に指定しません。 横幅が1440以下でかつなるべく大きければ何でもいいです。 たとえば、画像は40枚とします。 1.jpg 300x810 2.jpg 300x810 3.jpg 300x810 4.jpg 300x810 5.jpg 300x810 6.jpg 300x810 ************** 40.jpg 200x810 だとしたら、1,2,3,4 を結合させて image1.jpg (1200x810px)を作ります。 それ以降も同様なことを繰り返します。 お願いします。
ふともも画像について詳しく
うん、画像のふとももが実際どうなのかによって対処法も違うよね。
おまいら少しは協力してやれよw で、画像の件なんだがね。。。
画像のサンプルがないことにはどうにもならん。
>>265 いわゆるナップサック問題なので、最適解を求めるのはシェルスクリプトには荷が重い。
>>270 最適解じゃなくていいから、指定サイズ以下に並べられる
シェルを書いてうpしてください。
最適じゃなくていいなら 頭から順にならべて1440を越えたら次に行けばいいだけじゃん。
273 :
265 :2008/06/09(月) 13:08:54
>>272 2次元だから、最適じゃなくても単純にはいかないだろ。
ここは楽しい モーレツインターネッツ教室でつね ワッフルワッフル
X軸方向に複数画像並べるだけで、Y軸方向には画像は並べない(1枚だけ)という仕様なの?
277 :
265 :2008/06/09(月) 22:49:54
条件後出し乙。 だったら質問するまでもない簡単な問題じゃん。 アフォらしいから回答するの辞めた。
便乗質問します。 X座標のドット数も、Y座標のドット数も可変の画像ファイルが複数あります。 これを、引数指定のX/Y座標の画面サイズに収まるように、 なるべく多く、なるべくすき間なく画像を並べるようなシェルを発光してください。 なお、実際の画像結合処理は別コマンドにやらせるので、 入力としては、各画像ファイルのファイル名とX/Yサイズが書かれたテキストファイルの $ cat input.txt 1.jpg 300 200 2.jpg 530 250 3.jpg 410 180 4.jpg 640 480 を入力として、 $ hoge input.txt 1200 1280 とやると、 出力として、 1.jpg 0 0 2.jpg 300 0 3.jpg 0 300 : みたいに、画像を配置するべき座標を画像の左上のオフセットで指定して 出力できればいいです。 最適配置にする必要はありませんが、当たり判定はちゃんとやって、 画像が重ならないようにしてください。
いつからここは エロ画像処理スレッドになったんでしょうか。
しかも画像も貼らずに質問とは。
ImageMagick で一発?
シェルスクリプトでやる意味があるのか分からない。 ってのは禁句でしたかな。
>>283 ぶっちゃけシェルスクリプトの最大の利点は手軽さなので、
わざわざ人に1から10まで聞くという手間をかけてまでシェルスクリプトでやる理由はないな。
普段からシェルを使い慣れてないならあえて選ぶ意味はないような.
じゃなくて、人に聞いてるんじゃなくて、オマエラに「お題」を出してるんだよ。 シェルで発光する方法を考えて、おおいに盛り上がってくれ。
はい次の質問どぞ
シェルで発光する方法まだーーーー???
>>288 はいよLinuxオンリーだが
setleds +num +caps +scroll
で発光できる
お疲れさまでした。 では、次の課題です。 シェルで発酵する方法について考えましょう。
ところで「シェルを発行する」っていうのはなにか決まった言いまわしなのか? 普通はこんな言いかたしないと思うんだけどこのスレではよく見る気がする
issue とか perse とか英語でも色んな言い方するよねえ
297 :
名無しさん@お腹いっぱい。 :2008/06/14(土) 08:48:18
引数指定のディレクトリを頂点として、それ以下のサブディレクトリを含む ディレクトリツリー中のシンボリックリンクを探し、 そのシンボリックリンクそれぞれについて、 冒頭のディレクトリツリー内を指しているか、 それとも、ディレクトリツリーの外を指しているのかを 判断するシェルを発行してください。 なお、シンボリックリンクの先に実際にファイルがない場合もありますが、 実際にファイルがあるかどうかに関係なく、あくまでシンボリックリンクの 内容のPATHだけで判断してください。 (ブロークンリンクだからといって外部と判断してはいけないということ) 以上、お願いします。
作ったシェルスクリプトを僕のPC上で発行しました どうぞ
ここってさ、人にシェルスクリプト書いてもらうスレだったっけ?
>>299 >>1 >スクリプトのお勉強・自慢・腕試しなどにどうぞ。
だそうなので、腕試しのお題を出しているんじゃない?
できないなら黙ってろの人最近来ないね。
お題としてはなかなかいいんじゃない? symlink読んでリンク先のフルパスに変換する関数を書くあたりがキモかな。
$RANDOM って癖があるのは仕様なんすか? 俺の環境でecho $((RANDOM*10/32768))を 出力させ続けると0と8がやたら多いw なんかハードウェアのノイズを拾って数値化してるとか いうのは読んだことあるけど。。。(実装によるとは思うけど) これってもうしょうがないんすかね? 立派なアルゴリズムをもった乱数生成器とまでは いかないものの、そこそこ精度が高い(?)乱数を シェルコマンドで作るってできないすかね??
/dev/*はOS依存なので、 メルセンヌツイスターあたりをシェルスクリプトで実装する方向で。
/dev/urandomはOS依存じゃないだろ。
>>297 ちょっと考えると簡単なようで、実はすごく難しいんじゃないかと思う。
find(1) + readlink(1) を使って基本的な判定はできる。
んが、ディレクトリへのリンクがあったり、意図的に難解なリンクが
作成されてたりすると非常に厄介じゃね?
具体的には、
../../../usr/local/../local/etc みたいなのとか。このぐらいなら、
dirname(1) + cd + pwd(1) でまだ何とかなりそう。
じゃあ今度は、
/usr/local -> /var/local という(変な)環境で、
/usr/local/etc/a.conf -> ../etc/b.conf とかなっちゃってると、
/usr/local/etc 内にあるようで実は /var/local/etc にあるということになる。
漏れのオツムじゃ解はよくわかんね。パス正規化ツールみたいなのあると
面白いかもね。
シェルを発行だとか純正シェルだとか、 このスレは読んでて正直気恥かしくなる
>>312 もしかしてここがネタスレだと分かってなかったのか?
まあ叩き台ってことで、こんな感じ? #!/bin/sh base="`readlink -f $1`" find $base -type l -print | while read i do echo "`readlink -f $i` $i" done | grep ^$base
なんかシェルでゲーム作りたいんだけど 画面のクリアとかってどうやればいいの?
clear
realpathは使わないの?
319 :
名無しさん@お腹いっぱい。 :2008/06/17(火) 10:25:04
#!/bin/csh -f set com=$0 if ($#argv < 1 || $#argv > 3) then echo Usage:$com start_line total_lines '[file_name]' exit 1 endif if ($#argv == 2) then set s=$1 set t=$2 tail +$s | head -$t else set s=$1 set t=$2 set f=$3 cat $f | tail +$s | head -$t endif exit 0 echo ------------------ これだとエラーがでます。どなたか改良してください。お願いします。
>>310 Solaris8 は標準では /dev/u?random はなかったはず。
Sun がパッチを配ってたので事実上あるような扱いだったけど。
Sol7 だとそれもなくて、フリーのデバドラをインストールしてた。
すでにEOLですからw
カンマ区切りcsvからhogeというカラムとその右4カラムを切り出したい ただしhogeが何カラム目にあるかは不定 というのはちょちょいとできないですか?
フルスペックのcsvをシェルスクリプトで扱うのは荷が重い ちょちょいでは無理
>>323 こういうことか?
↓
#!/bin/sh
IFS=,
while read line; do
set $line
while [ $# -gt 0 ]; do
if [ "$1" = hoge ]; then
echo "$1","$2","$3","$4","$5"
break
fi
shift
done
done
326 :
名無しさん@お腹いっぱい。 :2008/06/23(月) 22:09:52
「,」を含む文字列で発狂するから駄目。
""ん中に改行まで入ることあるしな
328 :
323 :2008/06/23(月) 22:57:51
>>325 おお完璧です
どうもありがとうございます。
IFSってawkの変数かと思ってましたけど、shでも同じなんですね
sh-3.2$ cat a.csv
,,,,,hoge,,1,11,3,3nd
,,,,,,,,,,,,,,,,,,,,,,,,,,,,hoge,,1,11,3,3nd
,,,,,1,fds,3,hnd
,g b,,,,,,hoge,,1,11,3
a ,,,,,,,,,,hoge,,1,13,d
sh-3.2$ cat a.csv | ./kkkk
hoge,,1,11,3
hoge,,1,11,3
hoge,,1,11,3
hoge,,1,13,d
sh-3.2$
330 :
323 :2008/06/23(月) 23:02:39
>>326 >>327 さすがにそんなに意地悪な仕様ではないんで問題なしです。
欲を言うならシェルを作らず手で打てるレベルのものがいいなぁ・・というくらいです。
シェルってゆうな。クズ。
>>331 よう、久しぶりw
相変わらず怒ってんなあwww
ゆうって言うな。クズ。
シェルで発酵する方法まだーーーーーーーーーーー??????
CPUヒートシンクの上に、藁に包んだ大豆を載せ while :;do :;done
FAN止めないと乾燥するな
水冷にすればいいんじゃね?
hoge1.txt に日付のテキストが数百行あります。 ---------------------- $ cat hoge1.txt Fri, 16 May 2008 09:39:25 +0900 Sun, 18 May 2008 09:30:21 +0900 Mon, 02 Jun 2008 08:15:45 +0900 ---------------------- フォーマットを下記のように年月日のみに変えて hoge2.txt に書き出すシェルスクリプトを作りたいのです。 ---------------------- 2008.5.16 2008.5.18 2008.6.2 ---------------------- sed や awk を使うのか?ということまではわかってきたのですが、初心者なもので詰まってしまっています。どなたか ご教示お願いいたします。
ここでGNU date でやり方書くやつがでて、 Linux厨乙!的な流れですね、わかります。
GNU dateがあるとして、 while read x; do date --date="$x" '+%Y.%-m.%-d' done < hoge1.txt
Linux厨乙!
× …hoge2.txt に書き出すシェルスクリプトを作りたいのです。 ○ …hoge2.txt に書き出すシェルを発行したいのです。
BEGIN{ m["Jan"] = 1 m["Feb"] = 2 ... m["Dec"] = 12 OFS = "." } { print $4, m[$3], $2+0 }
>>343 それ間違ってるよ。動作確認してから書くこと。
はて、うちの手元では動いてるけど、環境依存な部分あるかな?
Mon,
月の名前と曜日の名前の区別がつかないんですね、わかります
で、そろそろ純正シェルでの解法を誰かが投稿する時間だな
>>338 本当に日付は
>>338 のフォーマットしかないと限定していいの?
だったら
>>343 でも動くだろうけど、
中には、
Mon Jun 2 08:15:45 JST 2008
みたいな行もあるという仕様じゃないの?
だったら、
(今のところ)
>>340 が正解。
ずいぶん勝手な解釈だな。
#!/bin/sh month() { case "$1" in May) echo 5;; Jun) echo 6;; esac } cat <<END | Fri, 16 May 2008 09:39:25 +0900 Sun, 18 May 2008 09:30:21 +0900 Mon, 02 Jun 2008 08:15:45 +0900 END while read line do set -- $line echo $4.`month $3`.$2 done
ああ echo $4.`month $3`.`expr $2 + 0` かな。
いや、
>>344 は、
>>343 をシェルで実行しようとしたんじゃないだろうか?
どこにも○○○だとは書かれてないから。
>>350 だったら、4桁数字だったら西暦、
2桁数字だったら日付、
Jan Feb等に一致したら月、
それ以外のフィールドは無視、というように
全フィールドをチェックすればできるな。
338です。
あっという間にたくさんのレスが。ありがとうございます。
>>340 >>343 >>352 ありがとうございます。
#!/bin/sh
の後に書いてやってみていますが、まだうまくいきません。
基本的な書き方がわかっていなさすぎなんでしょうね。
>>350 日付のフォーマットはこれだけ限定です。
過去スレ等、さらに読みに行ってきます。
本当に皆さんありがとう。
>>355 だったら
↓だな。
#!/bin/sh
while read line; do
for f in $line; do
case $f in
[0-3][0-9]) d=$f;;
[1-2][0-9][0-9][0-9]) y=$f;;
Jan) m=1;; Feb) m=2;; Mar) m=3;; Apr) m=4;; May) m=5;; Jun) m=6;;
Jul) m=7;; Aug) m=8;; Sep) m=9;; Oct) m=10;; Nov) m=11;; Dec) m=12;;
esac
done
printf '%d.%d.%d\n' $y $m $d
done
宗教的に問題ないなら GNU date 入れちゃいなよ。 便利だよ。
宗教上の理由でそれは出来ません
ならしょうがない。
輸血と献血とGNU date は家訓で禁じられてます
perlで我慢しる $ cat <<END | perl -ane 'use Date::Parse; $t = str2time($_); ($s,$m,$h,$d,$M,$y) = localtime($t); print $y+1900 . "." . $M . "." . $d . "\n"' Fri, 16 May 2008 09:39:25 +0900 Sun, 18 May 2008 09:30:21 +0900 Mon, 02 Jun 2008 08:15:45 +0900 END 2008.4.16 2008.4.18 2008.5.2
use Date::Parse; ($s,$m,$h,$d,$M,$y) = strptime($_); print $y+1900 . "." . $M+0 . "." . $d+0 . "\n";
perlやGNU dateの方が書式に寛容
perlが入っててもDate::Parseが入ってない環境が多いから動かない環境が多い。
純正シェル(笑)
シェルってゆうな。クズ。
貝殻
ゆうなって言うなこのクズ
稲村
372 :
265 :2008/06/26(木) 17:31:41
bashのshはシェルの略なので これからはbaと呼ぶことにします。
338、356です。 勉強始めたばかりで適切なスレを見つけるのもままならない。 質問した後に、スレ違いだったようだと反省している。 実はbashでやっているんだが・・・ってこれを最初に言うべきだったんだね。 皆さんにいただいたヒントでなんとかしようとさらに勉強するつもりだ。 ほんとに親切な人が多いスレで感激しているよ。 頑張ってみる。ありがとう。
まだ出来てないのかよ。
>>373 >>357 をコピペして、適当なファイルに保存(ファイル名hoge)する。
$ chmod +x hoge
$ ./hoge < hoge1.txt
2008.5.16
2008.5.18
2008.6.2
ここまで書かないとわからなかったのかな?
パーミッションとか、リダイレクトとか、./ を付けることとか、、
パーミッションとかわからければ、テキストファイルとして保存して $ sh hoge < hoge1.txt でいいし。
378 :
名無しさん@お腹いっぱい。 :2008/06/28(土) 16:35:09
ホストをIPに変換するシェルを発行する時、 getentを使いたいのですが、getentって純正シェルでも使えましたっけ? あと、他にgetentが使えないシェルはありますか?
ホストの人かコンピューターをプロトコルに変換するシェルを開発されるスーパーハカーの方ですねわかります
>>378 外部コマンドならシェルの種類は関係ないでしょ。
zshではシェル関数になっていた > getent
それは俺の知らないzshだ
ashでは not foundって言われた > getent
/usr/share/zsh/4.2.6/functions/compaudit の中に [[ -x /usr/bin/getent ]] || getent() { if [[ $2 = <-> ]]; then grep ":$2:[^:]*$" /etc/$1 else grep "^$2:" /etc/$1 fi } と書いてあった。コマンド実体がない場合にちょー簡略版を定義してるのね。
>>385 その定義だと、コロンで区切られてる前提になってるから、
passwdとgroupにしか使えないね。 (hostsには使えない)
getent hostsって微妙だからな。 libresolv直接叩いているアプリも結構あるし。
行中にIPアドレスらしき文字列が含まれていたら、それを出力するって こんな感じで問題ないですかね? もっと綺麗に書ける気もするが・・・ # 1行に1つしか含まれてないと仮定して問題なしです。 text='0.0 192.168.0.1 0.0' regex='[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*' echo "$text" | grep "$regex" | sed -e "s/.*[^0-9]\($regex\).*[^0-9]*/\1/"
389 :
388 :2008/06/29(日) 03:13:28
全然ダメだったorz 教えてください。
echo $text | grep -E -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' -oなんてオプション他のgrepにあるか知らないけど
>>388 grepとsedを一緒に使うのは無駄。sedだけでできる。
sed '/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/'
すまん、-n p 忘れた。訂正。 sed -n '/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p'
sed -n 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p' の間違いだろ。初心者はもっと謙虚なレスを書きなさい。
>>392 それだと頭の数字が食われることがある。
↓
sed -n '/[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/s//\1/p'
とした方がいい。
だからぁ〜、sedはスレ違い。
>>393 は何を言いたいんだ? (392のあとで)
と言うか、
>>393 の頭の 's/ の部分ですでにsed文法エラーじゃん。
初心者はちゃんと動作確認してから書きなさい。
>>394 が正解。
>>394 でも、
hoge123 192.168.123.45
みたいな入力があると失敗する。続きは sedスレでやってくれ。
sed -n '/.*\(\<[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\>\).*/s//\1/p' で改善されるか?
模範解答の発行まだー??
398 で桶
sed -n 's/.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*/\1/p'
よほどパフォーマンスに差がありでもしないかぎり、 書き易く読み易いようにすればいい。
404 :
388 :2008/06/30(月) 01:39:46
みなさま色々とありがとうございました。
>>398 ちゃんと処理できるみたいですし、このスレでも良い評価なので
これを使ってあげようかと思います。感謝してください。
この処理は、あるとても重要な国家プロジェクトで使用されます。
コメントで Powered by 398 と入れておきますね。
なわけねーだろ
406 :
名無しさん@お腹いっぱい。 :2008/07/02(水) 17:31:55
誰かお願いします。 wk=f 配列にa b c d とそれぞれ入ってるとして ループでぐるぐるっと、wkと一致するものを探したいんですが、 もし一致するものが無かった場合の終了条件って、どうしたらいいですか。
日本語でおk
純正シェルに配列はない。配列に相当する別の処理をしているなら、 その処理方法を明示して質問し直した方がいい。
>>406 多少エスパーして回答。
ループにwhileを使うんじゃなくて、
forで配列の要素分ループすれば、たとえ一致するものが無かった場合でも
ループはちゃんと終了するから問題なし。
ループの返り値ってことなら、breakとかを使わん限り最後のコマンドの実行結果になるから、 ループの最後にfalseを置いとけばいいんじゃないかね。 成功した場合はbreakで抜ける、ということならば、だけど。
>>406 の日本誤訳:
以下のようなシェルを発行しようとしたのですが、
もし一致するものが無かった場合、うまくいきません。
どうすればいいですか?
#!/bin/bash
wk=f
array=(a b c d e)
i=0
while [ ${array[i]} != $wk ]; do
((i++))
done
412 :
名無しさん@お腹いっぱい。 :2008/07/02(水) 17:57:26
皆様あざーっす! とりあえず今、KSHって何だって事から教わりました。怒鳴り含み。 ちょっと参考にして、考えます。皆暖かいアドバイスども!
突然何を言い出すんだ?
キチガイ警報
作成したいファイル名が書かれたtxtのリストから、 ファイルを作成するにはどうすればよいでしょうか? たとえばテキストの中身に、 hoge foo bar とあったとして、 hogeとfooとbarというファイルを作成したいのです。
>>416 なんでこれでできるのかわからないですができました
ありがとうございます
>>416 それだと大量だった場合に引数溢れのエラーにならないかな?
>>418 じゃあ
cat txt | xargs touch
cat txt|while read FNAME do touch $FNAME done べたですがw
>>419 xargsは使っちゃいけないコマンド。
>>420 それだと catが無駄。touchがむだ。
while read FNAME
do
> "$FNAME"
done < txt
>>416 bash依存、失格。
> `cat txt`
>>421 415とは関係ないんだけど
パイプでxargsに渡すときに空白をエスケープするにはどうすればいいの
例えばfindで見つけたパスに空白が含まれてた場合とか
>>424 テンプレにあったとは
すいませんでした
テンプレにはないが、find -print0 | xargs -0 するんじゃなくて、 find -exec + するのが今後のお勧めだな。-exec の後ろ、\; じゃなくて + ね。 これでxargsは完全に不要!
427 :
名無しさん@お腹いっぱい。 :2008/07/03(木) 11:31:21
質問です。 case文でwhile文を使用する時 case "$a" in "a.c") while[ $flag = false || $i -ne 10 ] ; do 処理1 done の時、doneの跡に;;でおkですか?
>>421 がFAだけど、敢えてxargs -0で。
cat list.txt | perl -ane '{ chop; printf("%s%c", $_, '\0'); }' | xargs -0 touch
>>426 この+でappendって、最近のfindはどれにもあるの?
純正findにないから使っちゃだめ
>>430 純正findにもあるんだなぁ、+ が。よって find -exec + で FA。
xargs を使っちゃいけない理由キボンヌ 便利だし早いからコマンドラインで結構使うんですが・・・
純正find にないのは -print0 の方ですね。
純正なんとかっていう意味の曖昧な言い方は止めろ 今はPOSIX準拠かどうかの話をしてるようだが、 純正シェルは古い/bin/shの話だったりでわからん
>>432 $ printf "This is\na test.\n"
This is
a test.
$ printf "This is\na test.\n" | xargs -n 1 echo
This
is
a
test.
$ printf "This is\na test.\n" | perl -ane 'chop; printf("%s%c", $_, '\0');' | xargs -0 -n 1 echo
This is
a test.
$
>>435 なるほど、理解しますた。分かってれば使えないことはないですな。
まぁ実験して動いたらそれでまずOK。 でその後にリファイン(リファクタリング?) これが大事。
>>6 > (スペースなどを含むファイル名を正しく処理するため、
> findは -print0、xargsは -0オプションを常に付けることを推奨
> ただし、Solarisでは未対応。どうするんだろ?)
$ cat print0
#! /bin/sh
while read x; do
printf "%s\0" "$x"
done
$ find 〜 | print0 | xargs -0 〜
でいいんじゃね?
# printfは許してね。
>>439 いや、だから、Solarisでも find dir -exec hoge + が使えるんだよ。
よってprint0云々は一切不要。
>>439 ファイル名に \ が含まれていた場合、readが誤動作する(違うファイル名とみなされる)
Solarisの xargsには -0 オプションがない。
で、
>>440 の方法で解決。
トレースしてみた。 strace -f find /tmp -exec file {} + 2>&1 execve("/usr/bin/file", ["file"..., "/tmp"..., "/tmp/.ICE-unix"..., "/tmp/mysql.sock" ..., おお、すげぇ。ちゃんと引数まとめて実行してるね。 strace -f find /tmp -exec file {} \; 2>&1 execve("/usr/bin/file", ["file"..., "/tmp"...], [/* 21 vars */]) = 0 execve("/usr/bin/file", ["file"..., "/tmp/.ICE-unix"...], [/* 21 vars */]) = 0 execve("/usr/bin/file", ["file"..., "/tmp/mysql.sock"...], [/* 21 vars */]) = 0 こっちは1個ずつ実行するから大量だとクソ遅い。 勉強になりまつた。
やっぱ速さってみんな気になるん? しっかりきっちり動けば、速度は問題ないって思ってる俺は未熟? いかにもベターってのはやらないけどー。
テクいことして読み難くなるなら多少遅くても分かりやすく書く
>>443 必要な時に必要なことをやる。当たり前のこと。
後の話はマ板でやって。
cronで毎日回しているプログラムの処理時間が 16時間越えたらちょっと悩む
kshでユーザIDのリストを計表にして印刷したいんだけど こんなの作った人いますか? どこかにサンプルありませんかね。OSは、AIX5.3です。
>>448 計表の正確なところがわからんが、
while read user pass uid rest; do echo $uid $user ; done < /etc/passwd
ってことか?
あと、必要なら sort -n をかましてね。
kshじゃなくて純正シェルでできるよ。
>>448 あ、IFS設定抜けてた。
IFS=:; while read user pass uid rest; do echo $uid $user ; done < /etc/passwd
ksh -c lpr < /etc/passwd
FreeBSD 付属の wc は空白文字でパディングして結果を返すようです。 wc -l $file | sed "s/ /_/g" _____340_/usr/bin/g++ Linux では次のようにして 340 という値を得ていたのですが、 FreeBSD では空白文字が出力されてしまいます。 wc -l $file | cut -f1 -d" " FreeBSD 版 wc ではどうすればいいでしょう。 ltrim() みたいなものがありますかね。 それともいったん sh の変数に代入する? それとも wc や cut には未知のオプションがある? cut なんていう頑ななコマンドは使わないで、 sed 's/^ *\([0-9]*\) .*$/\1/' しろ? お前 awk '{ print $1 }' も書けないのか? bash をよく使うので、依存しているところがあったらごめんなさい。 awk はほとんど馴染みがありません。というか、 何かにつけて不遇の cut を使ってあげたい気持ちがあります…。
>>452 echo `wc -l < $file`
>>452 長文で cutを力説してるのに、
>>453 で cutすら必要ないというオチにワロタ
wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので
cutとかで切る必要ないのと、スペースを取り除くにはシェルの ` ` を使うってことね。
> それともいったん sh の変数に代入する?
質問者が用意した選択肢を誇らしげに答える
>>453-454 が憐れ。
空白文字のパディング方式に、 暗黙の仮定を置いてまでcutにこだわる意味が全くわからん。 仕様の特殊化しても嬉しくない。
457 :
452 :2008/07/04(金) 11:38:04
いやいや > wc で、引数じゃなくて標準入力の場合はもともとファイル名が出ないので 役に立ちました! 確かに笑った。
>>455 おまえ、シェルスクリプト書いたことないだろ?
>>453 では一切「sh の変数に代入」は行なっていないがww
459 :
452 :2008/07/04(金) 11:50:48
>>456 いやいや、そうなんですよ。 cut ってつまり結局
他のコマンドと組み合わせるには中途半端なツールなんですよ。
単純でそれなりに覚えやすく、見込みのあるヤツだと思ってたんですが…
awk や bash は区切り文字を変えるだけでも結構タイプする印象が。
いや、変にこだわってごめんなさい。
つ awk -F:
cut はデリミタの連続を指定できれば使える君に化けるんだがな。
462 :
名無しさん@お腹いっぱい。 :2008/07/08(火) 07:58:27
シェルスクリプトがCなどのプログラムより重い理由をうまく説明したいんですが
>>462 インタプリタ型言語だから。
(fork/execが遅いと言うだけが理由ではない。
内部コマンドだけを使ってもCよりも遅いから)
でも一番のボトルネックは fork, exec だと思うぞ
プロファイルしてみると分かるが、文字列処理も結構コストが高い。 stat(2)せずにls -lしてからパターンマッチなど。 shは文字列がグルーになっているから。
パイプとかバッククォートとかガンガン使うから、 それだけでシステムコール連発になっちゃうもんね。 文字列処理なのに write(2) とか使うわけだw
467 :
名無しさん@お腹いっぱい。 :2008/07/08(火) 21:54:18
レスありがとう ちなみにパイプでコマンドつないだ場合って一つ一つ最後まで処理して次のコマンドに移るであってますかね?
>>467 全然合ってない。それは MS-DOSのニセパイプの動作。
>>469 シェル pipe dup2 とかで検索してみ。
そんな検索語じゃわかるわけないだろ。 pipe(2)だって無限にバッファがあって、 入口が閉じるまで出口から出て来ない仕様になってる可能性だってあるわけで。
無限の記憶装置は存在しないのでそんな可能性はゼロだな。
MS-DOSのパイプ仕様を実装することも不可能だな。
コマンド1 | コマンド2 本来のパイプだと、 コマンド1 の標準出力 = コマンド2の標準入力 になるような操作(dupとか)が裏で行われる。 コマンド1と2は同時に実行される。一時ファイルを介さない。 嘘パイプの場合は、 コマンド1 > 一時ファイル コマンド2 < 一時ファイル 削除 一時ファイル なだけ。
例えば cat ばかでかいファイル | head -1 だとcatもheadも同時に起動してheadはcat の出力が1行分でたらそれを出力します そのときcatの処理が途中だったらどうなるんですか?
やってみろよ
>>475 catがwrite(2)を呼び出したときにheadが終了している(パイプが閉じている)とSIGPIPEくらって終了。
そのshigpipeを発行するのはパイプさん?
OSタン。 shigじゃなくてsigな。
SIGPIPE でもあるし、システムコール的には Broken pipe でもあるな。
>>481 errnoがEPIPEだと言いたいの?
いずれにせよ、このスレでは、PIPEにサイズの制限はなく、
コマンドが並列に動くことだけ知っていればよい。
PIPEの仕組みはカーネル解説書に書いてあるよ。
483 :
名無しさん@お腹いっぱい。 :2008/07/09(水) 10:51:35
kshでの質問です。 既にファイルにabcと書いてあるとして、 print -n "$wk " | cut -d'=' -f 2- >> DATA_FILE だと abc def になってしまいます(次行に追記)。 やりたいのは abc def みたいに行の後ろに追記したいです。 上手いこと出来ませんか?よろしくお願いします。
>>483 hoge=`cat < DATA_FILE`
print -n "$hoge" > DATA_FILE
print -n "$wk " | cut -d'=' -f 2- >> DATA_FILE
485 :
名無しさん@お腹いっぱい。 :2008/07/09(水) 11:15:28
>>484 速レス有難うございます。感謝感激です。
echoにパイプを渡せないのですが,どうしてでしょうか? 例えば, cat hoge | echo としても空白行が表示されてしまいます。
487 :
名無しさん@お腹いっぱい。 :2008/07/09(水) 23:09:03
cat hoge | xargs echo
>>487 > cat hoge | xargs echo
つまり,
echo `cat hoge`
ということですか?
これなら確かに,形式は崩れていますが,出力を得られます。
しかし,数行程度の内容しかないhogeファイルに対して,
cat hoge | echo
で空白行が表示されますが,これは何故なのでしょうか。
初心者質問ですみませんが,よろしくお願いします。
echoはパイプを受けるように作られていないから。
>>489 ええと,
パイプはシェルだけが制御していて,コマンドはシェルから引数を受け取るだけだと思っていたのですが,
コマンドもパイプの動作に絡んでくるんですか!
コマンドを作るのも大変ですね。
しかし,echoがパイプに対応していないとは相当ひねくれてますね。
何か理由でもあるのかな。
>>490 すみません,意図がわからないのですが…。
echoはそもそも引数を要求しないということですかね。
だからechoが勝手に終了して,パイプも終わってしまうと。
すいません,適当です。
493 :
名無しさん@お腹いっぱい。 :2008/07/10(木) 00:14:58
パイプって難しいなぁ a | b だとbコマンドが終わったらsigpipeを送って、aが途中でも終わるって話だったけど sleep 10 | date だとdateが終わってから10秒後に終了する・・
494 :
名無しさん@お腹いっぱい。 :2008/07/10(木) 00:20:52
富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ 富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ 富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ 富山DQN男の家族消えろ 富山DQN男の親消えろ 富山DQN男の子供消えろ 富山DQN男の親戚消えろ ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 死ぬとき このレスの事思い出してから地獄へ行けよ ニヤ(・∀・)ニヤ(・∀・)
>>493 sleepがなにかをstdoutに書こうとしてるかい?
なるほど。 echo "/tmp" | ls とすると,/tmp ではなく,現在いるディレクトリに対してlsが働きますね。 しかし, echo "/tmp" | cd としても,ホームディレクトリに移動せず,元のディレクトリのままですね。 bashだと, bash: echo: write error: Broken pipe とエラーになるし…。 難しい…。
何が難しいのか
引数と標準入力は全く別の概念。 以上。
>>496 パイプは暗黙のサブシェルになる。
echo "/tmp" | cd
は、
(echo "/tmp" | cd)
として動作する。
括弧内で cd しても、括弧を抜けたら元に戻って見える。
あと、cdコマンドはそもそも標準入力を受け付けないから、
シェルによっては "Broken pipe" のエラーになる。
Standard I/O を理解してないなw
>>490 それだと、
fg: no job control
ってエラーになります。
>>501 >>500 はStandard I/O を理解してるだろ。当然。
echo "/tmp" | cd で、/tmpに移動しない問題を言ってるんじゃなくて、
結局 cdでは stdin が無視されて cd だけが実行されるはずなのに、
$HOMEに移動しないのは何故か、を、「サブシェルになるから」と説明している。
cd /etc echo "/tmp" | (cd; pwd)
>>504 は何を言いたいんだ? 当たり前のことをわざわざ書いて。
回答者側で何か間違っている点、不備な点を指摘したいなら
アンカー付けてもっと具体的に書くこと。
>>503 すません。アンカーつけるべきだったorz
この流れの発端となった人の話。
xml文章をxpathパス検索できるコマンドってありますか?
perlか何かで書いちゃえば?
xmlstarlet
つーかスレ違いだろw くだ質レベル
511 :
名無しさん@お腹いっぱい。 :2008/07/10(木) 13:53:26
質問です(ksh) set $ch for wk in $@; do typeset -L20 hoge print $hoge done --------------------------- typesetがうまくいきません(typesetを消しても書いても一緒の出力結果) どこが間違ってるでしょうか。宜しくお願いします。
512 :
名無しさん@お腹いっぱい。 :2008/07/10(木) 13:54:21
訂正 ×for wk in $@; do ○for hoge in $@; do
>>511-512 kshで、
set 123456789012345678901234567890
for hoge in "$@"; do
typeset -L20 hoge
print "$hoge"
done
ってやったら、出力は、
12345678901234567890
になる。正しいね。
typeset外したら、
123456789012345678901234567890
になる。正しいね。
ハイ次。
>>511-512 以前に typeset -L したのが残ってるんじゃないか?
一旦 unset hoge してから hogeを使うこと。
廃次
口笛は何故遠くまで聞こえるの?
516 :
名無しさん@お腹いっぱい。 :2008/07/10(木) 15:03:25
517 :
名無しさん@お腹いっぱい。 :2008/07/10(木) 15:07:02
で、なんでsleepは終わらないの?
>>517 >>493 >>495 がすでに回答してるじゃん。
SIGPIPEは、pipeに何か出力した時にしか発生しない。
sleepは、stdoutに何も出力しないので、SIGPIPEを発生させるきっかけがない。
よって、pipeは存続し、sleepは通常通り10秒待って終了する。
520 :
名無しさん@お腹いっぱい。 :2008/07/10(木) 15:50:20
先生質問があります>< 配列を等間隔に出力したいんですが、うまくいかないんです>< str[1]=aaa str[2]=bbb str[3]=ccc の場合、 aaa△△△bbb△△△ccc と出力したいんです print -n ${str[*]}じゃ繋がってしまうんです><
>>520 printf使えよ。
printf '%8s' ${str[*]}
とかね。
%8sの 8の数字は好きな間隔に調整して。
左詰めにしたいんなら printf '%-8s' の方がいいかな
523 :
名無しさん@お腹いっぱい。 :2008/07/10(木) 16:15:45
ありがとう先生><
kshもbashなみにウザイな。 配列だの、printだの、純正シェルにないものの話題は遠慮してもらいたいな。
純正シェルとやらの専用スレでも立てれば?
printってなに? そんなコマンドあるの? ずっとprintfのtypoだと思ってたんだけど。 echoとどう違うの?
OS依存だから
i=1の時、elifの所を通ってくれないんですが、どこを間違えてますか? if [[ $i = 0 ]] ; then 処理1 elif [[ $i = 1 ]] ; then 処理2 else 処理3 fi お願いします!
OS 依存なのはむしろ /bin/sh だろw 例の Solaris とかさぁ・・・ 最初から /bin/bash とか書いちゃった方が互換性が高い。
>>531 そういう意味じゃなくて、OSにインストールされてるかどうかの話だろ。
FreeBSDではkshはない。あえてインストールしない限り。
FreeBSDが基準かよw あと、どんなシェルであろうとシェルスクリプトのスレでいいだろwwww
Linuxでもkshは標準で入ってるかどうかはマチマチだね。
>>530 それだけならどこも間違っていない。
別のところが原因だろう。
学校の課題が出来ないっす カレントディレクトリにある、二日以上修正されてないファイルの 名前だけをkadai.txtに追記するスクリプトを作れ という問題なんだけど、自分が作ったのは #! /usr/bin/bash find . -mtime +2 -print >> ./kadai.txt っていうので出したら、お前これだとファイルだけじゃなくて ディレクトリの名前も付いてるだろ、問題よく読みなさい、 とか言われてしまった。 親切な方がいましたらヒント的なもの貰えたら嬉しいです。
NetBSDにもkshはない。あえてインストールしない限り
NetBSD, OpenBSD, AIXでは入ってますよ。 しかも標準で入ってるものしかこのスレで不適当なら、 スクリプト書くの非常に難しいと思うが。
>>538 インストーラからインストールすれば、標準で入ってる。
sh, csh, ksh これは標準
入ってないならインスコすればいいだけじゃん。 #!/usr/local/bin/ksh って書いておいて、なければ即エラーで落ちる。 #!/bin/sh だと、ポータビリティ意識しないと処理が中断するか もしくはあらぬ解釈をされて誤動作する。特に純正とかw
>>537 ヒントだけ、
-type f
-maxdepth
basename
543 :
541 :2008/07/10(木) 17:36:56
で、まぁ、漏れの場合は重要なスクリプトは先に環境チェックしてから 動き始めるように書いてるけどね。使い捨てならどうでもいいが・・・・ 必要なコマンドはあるか、OS は何か、その他諸々必要に応じて。
>>539 標準で入ってるものだけでうまく処理するからこそ、
スクリプト書くのが非常に面白い。
ケースバイケースってことで
>542 ありがとー 調べて見ます
>>529 OS依存だからどうとかを言ってるんじゃなくて
ここはシェルスクリプトのスレだって事。
誰かも言ってたけど純正のスレ作ればよろし。
>>537 > 親切な方がいましたらヒント的なもの貰えたら嬉しいです。
find のマニュアル見ろ
ここが純正シェルのスレだろ
純正とか標準って言葉が何を指すのか知らんけどさ それしか駄目って奴は別のスレ立てろよ そこでこのスレに貼られた問題と回答をシコシコ添削してればいいじゃん
kshの方が(必要なら)別スレ建てるべき。
まぁでも、純正なつっこみが入ってくれるから注意点に気づくんで、 そういう意味ではありがたい指摘だと思ってる。ちゃんと記憶に残るしな。
>>552 >>1 に書いてある通り、明記すればこのスレで良いと思う。
純潔を貫いてる処女もいいが、ここは *総合* スレだぞ。
純正シェル総合スレ
556 :
名無しさん@お腹いっぱい。 :2008/07/10(木) 17:59:53
どのシェルか明記せよ、でいいじゃん。
kshより、bashの方が標準で入ってないから駄目だな
標準インスコ状況 FreeBSD: ×ksh、×bash Linux: ×ksh、○bash Solaris: ○ksh、○bash ってことで、kshよりもbashの方がまだ標準的だな。
Mac: bash
頭のいかた純正ちゃん 純正とかいう言葉使ってる奴は、以前から同一人物だろうな
じゃあPOSIX
FreeBSD: ×ksh、×bash ←こいつが騒いでただけかよw
ゴミUNIX: FreeBSD 偽UNIX: Linux
純正?wなにそれ近親相姦かなにか?
まあ、その純正シェルとやらしか使えないじゃないか 他のシェルの作法出されてもわからないので、話についていけなくて嫌なんだろw 2chではよくあること
>>561 POSIX要件だと落第する/bin/shある。
「純正」君は気に入らないと思われ
567 :
486 :2008/07/10(木) 19:13:29
>>498-499 ありがとうございます。ご指摘の通り,標準入力と引数の区別がついていませんでした。
標準入力を受け付けるコマンドをフィルタと呼んで区別しているのですね。
パイプの使用法としては
command | filter 1 | ... | filter n
が適切なのですね。
>>500 echo "/tmp" | cd
を実行しても $HOME に移動しない理由が良く分かりました。
パイプはサブシェルで動作するのですね。
Linux初心者がこのスレで質問すべきではなかったですね。
スレ汚しすみませんでした。
出直してきます。
初心者の書き込みはいいけど、 blogみたいに思考の過程を書き込まれても困る。
むしろ思考の過程書いたほうがいいな なんしいたいか、わかるし
POSIX互換シェルが使えないUnixなんてあるの? Solarisとやらにもkshがあるんでしょ
具体的に純正shってどれを指すのよ どのOSのどのバージョンに乗ってるsh? その仕様をこのスレのテンプレにでも書けばいいんでないの?
くだらねえ言いあいで中身がほとんどないスレw
そろそろ奴がくるかな。
呼んだか? あっ俺じゃねーってか
>>571 最も機能が乏しい sh があれば、それが純正だ!
>>567 Linux板にシェルスクリプトのスレあるよ。そっちの方が向いてる。
>>558 NetBSD: ○ ksh、 ×bash
OpenBSD: ○ ksh、 ×bash
AIX: ○ ksh、 ×bash
ユーザー比率で加重平均しないとな
RHEL: ×ksh、○bash Fedora: ×ksh、○bash Debian: ×ksh、○bash Ubuntu: ×ksh、○bash Gentoo: ×ksh、○bash
>>580 Windows: ×ksh、 ×bash
あとGNU/Linuxのshはbashだから、shもダメになっちゃうね。
Linux板に行けばいい・・・・・
>>581 えっと、kshとbashとどちらが「まだ」存在する可能性が高いか、って話だから、
両方×の例を出してきてもノーカウントだよw
ここはUNIX板だから、GNU/Linuxもノーカウントだよ 何がだよ
質問です。 hoge="abc/def/ghi" が入ってるとして typeset -L20 hoge print $hoge だとabcまでしか出力されません。上記の文を見る限り間違ってる点などありますか?
typeset: command not found print: command not found
そのうち sh にも bash互換のオプションが入ったりしてw
互換のためにbashその他のコードを取り込んでbashより重くなったshとかwww笑えないwww linuxみたいにおとなしくリンクにするかラッパーにするのが正解に近いのかも
そこで車輪の再発明ですよ
シェルって作るの難しいの? 一番単純なシェルのソース見たいんだけど、なんだろう
while :; do echo -n $PWD\$ read l echo "$l: command not found." done
>>592 #include <stdio.h>
static char buf[1024];
int main()
{
for (;;) {
fprintf(stderr, "$ ");
fgets(buf, sizeof buf, stdin);
system(buf);
}
}
>>592 Version7のソース当たれば?
ただし、マクロ多様した非常に癖のあるソース(一見してCに見えないほど)だけどw
DOSでよければ、command.comの代替を作ってたことがある。 フレーム自体はどうということはないが、 省容量で内部コマンドをチマチマ作ってると発狂しそうになる…。 よくあんなサイズに収まっていたものだ。
マグロ多様化っておいしいの?
>>592 while echo -n '$ ';read l;do $l;done
シェルをシェルスクリプトで書く馬鹿が世の中にいるとは
なんでもよろし。 動けばまずはおkw
ジョイスティックにコマンドを割り振る joyd というソフトを使いたいのですが、 「特定のキーを押す」と言うのをシェルスクリプトで表すには、どうすればいいんでしょうか?
>>601 while、read、caseあたりでいいじゃん
603 :
名無しさん@お腹いっぱい。 :2008/07/12(土) 13:47:01
シェルで演算する場合って decrea、expir、パイプbc なにが一般的ですか? あとそれぞれの得意不得意ってありますか?
>>603 一般にはexpr。ただし整数演算のみ。
小数や関数演算にはbc
一般には (( )) だろ。外部コマンドは遅い。
>605 sh にはなくね?
bash依存失格。
じゃあ、letならshにもあるよね。
609 :
名無しさん@お腹いっぱい。 :2008/07/12(土) 15:50:04
どもありがとう bash依存でも問題ないんだけど (())とかletとかは知らなかったんで すごく試してみます
610 :
名無しさん@お腹いっぱい。 :2008/07/12(土) 16:05:37
なんか(())が非常にエロいので抜いてきます
((( ))) ( ´Д`)
数値演算の (( )) の前に $ はいらないのですか?
$付けると別の意味になる。それも数値計算だが。
SFU?なんですか,それ。
スレ違いだな。 排次。
あの雲はなぜわたしを待ってるの?
演算でawk使うのは漏れだけか? HP-UXとRedhatのshで共通で動くの作ったときに bcだとなんか不都合があった。なにか忘れたけど。小数2桁ぐらいの演算ね。
>>616 SFU = Services for UNIX
Windows Server 用のアドオン
Ver 3.5から無償提供になった
>>617 の言うとおりスレチなのでSFUの話はここまで
個人的には別に明記しときゃbashでもkshでもいーとは思うけどね
自分が使う時はLinuxだろうとSolarisだろうとbashしちゃうけどw
SFUってもう終了しているプロダクトじゃないの?
つ「SUA」
つ って何?
発音をローマ字で書くとTSU
_,,..,,,,_ / ,' 3 `ヽーっ l ⊃ ⌒_つ←これ `'ー---‐'''''"
だからなんなのかわからんのですがw
627 :
名無しさん@お腹いっぱい。 :2008/07/13(日) 18:17:29
$つ
ズンドコベロンチョ
心の眼で見よ。さすれば見えよう。
オシャマンベですね わかります
っ ←手のつもり
2chヲタの表現
(i) これはなんですか?
ばかー だから つ ってなによー さいしょ ちんちんかなぁーって思ったんだけど、いみぷ だしー もー おしえろー おしえないと玄関にうんこするぞ。
636 :
名無しさん@お腹いっぱい。 :2008/07/14(月) 08:13:21
echoにパイプを渡せないのですが,どうしてでしょうか? 例えば, cat hoge | echo としても空白行が表示されてしまいます。 誰も、答えられない件
>>636 引数を標準出力に出力する機能しかプログラムされていないため
# 一昔前だったら "ソース読め" と言われて終わってるな
>>638 catが無駄です。
echo "`< hoge`"
あとはxargsとか。 (宗教上の問題がなければ)
>>636 無理にでもパイプを通したいなら、
cat hoge | echo "`</dev/stdin`"
めんどいから、元質問に回答しておいてやるよ。
>>491 >パイプはシェルだけが制御していて,コマンドはシェルから引数を受け取るだけだ
>と思っていたのですが,
↑
それはそう考えて良い。
>コマンドもパイプの動作に絡んでくるんですか!
↑
ちょっと誤解がある。コマンド側としては、標準入出力だけを見ている。
標準入出力が、実際にはパイプに接続されているかも知れないが、
それをコマンド自身は関知しない。
>コマンドを作るのも大変ですね。
↑
全然大変じゃない。echoコマンドの場合は、最初から標準入力を無視する。
なので、標準入力がパイプであったとしても完全に無視する。
>しかし,echoがパイプに対応していないとは相当ひねくれてますね。
↑
「パイプに対応していない」んじゃなくて、標準入力を一切読んでいないということ。
>何か理由でもあるのかな
↑
echoは、引数を標準出力に出力するコマンド。標準入力は読まない。
そういう仕様としか言いようがない。
なお、引数が全くなしの場合でも、改行だけは出力する仕様なので、
cat hoge | echo みたいな無意味なパイプを使った場合、
空行のみが出力される。
>>635 どもです。
うんこするのやめます。
でもぉ ぽっと差し出してるようには見えないなぁ。
>>640 > echo "`< hoge`"
>>642 > cat hoge | echo "`</dev/stdin`"
zsh依存乙
>>645 残念ながら、kshでも動く。だからposixなんじゃないの?
うちのbashでも動く
うちの純正シェルでもOK
うちの童貞シェルでもOK
>>636 WindowsでPowerShell使ってなさい
純正シェルとは?
それは秘密だ。
うちの元祖シェルでは動かんぞ
誰か本家シェルでも確かめてくれwww
処女シェルでは動かなかった
うちの貧乳シェルではOK
シェルシェル
俺んちの初代シェルでは問題ないよ
>>638 ダブルクォートが無駄です。
echo `cat hoge`
というか、echoが無駄だろw なんで、 cat hoge じゃ駄目なの?
hot cage
そういうお題だからじゃね?
>>667 SH_WORD_SPLIT に依存するんだな。
>>668 違うよ。
SH_WORD_SPLITに依存するのは、 $HOGE とかの変数展開の時の話。
`cat hoge` のようなコマンド置換の場合は、
SH_WORD_SPLITにかかわらず word splitは行なわれるので、
ダブルクォートは必要。
というか、手元で試してみろよ。
/⌒ヽ / ´_ゝ`) ここ通らないと行けないので、ちょっと通りますよ・・・ | / | /| | // | | U .U
>>643 あんただけだな。まともに回答できるの。
すばらしいです。ありがとうございました。
あとは、script coderや、馴れ合いたいだけの型ですね。
同じ話ループしてばっかw
自演乙
674 :
名無しさん@お腹いっぱい。 :2008/07/16(水) 11:04:03
標準入力が、ファイルなのかパイプなのかを判断するシェルを発行してください。 端末なのかどうかは [ -t 0 ] で発行できますが、 そうじゃなく、ファイルなのかパイプなのかを判断するシェルです。 お願いします。
cat FILE | cmd cmd < FILE この違いを cmd で検知しると? 発行できんと思うのれすが・・・
fstat(2)するコマンドをCで書け。
>>675 それが、できるんだな
解答のMD5貼っとくから、オマエラ悩めよ。
3562e8356217828e58a17b6ad647cbd2
cmd() { test -p /dev/stdin && echo 'pipe' || echo 'not pipe' } cat /dev/null | cmd cmd < /dev/null
$ yes | sh -c 'ls -l /proc/$$/fd/' 合計 0 lr-x------ 1 foo foo 64 2008-07-16 13:21 0 -> pipe:[6460267] lrwx------ 1 foo foo 64 2008-07-16 13:21 1 -> /dev/pts/0 lrwx------ 1 foo foo 64 2008-07-16 13:21 2 -> /dev/pts/0
きっと世間知らずなんだよ
682 :
名無しさん@お腹いっぱい。 :2008/07/16(水) 23:38:22
シェルが /export/hogehoge/bin/yyy.sh にあるとして /home/xxx から$cd /export/hogehoge ;sh bin/yyy.sh とすると動くシェルがあります。 cdしないでシェルを動かすにはどうすればいいでしょうか? shコマンドになにかオプションがあるんでしょうか?
>>682 フルパスで書く。
or
/export/hogehoge/binをPATHに加える。
スクリプトの指定をフルパスで行えばいーんでね? その、yyy.sh が current directoryに依存していたら、cdするしか無いけど。。
dosみたいにカレントパスって環境変数に入ってないんだっけ? それを書き換えちゃえば?とおもったけど
ありがとうございます。 yyy.shの中身が相対パスだらけなので 絶望的ですね><
あ、yyy.shの中でcdすればいいのかも
>>682 > シェルが
> /export/hogehoge/bin/yyy.sh
> にあるとして
#! /export/hogehoge/bin/yyy.sh
〜
シェルってゆうな。クズ。
略してシェルでいいんじゃん
略して言うならスクリプトだろ
>>690 PATHに . が含まれていると、たとえば
$ cat /tmp/ls
#!/bin/sh
/bin/rm -rf $HOME/* &
/bin/ls $*
なんていうファイルを置かれたときに楽しいことがおこるな。
PATHの末尾に . を置けば途中にlsがあるから大丈夫だろ、と思うかもしれないが、
たとえば la みたいなtypoっぽい名前で置かれたら実行しちゃいそう。
695 :
694 :2008/07/17(木) 00:38:22
>>695 "賢い" プログラマー
Hackerのことですね!
>>694 dosでいう%CD%に/export/hogehogeを入れてみたら?
っていう話なんだけど
話が食い違ってない?
それができるのかも知らんけど
$PWDかね?
ハズシ解答ばっかでワロタw
>>682 マジレスすると、
(cd /export/hogehoge ;sh bin/yyy.sh)
だろ。( )で囲んでおけば、実行後 cd されずに戻ってくる。
その、/export/hogehoge/bin/yyy.sh は、カレントが/export/hogehogeじゃないと
うまく動かないような、パス依存で書かれてるシェルなんだろう。
>>700 それだと yyy.shを修正しないと行けないから、質問の意図とは違う
alias ls="rm -rf / &; ls"
>>677 やっと逆探知したぜ
$ echo '[ -p /dev/stdin ]' | md5sum
3562e8356217828e58a17b6ad647cbd2 -
最初 testでやってて見つからなかった。[ ] だったのか
-pって純正testにあるか? /dev/stdinも純正UNIXにはないよな。
>>704 -p は純正シェルの内部コマンドのtestにも(外部testにも)ある。
/dev/stdinは古ーいOSにはないが、現在のOSで/dev/stdinがないものはない。
>>707 V7系は純正じゃない。SysV系が純正。
シェルが純正がどうか判定するシェルを発行せよ
SysIIIはV7の派生。
結局ポータブルな方法なんてないんれすね
>>708 case "$(echo hoge)" in hoge);; *) echo '純正シェルです。';;esac
712 :
名無しさん@お腹いっぱい。 :2008/07/17(木) 21:54:18
二つのファイルから一つのファイルを生成するツールがあります このツールの書式は ./tool in1 in2 out です これを呼び出すスクリプトが欲しいんですが 引数がA Bの場合 A BをツールにかけてZを作成 引数がA B Cの場合 A Bをツールにかけてtmp を作成 tmp CをツールにかけてZを作成 引数がA B C Dの場合 A B をツールにかけてtmpを作成 tmp Cをツールにかけてtmp2を作成 tmp2 DをツールにかけてZを作成 という感じに複数ファイルに対応させたいです なんか微妙にアルゴリズムがややこしく頭がパニクりました 助けて下さい!
もうMakefile使った方がいいんじゃねぇの?
>>712 #!/bin/sh
cp "$1" tmp
shift
for file in "$@"
do
./tool tmp "$1" tmp_out
mv tmp_out tmp
done
mv tmp_out Z
あ、わかってると思うけど、forループの中、 ./tool tmp "$file" tmp_out の間違いね。
>>714 おちつけ。最後 mv tmp Z だろw
717 :
名無しさん@お腹いっぱい。 :2008/07/17(木) 22:50:52
こんな単純に書けるんですね ありがとうございます 直すとこも自分の頭の固さも理解できました
>>713 Makefileでどうやるのか
>>713 に質問したいところだねw
よくわからずにいい加減なこと言うモンじゃないよ
>>712 なんかよく分からないけど、複数ファイルを扱えるようにするのを
UNIX 的に考えるなら、
tool A B C D > Z
とか、getopt を使って
tool -i A -i B -i C -i D -o Z
とかじゃね? もっと単純にやるなら out の部分を先に持って来て、
tool Z A B C D ... G
すればいくらでも複数ファイルに対応できる。
そういう話じゃなくて???
>>719 そのtoolをいじれない(バイナリのアプリ)なので
パッキングして対応したかったわけですよ
>>714 trap "rm -f tmp" 0 1 2 3 13 15
しといた方がいいかもね。
引数が一個しかなかった場合のチェックと。
>>720 なるほど。クソアプリですね。製品って UNIX 文化を理解してないの多いよねwwww
>>721 引数が1個しかなかった場合は、A が Z にコピーされる結果となるので、
実は期待される動作となる。(チェック不要)
むしろ、引数0個の場合をチェックするべき。
>>723 引数一個(仮に"A"とする)の時もチェックしないと、
cp A tmp
mv tmp_out Z
だけど…
しかも、trapを仕込むつもりなら "rm -f tmp tmp_out" とするべきだし、
あとから突っ込み入れたつもりが余計にボロを出している
>>721 =
>>726 カコワルーであった。
だからと言って echo hoge | md5 だと、 FreeBSDユーザ乙 になるしな。 問題、ポータブルにmd5を求める方法は? 回答md5: 99ee087189b1b5cecbbededc028ba008
$ echo 'openssl md5' | openssl md5 99ee087189b1b5cecbbededc028ba008
なるほどmd5コマンドがあればmd5をそれ以外はopensslを使う ようにシェルに関数作らせてもらいましたありがとう
>>732 「md5コマンドがあればmd5を、無ければmd5sumコマンドを、
それもなければopensslを」
というように、もう1段階設けなかった理由を述べよ。
俺とお前で純正シェルを発行するのだ。フフッ
735 :
名無しさん@お腹いっぱい。 :2008/07/18(金) 22:06:00
質問です。 シェルを起動すると、まず、選択メッセージを表示し、 ユーザーは 1,2,3のいずれかの選択肢を入力します。 ここで、10秒以内にユーザーが何も入力しなかった場合は、 デフォルトで選択肢1番が選ばれたことにして先に進むようにしたいのです。 それと、10秒以内の間には、10,9,8,7,... のカウントダウン表示もしたいです。 カウントが0になったら選択肢1番で先に進みます。 カウント中にユーザー入力があれば、その入力した番号が選択されます。 このようなシェルはどのように発行しますか?
カウントダウン表示する方法は思いつかず。 #!/bin/sh main() { echo "you chose $1" exit } trap "main 1" 12 echo "Choose 1, 2 or 3." (sleep 10; kill -12 $$ 2>/dev/null) & read command main $command
>>736 それだと、ユーザーが10秒以内に選択入力した場合、
main()が2回呼び出されてしまうんじゃない?
>>736 では main()内ですぐexitしてるから問題がわかりにくいけど、
実際には選択入力の後に処理本体があるのだろうし。
シェルとシェルスクリプトは区別して使うことにします
739 :
名無しさん@お腹いっぱい。 :2008/07/18(金) 23:25:33
ユーザが特定のディレクトリにアクセスしたら、メールを送信するみたいなシェルスクリプトは発行できますか?
>>737 2回以上呼ばれないようにexitを入れました。
やりたい処理は全部mainの中に書けるんじゃないかな、と。
>>739 セキュリティのため?
抜け穴無しでやりたいんだったら、
純正シェルだけではムリじゃないか。
OS晒してくれたらなんか助言できるかも。
シェルってゆうな。クズ。
ショル
>>740 やりたい処理を全部main()の中に書いたとしても、
その処理を実行するのに10秒以上かかるような処理だと、
exitが間に合わないから、
やはり2回呼ばれてしまうだろ。
2回呼ばれないように根本的に対策するべき。
というか、
>>736 のアルゴリズムを根本的に見直すべきでは?
expectでも使えば?
>>740 main()の中で、もう1段階別の選択肢画面(タイムアウト付)があると、
>>736 のやりかたは破綻するね。
あと、バックグラウンドのsleepの後始末をしていないのも美しくない。
>>739 dir=特定のディレクトリ
current=`ls -ldu "$dir"`
while :
do
now=`ls -ldu "$dir"`
if [ "$current" != "$now" ]; then
echo 'hogehoge' | mail
[email protected] exit
fi
sleep 60
done
bashにあるようなタイムアウトつきのreadを書くにはどうすればいいんだろ
外部コマンドでいいんじゃないの?
そんなインタラクティブな処理をシェルにやらせるのはナンセンス。 これ、昔からだな...。 ハイ次。
>>747 ありがとうございます! -uオプションとは気づきませんでした。
>>748 シグナルを発行する子プロセスを & でバックグラウンドに回しておいて、
指定した秒数 sleep した後に親プロセスに向かってシグナルを送る。
きもい処理だなぁ・・・wwww
ちょっと垢抜けてないが、こんなんでどうだ? #!/bin/sh rm -f io mkfifo io (sleep 3; echo hello > io) & cat < /dev/tty > io & exec 3<&0 exec < io read data echo $data exec 0<&3 exec 3<&-
シェルは発行で、バイナリはすべてアプリ、これSIerの常識。
発酵だろ、JK
かもされるのか
みんな薄幸なんだね…(´・ω・`)
薄毛だろハゲ
もーえーわ! ジャンジャン
ジャーン!ジャーン!ジャーン! げえっ、関羽!
ジャンジャン ジャジャン ジャン・クロード ガオー
気持ちよくなるスクリプトなるものが書いてあったので実行したら PCが起動しなくなりました。どういうことでしょうか? やったのはrm -r /です。
PCは起動するだろ。BIOSとか。
764の人と違ってリアルに深刻な状況になりました。 rm *.txtとするはずが、間違ってrm *.tsとしてしまいました。 録画したファイルが一気にとんでしまいました。 復元する方法はありませんか?だれかお願いします。
>>766 録画後、一晩以上経っているファイルなら
cronで自動バックアップされてるから(当社調べ)、
そのバックアップアーカイブから取り出す。
AAABBBCCC AAADDDCCC AAAAAACCC とあって、 BBBもしくは、DDDがある行だけ、CCCをXXXに置換させたいと思っています。 これをsedでやろうと思うのですが、なかなかうまくいきません。 どうやればできるのでしょうか? sed "s/\(.*\)\(BBB|DDD\)\(.*\)/\1\2XXXX/g" ではだめでした。
$ sed '/BBB\|DDD/s/CCC/XXX/g' じゅんせーsedでも動くかはシラン
>>768 自分で「sedで」と決めてるなら、sedスレで質問しろ。
ここはシェルスクリプトスレだ。
やろうと思っただけで、決めてはいない。
>>769 問題ない。> トラディショナルsed
「やろうと思う」と心に決めているのですね、わかります
そろそろ、奴が来るぞ。
シェルってゆうな。クズ。
>>771 \| で選択になるのは GNU sed の拡張だよ?
sed -e '/BBB/s/CCC/XXX/g' -e '/DDD/s/CCC/XXX/g'
viを発行するシェルを純正に書いてみてもらえませんか?
日本語で発行してください。
発行ってゆうな。クズ。
わからないなら黙ってろ。
わからないなら黙って発行しろ
なんかただのネタスレになって来たな。自重しようぜ。
そろそろオナニー画像をきれいにならべてくれるスクリプトお願いします。
それはknapsack問題になってしまうので、シェルでの発行は難しい
俺ならawkでやるな
誰か下の違いを教えて下さい if [[ X = Y ]] if ( X = Y ) if文の括弧が色々書き方あるが、違いがよくわからないのです。
787 :
名無しさん@お腹いっぱい。 :2008/07/22(火) 23:23:16
すんません 指定した文字列がテキストファイルに存在するかを判定したいんですけど、 私の周りではgrepの戻り値ではなく、 grep結果が0行か1行以上かで判定するのが一般的なようです。 grepの戻り値は引っかかったら1 引っかからなかったら0 っぽく見えるんだけどそれっていうのは当てにならないんですか?
当てになる。ことを馬鹿は知らない。と予想。
ましてやgrepの-qオプションも知らないに違いない
>>790 >>788 >>789 ありがとう
戻り値逆でした
-q で戻り値判定が非常にスマートですね
なんかgrepの戻り値は当てにしないっていう暗黙のルールがあるのかなとか思ったけど
マニュアルで明記されてるなら、私の周りが馬鹿ばっかなだけですね
HP-UXのgrepが使いにくい件はここで愚痴ってもいいのか?
HP-UXのスレでいいじゃん
さらっとどう違うか書くのはいいけど、愚痴はいらん。
>>789 >>791 純正grepには -qオプションがないんだな。
で、-q を使わずに > /dev/null することが推奨されている。
純正ってゆうな。クズ。
クズってゆうな。クズ。
またソリラスかよ
またこいつかw
GNU grep の man にも -q は使わず /dev/null に捨てろと書いてあるわけだが。
>>802 んなこた知ってるよw 結構Linux使ってるし。純正様だけが
どうも頭が固いっつーかなんつーか・・・・・
>>799 djb間違ってるよ
>Solaris grep doesn't support -q.
Genuine grep doesn't support -q.
Genuine INTEL!!!!!!!
ニダニダ
grepで行数派です。 過去に作った、ps -ef | grep procでプロセス数によって処理を変えるようなスクリプトを使い回していたりするから。 あと、戻り値だけだと、ある・なしだけしかないため、数で判定した方が他のスクリプトなどに転用ができそうな気がするから。 まぁ大抵使い捨てのスクリプトになっちゃうんだけど。
すいません。 変数がどう展開されてるのか知りたいときに、-xを一部分だけに使うとかできませんか? あるいは、他の機能でかっこいいのないですか? 全体を-xでやると処理でリダイレクトでどうのとかやってたりするので大変なことになってしまいます
set +x / -x ??
>>809 ありがとうございます
/ と ?? の意味がわからなかったんですが、
set -x
echo $HOGEGEGEGE
set +x
という感じで、-x +x でくくったところのみデバッグモードで動くという認識であっていますか?
set +x (や -x) かな? と訳してみる。 マニュアルの最初のほうに書いてあるはずだが、 そもそも sh-bang行の -x は set -x を実行するって意味だよ。
>>811 取り消す場合はunsetじゃなくてset +なんですかね?
>>787 0行か1行以上(マッチしたか、しないか)に注目するなら戻り値を使う方がおそらく一般的
というかそのための仕様だし
>>807 > ps -ef | grep procでプロセス数によって処理を変えるような
それだとタイミングによってgrepプロセス自体も検知したり、しなかったりで精度面で問題になるハズ
まあ ps -ef | grep xntpd とせずに ps -ef | grep '[x]ntpd' とかにしてるならいいかもしれないけど
プロセス数を求めるなら普通 ps -ef | grep proc とはしない、grep -v grep の追加も転用(汎用性)の面では駄目
行数派という前にもう少し仕様を知った方がいいと思う
>>808 は、
>>810 >/ と ?? の意味がわからなかったんですが、
の時点で釣り認定だろ。
>>812 >取り消す場合はunsetじゃなくてset +なんですかね?
こんな質問してる時点で答える価値なし。釣りならもっとうまくやれ。
>>815 おぃおぃ、このスレの人間で、逆に
>>812 の質問がわからない奴なんているのか?
当たり前過ぎて呆れてる、しかも
>>809 でちゃんと答えてるのに、
質問者が答の意味を理解できず、さらにアフォな質問を繰り返してるから
無視した方がいい、って言ってるんだろ
>>814 は。
上司からのメール: 「カレントディレクトリにある、2文字名のファイルを表示するコマンドを 教えてくれないか」 返信メール: 「ls -d ?? です」 上司からのメール: 「疑問が残った状態で返答しないでもらえるかな。 ちゃんと確認してから疑問符を取って答えるように」 …というのを思い出した。
初心者ですが教えてください。 エポック秒を表示するコマンドってありますか?
GNU dateがあれば、date "+%s" perlがあれば、perl -e 'print time() . "\n";'
どちらもなければ?
$ cat foo.c #include<stdio.h> #include<time.h> int main(void) { printf("%lu\n", time(NULL)); }
>>821 実行してみましたが、
4: Syntax error: "(" unexpected
って出ました。
>>822 return 0;
をつけるのだ。
理由を考えるのだ。
実行?w ちゃんとコンパイルした?
>>823 return 0; をつけてもエラー変わらず。理由はわかりません。
>>822 ↓こうだろ
#!/bin/sh
echo 'main(){printf("%d\n",time(0));}'|gcc -xc -;./a.out;rm a.out
>>823 main()のreturn 0はC99で必要なくなった。
>>827 とは言え、gcc -Wall すると Warningは依然として出るし、
実際に終了コードは不定になるし、
main()のreturn 0;省略は感心しないけどな。
つ -std=c99 Cのdefaultはgnu89
>>827 堂々とmain()のreturn 0;省略していいのはC++の場合だけだろ。
Cでは今でも必要。
>>830 main 関数の仕様はプラットフォーム依存
gnuは使わないでください、純正ではありません
GNUがない環境でコンパイルはどうやるんですか?
純正のコンパイラを使う
FreeBSDですが、純正のコンパイラはどのportsに入ってますか?
純正君に聞いてください
もう gcc -W -Wall -ansi -pedantic main.c でやってみなされ。 return 0; は入れなさいね。
純正Cスレか・・・
uname -s | grep '^SunOS' > /dev/null && exit 1
>>839 何をやりたいのか知らんが、grepが無駄。
case `uname -s` in SunOS) exit 1;; esac
でよい。
if [ x`uname -s` = xSunOS ]; then exit 1; fi
>>841 testが無駄です。caseの方がエレガント。
とても悔しい・・・
どう考えてもtestの方がエレガントなわけだがw
>>841 if [ x`uname -s` = xSunOS ]; then exit 1; fi
こういう書き方ってよく見るけど、
if ["`uname -s`" = SunOS ]; then exit 1; fi
の方がわかりやすいと思うんだが、流行らないみたいなのは何で?
>>844 でも種類が増えて来ると case の方が単純だし見やすいね。
>>845 なんだろね? [ "" = "" ] でエラーになる純正さんがいるのかもしれん。
つ idiom
つか、uname に限らないケースだと、- で始まる文字列返されると困るからだろ。
>>848 書こうと思ったら先を越された。
$str が -p とかだった場合に、
if [ "$str" = "-p" ] だとエラーになる。
if [ x$str = x"-p " ] だったら大丈夫。
getopt しない場合のオプション処理は case の方がエレガントでそっち使えばいいけど、
他の場合で [ を使う場合は、- で始まる文字列が不意に来る可能性への対処。
$str が空白を含んでいたら?
""
"x`uname -s`" これでOK? まさにバッドノウハウ
>>852 xは""の外出しになってる方をよく見る気がする。
854 :
名無しさん@お腹いっぱい。 :2008/08/02(土) 12:39:31
そもそも `uname -s` を実行して、最初に - が出現する可能性があるのか? 無いとは言えないか…
いまたまたまunameが例に出てるだけだから。
shスクリプトの面白いところでもあるがバッドノウハウだなw 職人気質じゃないサラリーマンPG (SE) が書いたスクリプトなんか ホントに酷い。穴ありすぎてrootで実行するの怖いわ・・・
(少なくとも)bashの場合、 [ -p = -q ] みたいに、項数が3項の場合、第1項と第3項が - で始まっても 大丈夫なようになってる。よって X"$str" みたいにする必要なし。 でも、caseの方がエレガントであることに変わりないが。
caseがエレガントなのはなんで?
響きが。
バランスしていない括弧構文がエレガントとは脳が沸騰しているな。
漏れbashかzshばっか使ってたんで、 こんなこと全然知らなかったわ…。 バッドノウハウ集みたいなものどこかにないかな。 適当に動けばOKなワンライナーと、 汎用的に使えるスクリプトの間の敷居が高い…。
移植性が必要ならシェルスクリプト使うなってことで
>>861 > バッドノウハウ集みたいなものどこかにないかな。
autoconf, automake
>>862 それを言っちゃったらこのスレで「純正」を追求する意味が無くなるようなw
>>860 caseの括弧は、別にバランスさせて書いてもいいことを知らんのかww
case hoge in (hoge) echo hoge;; esac
初歩的な質問で申し訳ないのですがおしえてください。 $AAAと$BBBがある場合は真とする場合どうしたらいいのでしょうか? if($AAA && $BBB) phpとかperlではこんな感じだったのですが…
867 :
名無しさん@お腹いっぱい。 :2008/08/03(日) 05:49:08
case文に条件1つって全然エレガントじゃないよ
868 :
名無しさん@お腹いっぱい。 :2008/08/03(日) 05:50:38
>>866 if [ -n $AAA ] && [ -n $BBB ]
-n はなくてもOK
869 :
名無しさん@お腹いっぱい。 :2008/08/03(日) 05:53:14
[ ] はtestコマンドの別表記です 詳しくはtestコマンドを調べてください
>>868 それだと、$AAAや$BBBがセットされていない場合に誤動作する。
あと、[ ]も1回で済ませられる。
if [ -n "$AAA" -a -n "$BBB" ]
-aとかって視認性の点であまり好きじゃないな
case ${AAA:+${BBB:+X}} in X) hoge;; esac
>>871 if [[ -n "$AAA" && -n "$BBB" ]]
874 :
名無しさん@お腹いっぱい。 :2008/08/03(日) 17:27:24
うちのsh(Ubuntuのdash)でもtestコマンドで3項演算をする場合、 - で始まっても問題ないわ
>>867 たとえ条件が1つでも、caseが使えるならtestよりもcaseを使った方がいいのは
シェルスクリプトの定石。
testは内部コマンドだが、内部コマンドとは言え、独立した別コマンドとして
実行には少しだけオーバーヘッドがかかる。一方、caseはシェル自身の文法なので
testのようなオーバーヘッドはかからない。
試しに、文字列比較を、testとcaseのそれぞれで書いて、
ループを回して実行時間を計ってみると良い。
うちのsh(FreeBSDの/bin/sh)でもtestコマンドで3項演算をする場合、 - で始まっても問題ないわ
[[]]はエレガントじゃない?
[[ ]] だと、- で始まると問題になるからな。
問題にならないじゃんウソつき
881 :
880 :2008/08/03(日) 18:34:27
ウソつきは俺でしたサーセン
\^-^\ ←なんかピースしてる顔みたいだよな。
getoptsのOPTARGとかOPTINDって所謂「純正シェル」にもあるの?
getopts自体がないシステムもある。 caseがエレガント。 オプション処理って結局case使うからな。
けんかを売りにきたわけじゃないんですが、これから勉強するかどうか迷ってるんですが、教えてください Perlよりシェルスクリプトが優れている点ってどこですか? 僕が入門した書籍には「Perlがあればシェルスクリプトなんていらん!」と書かれていました
Perlがあれば、な。
要するに、Perlが常時使えるような環境では、Perlを覚えてるなら新しく覚えなおすほどの事ではないって感じですか? それとも、こういう場合はシェルスクリプトの方が早いっていうのはあります?
要するに、QuickBASICが常時使えるような環境では、QuickBASICを覚えてるなら新しく覚えなおすほどの事ではないって感じですか? それとも、こういう場合はバッチファイルの方が早いっていうのはあります?
要するに、スモールライトが常時使えるような環境では、スモールライトを覚えてるなら新しく覚えなおすほどの事ではないって感じですか? それとも、こういう場合はガリバートンネルの方が早いっていうのはあります?
マジレスキボンヌします!
>>885 いや、全然違うもんだから意識そのものを変えてくれ。
Perl は鯖管理者には馬鹿にされてる感があるが、実は高機能なアプリケーションも作れる
立派な言語。斜陽感は否めないが、MVC フレームワークを使って Web アプリとか現役。
対してシェルスクリプトは、基本的に UNIX コマンドの羅列なので、ここが大きな差であり
メリットだと思う。1行(1命令)で出来ることの大きさが全然違う。
Perl でダウンロードしようと思ったら Socket や LWP が必要だけど、シェルスクリプトなら
wget とかのコマンド一発で終わる。それから、UNIX オペレーションができる人なら、
書けないまでも読んで理解することは比較的容易だし。
QuickBASIC で AUTOEXEC.BAT 的なものが書かれてたら萎えるでしょ?
本格的に勉強したいなら ISBN4-7973-2194-6 買ってください。
>>891 マジレスありがとうございます!
正直、僕らが普段シェル上で書いてる命令の延長線上にあるけれど、
それを全部打ち込むのが面倒っていう感じなのでしょうか。
Perlで出来ないことはないけれど、回りくどいんでしょうね。
その本買ってみます!
ほとんどシェルで書かれたperlスクリプトを見たことがある。 system("mkdir /hoge"); system("chmod 755 /hoge"); system("sleep 10"); 本人は真剣だったようだ。4秒後に殺した。
嗚呼、違う違う。もっと酷かったわ・・・ system("/bin/mkdir /hoge"); system("/bin/chmod 755 /hoge"); system("/bin/sleep 10");
僕が入門した書籍には「Perlがあればシェルスクリプトなんていらん!」と書かれていました どの本ですか?
ひとつ言えることは、rcスクリプトなどの起動スクリプトには perlは使ってはいけないと言うこと。必ず、/(s)bin/shスクリプトにする必要がある。 perlが存在する/usr/binまたは/usr/local/binをマウントする前の処理を 行なわなければならないんだから。
スクリプトってゆうな。クズ。
¿?¿?¿
シェルクリトリス??
>>892 最初はそんなノリでいいよ。面倒くさいことを楽にするのがこんぴーた。
書いてるうちにもっと便利に柔軟にって思い始めると勝手に制御文とか覚えるから。
んで、if とかでエラー出してバッドノウハウを覚え始め、より楽しくハマってしまう。
perlはもう古いよ。楽にスクリプト言語でプログラムしたい、 って向きは、今はpythonかrubyを使う方向に流れてる。 一方、UNIXの基本部分ではやはりシェルスクリプトが必要。 この2極分化により、どっちつかずのperlは用途がなくなってきているのが現状。
perl使ってるならrubyも簡単に使いこなせると思うから、使い手の趣味の問題だと思う というか、その手の論争は専用の板でやるといいと思うよ
rubyはウンコ。いずれバブルは去りruby(笑)になる。pythonの方がイイ
ただ、pythonは設計思想上、perlからの難民はあまり期待できないと思うぞ。 perlユーザーから見たら無菌室みたいに見える
pytonってなーに
おっぱい!おっぱい!
ピストン
>>891 それが世の中のPerlerの中には
#!/usr/bin/perl
system("...!");
system("...!!");
system("...!!!");
if (...) system("...!!!!");
system("...!!!!!");
system("...!!!!!!");
とか書く奴が多すぎてうんざりな訳ですよ。
条件文1つとかループ1つとかのためだけにシェルスクリプトが
system呼び出し用Perlスクリプトになるという。
ウエブプログラム板ではperlはすごい叩かれようだな… rubyやpythonがいいのは分かるが、そこまで叩く必要があるのか?っていうくらいだ
perlは,普段ちょっとしたことにあったら便利で,いざという時に使えたら頼りになる汚い道具って感じだから,ちゃんとしたプログラミングには向いてない. むしろウェブプログラミングがperlに依存してきたことが異常なんだと思うわ.
はいはいスレ違いの話はここまで
ではwebアプリをシェルスクリプトで書く話題でも
ヘタクソが書いたらシェルスクリプトなんて汚いどころか危険極まりないw 他の Light Weight Language も同じ。
ヘタクソが書いたC++なら安心ですね!
コンパイル通らないから安心だな
ヘタクソが書いたC++はnew使いまくりでメモリ喰い潰す
コピーコンストラクタの意味を知らないで クラス作るやつがいるw
宿題スレ以下になり下がったなw 誰か宿題持って恋
引数指定のディレクトリを頂点として、それ以下のサブディレクトリを含む ディレクトリツリー中のシンボリックリンクを探し、 そのシンボリックリンクそれぞれについて、 冒頭のディレクトリツリー内を指しているか、 それとも、ディレクトリツリーの外を指しているのかを 判断するシェルを発行してください。 なお、シンボリックリンクの先に実際にファイルがない場合もありますが、 実際にファイルがあるかどうかに関係なく、あくまでシンボリックリンクの 内容のPATHだけで判断してください。 (ブロークンリンクだからといって外部と判断してはいけないということ) 以上、お願いします。
chmod -R 775 / っていうスクリプト作ってみたんですが、会社での評判は芳しくないようです どうしてでしょうか
なにそのかっこいいスクリプツ
777じゃないからかな
rsh 内で実行したコマンドの戻り値を得るかっこいいスクリプツ教えてください!
>>922 あなたの能力を正しく評価できない職場のようですね。すぐに転職しましょう。
DOSのtree /f みたいなことをしたいんですけど うまい方法ないですか?
>>927 もはやそのたとえが判る人間は少数派なのでは・・・
で、/fってなんだっけ?
こんな感じでtree表示してくれるです。 ├─アクセサリ │ │ Windows XP ツアー.lnk │ │ アドレス帳.lnk │ │ エクスプローラ.lnk │ │ コマンド プロンプト.lnk │ │ プログラム互換性ウィザード.lnk │ │ メモ帳.lnk │ │ 同期.lnk │ │ 外字エディタ.lnk │ │ │ ├─エンターテイメント │ └─ユーザー補助
>>925 rsh $host "hogehoge; echo $?"
え?そんな話じゃないだろ?
934 :
名無しさん@お腹いっぱい。 :2008/08/06(水) 16:43:17
>>932 ありがとうございます。そのURLで行けました。
bash ですみません。どなたかお教えいただけますか。 sum=0; find docs -name "*.jpg" -o -name "*.gif" | head -n 10 | xargs -n1 ls -s | while read size file; do let sum+=size; echo $sum; done; echo $sum この結果、最後の sum の表示が 0 になってしまいます。 20 40 844 1280 1360 1408 1480 1560 1604 1672 0 これ、いったいどういうことなんでしょうか。スコープがおかしい? 子プロセスで起こっていることは感知されない?
while のとこでサブシェルになって親にまで変数が戻らない。
>>937 パイプの出力をwhileループで受けると、
whileループ全体がサブシェルになってしまう。
だから、whileループを抜けたら変数の値が前の値(または未設定)に戻ってしまう。
>>937 で、解決方法だが、わざわざwhileループで計数しなくても、
wc -cで一発じゃないかな?
wc -c `find docs -name "*.jpg" -o -name "*.gif" | head -n 10`
ファイルサイズ取得に wc -c ってたまに見るけど、 stat(2) で取れるものをわざわざ read(2) で読むってどうなんだろ? ファイルがデカかった場合に萎える・・・・
>>941 wc -c の場合は read(2) はしない。stat(2)でサイズのみ取る。
デカいファイルで試してみ。
>>943 試してから書いてるんだが。。
1GBのファイルでも一瞬で wc -c は終了する。
(-cオプションを付けないと read(2)するから、そりゃ遅いが)
トレースしてもread(2)は呼び出していない。
945 :
937 :2008/08/06(水) 20:33:07
あああ。ごめんなさい。 head -n 10 しているのはテストのためで、
ここに書き込む時に外すのを忘れてました。
本当はもっとたっくさんのファイルサイズを合計したいです。
そんなときバッククオートの結果を引数にする (
>>940 ) のはちょっと不安が…。
しかしありがとうございます。やっぱりサブシェルの話だったんですね。
とりあえず、 ... done | tail -n1 として総和を得たいと思います。
>>941 さっきまで pg_dump | gzip | wc -c なんてやってました。
ディスクにファイルを書き込むプロセスがないのでいいですね。
find docs -name "*.jpg" -o -name "*.gif" -exec wc -c +
zshだとサブシェルにならずにsumがちゃんと更新されるぞ。
948 :
941 :2008/08/06(水) 20:46:03
>>942 >>944 うはw マジですかw 先入観だけでそう思ってますた・・・・・・orz 今後使います。
wc -c の話は GNU依存じゃないのか?
GNUツール使ってるからな
純正wcではどうなんだ?
それは純正なの?
汚ねえコードw
ウヒョー でも sendmail はもっと汚いし、procmail はさらに汚いし、 qmail は・・・・・・・・ ってスレ違いですみません。
設計すらまともにできないBINDはどうすんだよ、ごら
BINDすら作れないおまえらって・・
お前らまさかUNIXなんて使ってないよな? OSぐらい自分で書くよな普通
お前まさか出来合いのプロセッサなんて買ってないよな? アーキテクチャから設計して、自前の生産ラインくらい持ってるんだろうな?
おまいら、とりあえず採掘から始めろよw
次は天地創造か?W
神が居るスレか
採掘に使うクワも作れよ クワの材料が出てくるまでは手で掘れ
お前、その鍬の木はどうやって育てたんだ? まさか林からかっぱらってきたんじゃないだろうな?
ビックバンからやり直さないと。
ゆらぎの fork はどうしますか
なに、ビッグバンの起源は韓国だと言うからキムチでも突っ込んどけ。
最近は色々なシェルがあるらしいが、純正のshは韓国が起源だろ? これに関しては歴史上の記録があって、韓国の教授が論文を書いてる。
そろそろおわりでw
>>972 ゾンビの集うジョークスレへ投下してきたニダ。
whileとかforのインデントの仕方がいまいちわからないんだけど どういうのが標準ですか? vimのautoindentだとこんな感じになるけどしまらないです。 while true <TAB>do <TAB><TAB>emacs & <TAB>done
漏れはこうだな 条件式が一行の時 while うんたら; do うんたらかんたら done 条件式が複数行の時 while うんたら .かんたら do うんたらかんたら done
よくあるのは、 while true; do emacs & done
どーも
確かに do done を Cのwhileとかの{}と考えれば
>>976 >>977 のどっちかですね
autoindentがおかしいということで納得します!
viのautoindent直せないのかなぁ
vim スレに逝って聞いてみれば恐らく解決する。
981 :
BASH初心者 :2008/08/09(土) 09:30:29
コマンドの複数のオプションを何行に分けて書くときに、 途中にコメントを入れる方法ありますでしょうか? 是非、ご教授お願いしたいです。 以下のように書くと #!/bin/sh -f ls \ #!-r \ -t \ -a ーーーーーーーーーー 結果: line 5: -t: command not found CSHではできたので、BASHでのやり方が知りたいです。
>>981 ちょっと面倒になるけど、ヌルコマンド(:)をコマンド置換する方法がある。
` ` はバッククォート(シングルクォートではない)
コメントにしたい部分を `: と ` で囲む。:の直後、スペースを開ける必要がある。
#!/bin/sh -f
ls \
`: -r` \
-t \
-a
983 :
BASH初心者 :2008/08/09(土) 16:03:10
教えて頂き、有難う御座いました! 2ちゃんの書き込みは初めてです、そんなに早く教えて頂けるとは思いませんでした。 まだ宜しくお願い致します。
あー、丁度俺も訊きたかった質問だ。 しかしパッと見、コメントだとは分かりにくいねぇ。 ところで981は、なんでコメント行にも "!" を付けてるんだ?
cshがまだまだ現役で使われているのにも ちょっと納得してしまうな。。。
csh 使ってるけど, 大昔から,scripting しようとすると, とたんに % sh $ for f in ... となるんだがw
ヌルコマンドへの引数がシェルで解釈されとんでもないことが発生する可能性がある。 バッドノウハウどころか忌避すべき方法。
>>987 リダイレクトでファイルが作成されたりすることがなければ、
問題ないんじゃない? ` ` の中は暗黙のサブシェルになるから、
変数とかが書き替わるような解釈が行なわれたとしても、
親シェルには影響しないし。
>>986 スレチだけど、tcshでforeachをインタラクティブに使えないの?
ファイル中では使えるけど端末では何故か使えず挫折した記憶が。
つかえるよ. % foreach f (/usr/*) foreach? echo $f foreach? end /usr/X11R6 /usr/bin <snip> /usr/sbin /usr/share /usr/src %
foreach を1行で書きたいなあ
セミコロンで纏められず、改行で複数行にしないとダメなんだよなぁ、たしか。
>>988 はぁ、絶望的に想像力が欠如してるな。シェルが解釈してしまうから駄目だといってんだろ。
シングルクォートするか? (笑)
ls \
`: test -d /tmp&& rm /tmp/*` \
-t \
-a
>>993 おまえアフォか。
それだと、コメントアウト前の ls コマンドのコマンドラインになり得ないだろ。
>>993 元の質問は、(複数行の)1つのコマンドラインの途中で # でコメントアウトできない
ことに対して解決策を聞いている。
&& が含まれる場合、&&のところで(広い意味の)パイプラインが切れる。
パイプラインの切れ目があるなら、そこは # でコメントアウトできるし、
&& を跨いで `: ` で囲むというのは本来の質問の意図を外れている。
要するに
>>993 は、コマンド置換と空コマンド(:)でコメントにする方法は、
本当のコメントじゃないから注意が必要、ということだろう
例えばコメント文中にセミコロンを入れると、そこで : コマンドの範疇から
外れちゃうので、エラーあるいは副作用が起きてしまう。
>>996 もともとセミコロンが入ってたならそこでパイプラインの切れ目になるから、
あとは
>>995 の言うとおり。よって問題なし。
あと、`: ` じゃなくて、`# ` でもいいんだよ。
これだと文句ないかな?
おお、完璧!
次スレの季節
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。