Unix系は仕事でSolarisから入ったので、Linuxでもtcsh使ってますが何か?
お、何かいいID
7 :
login:Penguin :2008/05/21(水) 20:20:15 ID:5fFqv5kV
シェルでエロゲ作成したいんだけど意見聞かせてくださいな
ギガバイ子ちゃんでお願いします。期待しています。
ヒロインの一人に使ってあげてくれ _,,.. -ー 'ヘ-、、_ .!、、 !、_、,.ィ'" _ ,,.. _,゙ヽ, \`ー`= '´ _,..、 ヽ `、 ヽ ゝ、 /´ ` `ヽ ゙、 / ,/ ,、/ ,.イ ! ヽ、 ノ ー=ニ,..-、,ヾ;、' /,.' ! i| ! 、__ ,.Zャ ー- 7 , /,、ヾ;、,.ィ // ,イ! ,!ト | ,イ 、ヾ、_ / ,.' ,' ! ヾ;、'イ/ / / / |i |!,! / ヽ、 \、_ ,/イ / ,!,イ!/_ !|;/ //_,.ィー|' /,ィ、 、ー- '" _/,.イ/!|i !ニ。ミ /' ,ィ:;゚ソゞ |i }、-r-ー'ィ  ゙̄/',.ヽ,|!ヾ`ゞ'=' ` ´ /!'" ーヤ  ̄´フ! / ハ ,: ,イ ト、 ー_ユ-r''"`! /___ ,. \ ー_-;ァ /!-''"イ´ |;;! ,.|  ̄ /´ /イ!|/ ,ヘ、、 ,..イ;''´::;イ| ,.! '´イ! /ヘ! { !/:::!'ヾi| ` ゙/:::::/ | !.-,..=-'´!| ゙|! イ{゙ ト、 ヾ::::::::゙、 /::::::; ' ,r',.ヘヾ ゙!| ゙、 _,.-ゞト!、 ヽ ゙!:::::::ヽ/::::,イ| /イ-r'┴-、、 |;i ! / !__,,...|;i,.._ヽi!、 |::ヽ::イ!::/ ヾ!ィ'´ |;! ゙iヽ| ト'' ソ / r|'"`7/゙T`,>ヾ>;!ノ:r!::く ,イ´,.!|__,,.. -┴ー -、!|ヾ゙!_ノ ,イL/゙! // / //´>::|!:::|i::ネ{! i!,!'´ // ヾ,.|i| ,!,イ/ヾi! | L;. /イ/::::::|!::::|ir-、' /___//_ ノソi;|
10 :
login:Penguin :2008/05/23(金) 04:46:10 ID:RB3w3nsA
ちょっとスレの趣旨から離れてしまいますが、 たとえば Windows の WSH のように Javascript で 一般的なシェルスクリプトのようなものを実行できる インタープリタって、Linux にはないんでしょうか? 普段は bash 使っててそれで仕事上は全然問題ないんですが、 Windows ではバッチ処理を WSH + JScript で書いているので ふとなんで Linux にはそういうのがないんだろうか、って思って。
OpenJDK+Rhinoじゃダメかい?
自宅のLinuxマシンをsmbサーバにして、 画像、テキスト、動画など、すべてのファイルを保存・管理しています。 仕事で書いた原稿記事などについても、 いちいち GUI アプリで開かなくても、 ターミナルからでも中身を閲覧できるように、 必ず文字コードは UTF-8, 改行コードは LF で保存しています。 が、クライアント(主として MacOSX、たまに Windows)のターミナルから、 そうしたテキストファイルを less で見ると、当然のことながら、 見やすい場所での改行を一切しないで、 ターミナルの幅いっぱいにテキストを広げてくれます。 これを、何か適当なところ(例えば一行は50字など)で 改行を入れて表示させてやる方法ってあるでしょうか? クライアントは主として MacOSX 10.4.11 で、 使っている仮想端末は、OSX 標準の /Applications/Terminal.app です。 たまぁに WindowsXP や Windows2000 などからもアクセスし、 その場合には poderosa.exe を使っています。 サーバマシンは CentOS4.6 です。 ls になんらかのオプションを与えて整形するのか、 それともなんらかのシェルスクリプトを組んでやる必要があるのか、 基本的なところからわかりません。 どなたかアドバイスいただけませんでしょうか? よろしくお願いいたします。
lvってCentOS製だったの?
>>13 どうもありがとうございました。
CentOS 用のパッケージは見つからなかったんですが、
ソースが見つかったので、checkinstall で rpm を作り、
インストールしたらすぐに希望通りのことができました。
Mac OSXはUnix系と聞いたが、改行コードが違うのか。
17 :
login:Penguin :2008/05/24(土) 09:20:38 ID:yYzGER+2
まだ\rなのか
ええと、標準だと今でも CR+LF ではないかと思いますが、よく知りません。
21 :
login:Penguin :2008/05/24(土) 16:52:04 ID:yYzGER+2
* LF: UNIX系のシステム。Linux、AIX、Xenix、Mac OS X、BeOS、Amiga、RISC OSなど。 * CR+LF: CP/M、MP/M、DOS、OS/2、Microsoft Windows。 * CR: コモドールによるシステム、Apple IIファミリ、Mac OS(バージョン9まで)、OS-9。
>>20-21 あ、OSの改行コードの違いにより改行されないことが
>>12 の相談かと思ったよ。
そもそも改行していない文章を fmt したいということか。
MACはCRとずっと思ってたのにLFなのかぁ
24 :
login:Penguin :2008/05/28(水) 15:18:10 ID:HsWDzpDn
子プロセスとして起動されたのか, . で読み込まれたのか, スクリプトの中から判断することはできますか?
25 :
login:Penguin :2008/05/28(水) 15:23:33 ID:HsWDzpDn
それぞれ set の結果を diff してみた. #子プロセスとして起動した ./test.sh < BASH_ARGC=() < BASH_ARGV=() < BASH_LINENO=([0]="0") < BASH_SOURCE=([0]="./test.sh") --- #. で読み込んでみた . test.sh > BASH_ARGC=([0]="1") > BASH_ARGV=([0]="test.sh") > BASH_COMPLETION=/etc/bash_completion > BASH_COMPLETION_DIR=/etc/bash_completion.d > BASH_LINENO=([0]="39") > BASH_SOURCE=([0]="test.sh") ふぅん.BASH_SOURCE じゃ判定できそうにないな. BASH_ARGC が 0 じゃないことでチェックするのかな?
26 :
login:Penguin :2008/05/28(水) 15:31:38 ID:HsWDzpDn
-------すくりぷと test.sh #!/bin/sh set -------ここまで chmod +x test.sh ./test.sh ./test.sh a b c . test.sh . test.sh a b c 4つともやってみたけど,結局何で判定すりゃいいのかわからない. 死ね俺.
27 :
login:Penguin :2008/05/28(水) 15:36:50 ID:HsWDzpDn
${BASH_LINENO[0]} で判定するのがよさげなんだけど, そもそも sh にはそんな機能ないの? bash 限定はちょっとやだなぁ.
28 :
login:Penguin :2008/05/28(水) 15:42:12 ID:HsWDzpDn
単純に $0 で判定するのがいいのか?
lessの代わりにleafpadを使えば
30 :
login:Penguin :2008/05/28(水) 17:51:58 ID:4Ch8TEZp
sh または bash で配列の結合ってできますか?
神様助けてください 関数に配列を渡す方法がわかりません a=( あ い う え お ) fnc(){ echo ${1[0]} } fnc a これで”あ”が出ると思ったんですがでません 教えてください お願いします
32 :
31 :2008/05/28(水) 20:20:45 ID:xwe44XYV
シェルスクリプトにはスクリプト内でスコープが無いことを知り a=( あ い う え お ) fnc(){ echo $a[0] } fnc で”あ”が表示できるようになりました
ループ文で外部ファイルから読み込んだコマンドを実行しようとしたときに パイプ処理ができずに困ってます。(下記の場合、ls -lの結果しかでません) サブシェルの方に行ってしまっているのかな?と思っているのですが、どう処理したらよいのでしょうか? FILE=test.txt while read LINE do $LINE done < $FILE ■test.txtの内容(例) ls -l | grep abc
>30 c=(${a[*]} ${b[*]}) >33 FILE=test.txt while read LINE do eval $LINE done < $FILE
35 :
33 :2008/05/29(木) 00:17:22 ID:iY0MCSHA
>>34 ありがとう!できました!便利なもんがあるんですね。
助かりました〜。
36 :
login:Penguin :2008/05/30(金) 19:21:49 ID:p9jie4Lm
echo $a[0] これってちゃんと出力できるの? ${a[0]} ってしないとエラーにならね?
% a[0]='abcef' % echo $a[0] abcef % echo ${a[0]} abcef % echo $SHELL /bin/zsh
38 :
login:Penguin :2008/05/31(土) 06:16:56 ID:g+xuahlh
#!/bin/sh a[0]='abcef' echo $a[0] a[0]='abcef' echo ${a[0]} -------------------- [siomizu@cluster ~]$ ./test.sh abcef[0] abcef
uniqはUTFには対応していないでしょうか? たとえば、以下2行がある場合にuniqすると承のみになってしまいます。 承 <- 0xE689BF 良 <- 0xE889Af 環境はdebianのcoreutils 6.10-6、改行コードはLFを使用しています。 よろしくお願いします。
再現できるスクリプトを書いてください
41 :
39 :2008/05/31(土) 16:33:59 ID:qUj8kkoX
>>40 私でしょうか?
単に以下の2行を書いたファイルを用意してuniqです。
承
良
あ、「<-」以降は単にUTF8でこんなバイナリになるというのを示しただけです。
失礼しました。
私の環境では再現できませんので。 $ printf "\xe6\x89\xbf\n\xe8\x89\xaf\n" | uniq 承 良
43 :
39 :2008/05/31(土) 16:46:52 ID:qUj8kkoX
>>42 そうですか・・・
うちでは
% printf "\xe6\x89\xbf\n\xe8\x89\xaf\n" | uniq | hexdump -C
00000000 e6 89 bf 0a e8 89 af 0a |........|
00000008
でした。参考までにディストリとLC_ALL何にしているか教えていただけませんか?
44 :
39 :2008/05/31(土) 17:01:51 ID:qUj8kkoX
すいません 43でできてるじゃないかorz LC_ALLをUTFにした状態だとうまくいきました。 uniqはロケール見るのか・・・ ありがとうございました
オライリの入門bash難しいよ・・・ これホントに入門なの・・・?
オライリーは全般的に中級者が読む本だ
47 :
login:Penguin :2008/06/02(月) 18:36:56 ID:GT1ocSub
すみません。くだ質から誘導されてきました。よろしくお願いします。 bangou.txtには ▲ 123123 123123 100000 ▲ ▲ というように数値が入っています。(▲は空白ですが改行コードがはいってます) この場合、1行目と3行目を比較して3行目に数値が入っている場合のみ2行目の値を別表に表示する スクリプトを作りたいと思って色々調べて以下のようなスクリプトを作ってみましたけど うまく動きません。(空白は空白として認識してくれないと行がずれるのでそれも認識したいです) #!/bin/bash for iii in `cat bangou.txt` do jjj=`sed -n '2p' bangou.txt` export jjj kkk=`sed -n '3p' bangou.txt` export kkk if [ "$iii" = -n ] then echo "$kkk>/dev/null else echo "$jjj > jjj.txt paste jjj.txt toku.txt >> toku2.txt rm -rf jjj.txt fi done どこか間違ってるんでしょうか?よろしくお願いします。
>>47 やりたいことがよくわからん。
toku.txt の内容と、
実行後に toku2.txt がどういう内容になってればいいのかを書いてくれ。
49 :
login:Penguin :2008/06/02(月) 19:28:58 ID:GT1ocSub
>>48 さん
返信ありがとうございます。
toku.txtは住所録です。
それをとりあえず一旦、toku2.txtにbangou.txtと組み合わせたものを
書き出しているだけなのでtoku2.txtには特に何も入っていません。
toku.txtは
▲
東京都
東京都
東京都
東京都
東京都
▲
愛知県
みたいな感じです。(▲は空白です)
これをそのままpasteでbangou.txtと結合すると
▲▲
123123 東京都
123123 東京都
100000 東京都
▲ 東京都
▲ 東京都
となってしまうのでこれを
▲▲
123123 東京都
123123 東京都
100000 東京都
100000 東京都
100000 東京都
というようにしたいんです。空白の行に一番最後の
番号を割り当てたいんです。わかりにくくてすみません。宜しくお願いします。
50 :
login:Penguin :2008/06/02(月) 19:35:12 ID:GT1ocSub
ごめんなさい。「▲は空白」と書きましたけど実際は改行コードが入っているだけです。 すみません。ごめんなさい。
いまいちよくわからんな。
>>47 の
> この場合、1行目と3行目を比較して3行目に数値が入っている場合のみ2行目の値を別表に表示する
っていう話もどうなったのやら。
シェルスクリプトでがんばるより perl あたりで書いちゃった方が早そう。
52 :
login:Penguin :2008/06/02(月) 19:54:09 ID:GT1ocSub
>>47 の書き方が悪かったかもしれないです。ごめんなさい。
実際には
>>49 のような処理をしたいんです。
perlでもいいです。一旦処理できればいいんで。お願いします。
pasteコマンドで結合して処理すればいいんじゃないの?
54 :
login:Penguin :2008/06/02(月) 20:07:59 ID:GT1ocSub
>>53 さん
ご指導ありがとうございます。pasteで結合しただけだと
bangou.txtで空白の部分があるので
>>49 のように
▲▲
123123 東京都
123123 東京都
100000 東京都
▲ 東京都
▲ 東京都
となってしまうので困ってます。
これを
123123 東京都
123123 東京都
100000 東京都
100000 東京都←空白が上の行と同じ番号
100000 東京都←空白が上の行と同じ番号
という風にしたいんです。お願いします。
100000 でいいならsedで置換するだけじゃん。
56 :
login:Penguin :2008/06/02(月) 20:11:48 ID:GT1ocSub
>>55 さん
お返事ありがとうございます。
数値は「10000」ではないんです。
上にある行の数値が欲しいんです。
わかりにくい説明ですみません。
宜しくお願いします。
paste bangou.txt toku.txt | awk '{printf( "%s %s\n", (NF>1)? $1: onaji, $NF ); onaji=$1}' とかかな? でも、番号の1行目が空白のときはどうするのだろう。
58 :
login:Penguin :2008/06/03(火) 00:37:37 ID:xzQHL5F2
>>57 さん
ありがとうございます!
明日早速試してみます。ありがとうございます。
あのスレ住人(特にdebユーザ)に、お願いなんだが、テンブレにあるし絶対ダメだとかいわんけど 書き込むとき、せめてシェルスクリプトと他のperlなんかのスクリプト言語は 意識して区別してくれまいか?ここ、「シェルスクリプトスレ」だから。 (上で「特にdebユーザ」と言ったのは、批判じゃなくて、前スレで発覚したんだが debはディストリレベルでコマンドとperlスクリプトなんかが混在になってるらしく ユーザ自身が区別しない慣習のようだから。でも、それって一般的じゃないし混乱のもとだよね?) sedでもawkでもperlでもいいけど(ここら辺までは普通にシェルで使うだろけど、 perlで複雑なことやりこんだり)なんでもありありなら、わたしゃpythonやzenityや 織り込んでGUIやgtkベースの話はじめちゃうぞw
「テンブレ」? 「ディストリレベルで混在」? どういう意味?
>>60 テンプレつーのは、つーか、>1に
>perlやらPythonやらの話が混ざっても良いんでない?
とあるし、>2-4にスクリプト言語のリンクも張ってある。
混在つーのは、具体例では、debではrenameコマンドがperlスクリプトprenameに置き換えてあるし
どうやらシェル上のパスの通し方なんぞが、perlなどを使いやすいように拡張されてるようだ。
ま、debユーザじゃないので詳しいところまではわからないけどね。
一応断っておくけどdeb批判じゃないよ。
「テンプレ」を「テンブレ」と書いていたことには気付いているのだろうか。
>>61 > 混在つーのは、具体例では、debではrenameコマンドがperlスクリプトprenameに置き換えてあるし
これは特殊かつ些細な例でしょ。
他に何かある?
> どうやらシェル上のパスの通し方なんぞが、perlなどを使いやすいように拡張されてるようだ。
そんな事実はないよ。
うわぁ、やっぱりdeb信者は・・・ごめんなさいね。趣旨だけ理解してちょ。
これだけで信者扱いする君もそうとうなものだと思うぞ。
はいはい、ごめんなさい、ごめんなさい。あんたが大将。
信者って決めつけられてもな。 Debian も使ってるし他のディストリも使ってるし。 よく知りもしないのにいいかげんなこと言うな、ってだけ。
ちんこ
Debianではっつうか、そいつの問題だろう。 シェルスクリプトかperlスクリプトか見てわからないような奴は他の鳥使ったってわかるようにならない。
>>59 > debはディストリレベルでコマンドとperlスクリプトなんかが混在になってる
デブな人だけどなんのこっちゃ?
まさかPerlスクリプトなら*.plになるとか言ってるわけじゃないよな?
というか、俺も言ってる意味が分からない とくにディストリレベルっていう言葉 ディストリレベルってのはどのレベル?
#/bin/sh
perl -e printf( "hello world\n" );
だと、
>>59 基準でOKか否かが分かんない。
例えばls って打つと ls.pl が起動されるって事だと読み取った。 Debian系は使っていないので真実は知らない。
#!/bin/sh perl sh.pl ruby sh.rb php sh.php system("hoge.sh",$ret); exec("hoge.sh",$ret); exec("sed 's/B/A/g' $current > $tmp",$ret); exec("rm $current",$ret); system("mv $tmp $current",$ret); もう人生バラ色です
俺の人生はルビー色
質問です。 $ ls "a" file1 file2 $ echo ls \"a\" ls "a" $ `echo ls \"a\"` ls: cannot access "p": No such file or directory 三つめでエラーになるのはなんででしょう? こういう時はどう書くのが正しいのですか?
$ ls "a" ls: a: No such file or directory $ echo ls \"a\" ls "a" $ `echo ls \"a\"` ls: "a": No such file or directory $
eval `echo ls \"a\"`
80 :
77 :2008/06/03(火) 23:55:16 ID:J2hvNDuq
bashの/dev/nullについて質問します。 lsの表示結果でエラー出力だけは表示させずに 標準出力のみtest.txtファイルに出力したいのですが 自分の理解では以下に書いた2になりますが、表示結果 では1でないと通りません。どのようにイメージしたら宜しいのでしょうか? 1: ls /home/ > /dev/null 2>&1 > test.txt 2: ls /home/ > test.txt > /dev/null 2>&1
>>81 「bash のリダイレクトについて」だろ。
/dev/null は bash の問題ではない。
ls /home/ >/dev/null 2>test.txt
で OK。
>>82 すいません、リダイレクトについてでした。回答有難うございます。
ls /home/ >/dev/null 2>test.txtについての流れで確認を
して頂きたいのですが宜しくお願い致します。
上記の標準出力1の状態について、lsの結果が/dev/nullに行く。
(ここでデータは破棄されてしまうという考えなのですが)
そして、エラー出力2はtest.txtになってますよね?
1の状態 /dev/null
2の状態 test.txt
>>81 > 1: ls /home/ > /dev/null 2>&1 > test.txt
1) /dev/null を標準出力の出力先に指定
2) 標準出力の出力先をエラー出力の出力先に指定
3) test.txt を標準出力の出力先に指定
結果
標準出力: test.txt
エラー出力: /dev/null
> 2: ls /home/ > test.txt > /dev/null 2>&1
1) test.txt を標準出力の出力先に指定
2) /dev/null を標準出力の出力先に指定
3) 標準出力の出力先をエラー出力の出力先に指定
結果
標準出力: /dev/null
エラー出力: /dev/null
>>84 リダイレクトは出力先を決めるだけなのですか。
解説して頂いた通りで色々パターンを考えてみましたら
出来るようになりました、有難うございます
>>85 一応処理結果では正常な雰囲気なのですが、
>>81 ですと
理解しずらいので、変えようか考えています。
レス遅れましたが皆さんありがとうございました
与えられたパスを絶対パスに正規化したいのですがどうすればよいですか? 単に相対->絶対の変換をするだけじゃなくて .とか..も適切に変換してくれるとうれしいのですが。
realpathだっけ?
ここはLinux板だからreadlink -fでどうか
スレ違いのような気もしますが・・・ lsの出力が端末だとスペース区切りなのにパイプやリダイレクトすると改行になるのはどういう仕組みですか?
isatty(3)
94 :
92 :2008/06/07(土) 17:13:39 ID:lYfLA/cT
なるほど、lsのほうで端末かどうかみてるんですね… 納得しました。どうもありがとうございます。
スレ違いだと思うならくだ質に行きなさい。
シェルスクリプト中で、リダイレクトでファイルを生成するとファイル名が文字化けしてしまうのですが 一体何が悪いんでしょうか。 ↓みたいなことになります。 $ echo $LANG ja_JP.UTF-8 $ cat test.sh echo a > "$1" $ echo hoge > "あいうえお.hoge" ; ls test.sh あいうえお.hoge $ sh test.sh "あいうえお.hoga” ; ls ??????????.hoga test.sh あいうえお.hoge touchとかなら文字化けしないようなのですが。
97 :
96 :2008/06/08(日) 14:54:23 ID:w3H8z2Sk
補足です。 $ ls | hexdump -C 00000000 e3 82 e3 84 e3 86 e3 88 e3 8a 2e 68 6f 67 61 0a |...........hoga.| 00000010 74 65 73 74 2e 73 68 0a e3 81 82 e3 81 84 e3 81 |test.sh.........| 00000020 86 e3 81 88 e3 81 8a 2e 68 6f 67 65 0a |........hoge.| 0000002d
ls --show-control-chars
注文スクリプトを作りました、ってこと?
日本でもオンライン注文のピザ屋があれば出来そうね。 映画ジュラシックパークの中でプログラマーがデブでピザ食べていたけど、 この動画もその皮肉?
>>101 hacker の食べ物といえば
ピザと Jolt Cola と相場が決まっておる。
105 :
login:Penguin :2008/06/10(火) 13:27:23 ID:Gys5ZtGT
2037→1048→2481207→↓ 2037→1048→2481207→↓ 20311→1056→2481211→↓ 20320→1114→2481218→↓ 20320→1114→2481218→↓ 20326→1155→2481211→↓ 20326→1155→2481211→↓ → →2481211→ → →2481211→↓ tomo.txtの中身はこうなっています。(→はタブ、↓は改行コードです) これで2列目に何も文字列が入っていない場合は3列目も何も文字列を 入れないようにしたいです。(上のtxtの場合だと下の2行が対象になります) sedとcutでなんとかなるかと思ったんですけどなかなかうまくいきません。 誰かいいスクリプトを教えて下さい。宜しくお願いします。
これでどう? awk '{if (length($2) != 0) print;}' tomo.txt
107 :
105 :2008/06/10(火) 15:27:43 ID:Gys5ZtGT
早速のレスありがとうございます。でもうまく動かないです。。。 試しにlengthの値を変えてみたりしたんですが何も変化がないです。。
>107 もっと具体的に目的を書かないとどういう結果が欲しいのか解らんよ。 >105の下から2行目は改行が入ってないの? それとなにも列に入っていないと言いつつ全角スペースが入っているのは何故? まあ、やりたいことを推測して例を出せばこんな感じか? cat tomo.txt | while read LINE;do set -- $LINE; if [ $# = 3 ]; then echo "$LINE"; fi; done
109 :
105 :2008/06/10(火) 19:02:47 ID:CM93IypP
>>108 さん
ご回答ありがとうございます。
すみません。
>105の下から2行目は改行が入ってないの?
入ってます。
>それとなにも列に入っていないと言いつつ全角スペースが入っているのは何故?
実際には入っていません。
ですから正確にはtomo.txtはこうなってます。
2037→1048→2481207→↓
2037→1048→2481207→↓
20311→1056→2481211→↓
20320→1114→2481218→↓
20320→1114→2481218→↓
20326→1155→2481211→↓
20326→1155→2481211→↓
→→2481211→↓
→→2481211→↓
110 :
105 :2008/06/10(火) 19:05:04 ID:CM93IypP
それを以下の下2行の2列目に文字列がない場合は 削除したいので以下のような結果を出して欲しいんです。 2037→1048→2481207→↓ 2037→1048→2481207→↓ 20311→1056→2481211→↓ 20320→1114→2481218→↓ 20320→1114→2481218→↓ 20326→1155→2481211→↓ 20326→1155→2481211→↓ →→→↓ →→→↓ 何度もすみません。よろしくお願いします。
111 :
105 :2008/06/10(火) 19:19:42 ID:CM93IypP
cat tomo.txt | while read LINE;do set -- $LINE; if [ $# = 3 ]; then echo "$LINE"; fi; done を試してみましたけどやはり何も変化はありませんでした。 すみません。お願いします。
よくわからんけど、タブが2回続いたらタブ3個だけの行に置き換えるとかじゃだめなの? やり方は知りません
これはどうだ? awk -F '¥t' '{if ($2 == "") { $3 = ""}; print}' < tomo.txt awkのデフォの列識別はタブじゃないから-Fで指定してね。
114 :
105 :2008/06/11(水) 03:27:04 ID:bnnOzDXT
>>113 ありがとうございます。今日はこんな時間なので明日試してみます。
'\t'の部分がうまく識別してくれたらいけそうな感じがします。
115 :
105 :2008/06/11(水) 05:10:34 ID:bnnOzDXT
おはようございます。 今試してみたらうまく動きました。ありがとうございました。
117 :
105 :2008/06/11(水) 08:14:21 ID:sVHDZWwZ
あっーーー!よくみたら 2037→1048→2481207→↓ 2037→1048→2481207→↓ 20311→1056→2481211→↓ 20320→1114→2481218→↓ 20320→1114→2481218→↓ 20326→1155→2481211→↓ 20326→1155→2481211→↓ ↓ ↓ って感じで最後の2行のタブが全部消えてました。。。 これは消えると困るんです。再度お願いします。。。
難問が…
>112でいけるだろ sed -e 's/\t\t[^\t][^\t]*/\t\t/' tomo.txt \tが使えなかったらタブで置きかえる。
>>117 あり? $2 = ""をしない行はちゃんとタブで分けたまま出力してるのに
置き換えをした行はスペースが出力区切り文字になっちゃうな。
じゃ、無理矢理修正
awk -F '¥t' -v OFS='¥t' '{if ($2 == "") { $3 = ""}; print}' < tomo.txt
OFS はoutput field separator
121 :
105 :2008/06/11(水) 11:52:44 ID:sVHDZWwZ
ありがとうございます! 今度こそ大丈夫です!本当にありがとうございます!
Open Foundation Software じゃないのか。
>>122 OSFですがw Open Software Foundation
誰かピザハット対応ピザ注文コマンド作ってくれないものか。
126 :
login:Penguin :2008/06/12(木) 12:44:22 ID:Y4yiWWC/
#xxx.txtの1行目を変数iに代入します for i in `cat xxx.txt` do #xxx.txtの2行目を$jに入れます j=`sed -n '2p' export j #変数eeeにxxx.txtの2行目から15行目を代入します eee=`sed -n '2-15p' export eee #pasteで結合できるように変数をtxtファイルに入れます echo $i > i.txt echo \t > ccc.txt echo $eee > eee.txt if #xxx.txtの行の先頭が20から始まる場合 then test $j = "^20" #結合します paste i.txt ccc.txt eee.txt else #何もしない fi done 初心者です。こんなスクリプトを作ったんですけどうまく動きません。 修正していただけるとありがたいです。お願いします。
127 :
126 :2008/06/12(木) 12:55:44 ID:Y4yiWWC/
#xxx.txtの1行目を変数iに代入します for i in `cat xxx.txt` do #xxx.txtの2列目を$jに入れます j=`sed -n '2p' export j #pasteで結合できるように変数をtxtファイルに入れます echo $i > i.txt echo \t > ccc.txt if #xxx.txtの行の先頭が20から始まる場合 then test $j = "^20" #結合します paste i.txt ccc.txt eee.txt else #何もしない fi done 間違えました。eee.txtは別途作りますので上記のような感じです。
128 :
login:Penguin :2008/06/12(木) 14:03:25 ID:Y4yiWWC/
意味不明ですみません。会社から回りの人の目を盗みながら こそこそと2ちゃんねるやってるんで・・・ これでお願いします。 #変数aaaにxxx.txtの1行目を代入します for aaa in `cat xxx.txt` do #変数bbbにxxx.txtの2行目を代入します bbb=`sed -n '2p' export=bbb #変数cccに$iの1列目を代入します ccc=`cat $i | cut -f1` export=ccc #変数dddに$iの2から14列目を代入します ddd=`cat $i | cut -f2-14` exprot=ddd if #xxx.txtの2行目の先頭行が20の場合は切り出したファイルを結合します then test $aaa = "^20" paste ccc.txt tab.txt ddd.txt elsei #それ以外の場合はその列をそのままファイルに書き出します echo aaa.txt fi done
>>126 日本語でおk
人に説明するためにやりたいことを整理すると自然に解決したりするものよ。
最初に for を持ち出したところからすでに意図がわからん。
perlでやればいいと思うよ
132 :
126 :2008/06/12(木) 19:28:24 ID:TxRWHMwb
>>129 ありがとうございます。でもなかなかうまくいかないんです。
>>130 すみません。for文の処理がうまくいかないんで抜粋しました。
>>131 perlは全然わかんないんでなんとかシェルでやりたいです。
任意の時間を入力し、それをUTC時間に変換することは可能でしょうか? dateコマンドだとカレントタイムを変換してしまうので。。
date -u じゃダメなのかな
それに -d オプションを付けたいんじゃないのかな。 $ date -u -d '2001/5/20 13:33:35 JST'
>>133 awkにあるmktime, strftime関数を使うのが一番手軽かな。
137 :
133 :2008/06/12(木) 23:39:42 ID:mOwz8//t
>>126 は解決したのだろうか。
俺には意図が解らなかったが。
139 :
126 :2008/06/13(金) 09:47:03 ID:j8pwVaea
>>138 心配していただきありがとうございます。まだ未解決です。
簡単にいうと
aaa.txtが
[100]
201
202
203
[200]
301
302
303
となっている場合に
[100] 201
[100] 202
[100] 203
[200] 301
[200] 302
[200] 303
としたいんです。(スペースのところはタブ区切りを入れたいです)
お願いします。
#!/usr/bin/perl my $i = ''; while (<>) { chomp; if ($_ eq '') { $i = ''; print "\n"; } elsif ($i eq '') { $i = $_; } else { print "$i\t$_\n"; } }
141 :
126 :2008/06/13(金) 10:25:54 ID:j8pwVaea
>>140 それを今試してみたら
[100]
[100] 201
[100] 202
[100] 203
[100]
[100] 301
[100] 302
[100] 303
みたいになっちゃいました。
せっかくコードを書いていただいたのですがちょっと
結果が違いました。すみません。
> 126 awk 'BEGIN {OFS = "\t";}; $0 != "" {if ($0 ~ /^\[/) section = $1; else print section, $1}' aaa.txt 多分もっと格好よくできるはずなんだけどなぁ
>>139 gawk '{if(match($0,/^\[[0-9][0-9]*\]$/))t=$0;else{if(length)$0=t "\t" $0;print;}}' aaa.txt
sed -e '/^\[[0-9][0-9]*\]$/{h;d}/^..*/{x;G;s/\n/\t/;p;s/\t.*//;h;d}' aaa.txt
まだ短くならないかな。
>>126 > #変数eeeにxxx.txtの2行目から15行目を代入します
> #xxx.txtの行の先頭が20から始まる場合
最初と言ってることぜんぜん違うじゃねーか。
146 :
126 :2008/06/13(金) 11:04:27 ID:j8pwVaea
>>142 おおおっ。すごいです。ありがとうございます。
で、あまりにも簡単に説明しすぎたせいで少し動作が違いました。
実際にはaaa.txtは複数の列でできています。
[100]
201 100 200
202 100 200
203 100 200
""
[200]
301 100 300
302 100 300
303 100 300
""
あと先頭が数字では始まらないけど文字列が入っている場合もあります。
その列は何も処理をしたくないんです。もちろん空白の列にも何も処理をしたくないです。
説明が不足していてすみません。お願いします。
どんどん条件変わるな。 もう付き合いきれん。
>>126 #!/usr/bin/awk
BEGIN {
OFS = "\t"
}
{
if ($1 ~ /^\[.+\]$/) {
section = $1
} else if ($1 ~ /^[0-9]/ ) {
sub(FS, OFS) # これがいるかどうか分からない
print section, $0
} else {
print
}
}
まぁ暇だし,自分の勉強にもなるしな
150 :
126 :2008/06/13(金) 12:12:09 ID:j8pwVaea
>>147 ごめんなさいごめんなさい。許して下さい。
>>148 ありがとうございます。今から試してみます。感謝してます。
151 :
126 :2008/06/13(金) 12:24:52 ID:j8pwVaea
>>149 ^ syntac error
^ 正規表現が終端がされていません
って出ます。
そのコードを2.awkとして保存してchmod 755 で
./2.awk < aaa.txt > bbb.txt
としたんですけど僕のやりかたが悪かったんでしょうか。
もうちょっと試してみます。すみません。
シェルとかプログラミング言語よりも,ちゃんと説明できる日本語を習得するのが先だとしみじみ思う.
153 :
126 :2008/06/13(金) 13:45:24 ID:j8pwVaea
awk -f ./2.awk < aaa.txt > bbb.txt で実行できました。すみません。 でも結果としては数字のところにタブが挿入されただけでうまくいきませんでした。 また時間がある時にで結構ですので教えてくださると助かります。よろしくお願いします。
154 :
126 :2008/06/13(金) 14:31:16 ID:j8pwVaea
あれれ。すみません。aaa.txtを作って試してみたらうまく動作してました。 元データのほうに何か問題があるようです。確認してみます。
155 :
126 :2008/06/13(金) 14:57:25 ID:j8pwVaea
>>149 ありがとうございます。感謝感謝です。
if ($1 ~ /^\[.+\]$/) {
を
if ($1 ~ /^\[.+\]*$/) {
にして無事動作しました。[]の後ろに文字列が入っているのが原因でした。
本当にありがとうございます。
#!/bin/sh n=`cat text.txt` で読み込んだ$nに対して 一行ずつ処理を行いたいのですがどうしたらよいでしょうか for a in $n を使おうと思ったのですが、スペースでも分割されてしまい 理想の動作をさせることができません よろしくお願いします
cat text.txt | while read line; do echo "$line"; done while read line; do echo "$line"; done < text.txt ダブルクオート
done < text.txt はbash依存だったような
>>157 できましたありがとうございます!
whileの中でreadを再び使えば同時に何行まとめて、という処理が出来るんですね
>>158 Linux板的にはいいんでないの。 Unix板だったら気にしたほうがいいかもしれんが。
dashもOKだから、まぁいいのか
そのあたりってPOSIXでちゃんと規定されてるものなの? 単にbashをまねて取り込んだshなのか、真のshからサポートする機能か どうしたら見分けつけられるのかよくわからない。
bash や dash があるなら、cash もあるのかな。 Csh-Again SHell とか。
>>165 生まれ変わらなくていい。そのまま墓場で寝ててくれ>*csh
>>164 トン。$(command)とか$((expr))って標準だったんだとか色々勉強になるな。
bashで文字列の最後尾が / にあたるものをヒットさせたいのですが、どのようにしたら宜しいでしょうか?
bashにそんな機能はない
bash()笑
grepで$を使うって話?
エスケプすればなんとでも。
>>168 case "$str" in
*/)
echo "match."
;;
*)
echo "unmatch."
;;
esac
>>168 です。仕事が入ってしまいレス遅れました、すいません。
bashにそのような機能はありませんか・・・。
grepでは無く条件式で文字列の末尾を判定させたかったのですが
何も知らない自分としては
>>173 さんの書いて頂いたのを参考に
しようかと思います。助かりました、有難うございます。
176 :
login:Penguin :2008/06/16(月) 11:27:24 ID:1Ms3xCVR
#!/bin/csh -f set s=$1 set t=$2 set f=$3 cat $f | tail +$s | head -$t exit 0 echo ------------------ 以上を改良しろ、と言われました。みなさんならどうしますか?どなたか教えて下さい。
>>176 *csh を使うのをやめる。まずそれからだ。
>>176 速度面で改善ならアセンブリで書き直してやれ
181 :
login:Penguin :2008/06/17(火) 07:40:56 ID:AmqP2Db0
abc bcd cde <abc> hoge hoge (スペースはタブです) となっている場合、<abc>の列を削除したい場合 sed 's/\t//g' | sed "s/<abc>*//g" > hoge だとうまくいかないんですけどどこかおかしいんでしょうか。 ご指摘お願いします。
>>181 sed 's/^<abc>.*//'
* は「前のものの0回以上の繰り返し」。
シェルの glob と違って「任意の文字列」ではない。
183 :
login:Penguin :2008/06/17(火) 08:57:44 ID:AmqP2Db0
184 :
login:Penguin :2008/06/17(火) 10:01:29 ID:AmqP2Db0
先程はありがとうございました。今度はまた問題が出ました。 aaa bbb ccc ddd eee となっているファイルに例えばcccの行にだけ行頭にタブを二ついれたいんですけど どうすればいいでしょうか。検索してみたんですけどそんなことをする例がないので わからないです。お願いします。
>>184 sed 's/^ccc$/\t\tccc/'
186 :
login:Penguin :2008/06/17(火) 11:07:44 ID:AmqP2Db0
>>185 ありがとうございます。
でも僕の例の出しかたが悪かったです。正確には英語じゃなくて日本語なんです。
あああ
いいい
ううう
えええ
おおお
となってて「ううう」の先頭行に処理をしたいんです。
本当にすみません。
同じ人が、ここ10日ぐらい似たような質問を繰り返しているような気がしてならない。
>>187 わわわ
たたた
ししし
ももも
そそそ
ううう
おおお
ももも
いいい
ままま
すすす
>>186 $ cat aiueo.txt
あああ
いいい
ううう
えええ
おおお
$ sed 's/^ううう/\t\tううう/' aiueo
あああ
いいい
ううう
えええ
おおお
>>185 の例と全く同じにできるんだが、お前は試しもせずに文句ばっかりたれとんのか。
いい加減にしろデコスケ!
Debian etch使ってるんだが初期設定のスクリプトって作れたりする? 例えば・・ /etc/apt/sources.list OS全体のフォント設定 必要なツールなどインスコ などなど・・ 複数台にインスコするのはいいけど初期設定がマンドイ・・
>>191 一番簡単なのはapache走っているサーバーにディレクトリ作り、そこの設定ファイルのテンプレとかを
置いておく。 そして新しいシステムの基本インスコをしてネットに繋がったら:
wget
http://hoge/~me/install-etch ./install-etch
で、そのスクリプトの中でapt-getしたり設定ファイルを書き換えたり、必要なファイルをwgetで持って来て
置き直したりとかごちゃごちゃ書いておく。
RH系だったらkickstartがお薦め。 sargeでdebianのカスタムインストーラー作りも一時したけど
えらくめんどくさかった。 最近はもっと優しくなったのかな?
>>192 おう
>>193 ようはコマンドラインを書けばいいわけだよね。とりあえずこれやってみる。
Kickstartをググってみたら簡単そうだけどローカル鯖必要そうだね。
どうもでした。
すいません エスケープの使い方で質問させて下さい。 下みたいなスクリプトで #!/bin/sh A=tama B=mike for i in $A $B do tmp=`eval perl -e \'\$\a \= \"$i\"\; if \( \$\a \=\~ \/\^\\\S\+\(\\\S\{1\}\)\$\/ \) \{ print \"s\$\{ 1 \}x_player\" \}\'` echo "$tmp" done exit 0 一応こうすれば動くのですが、 perlの行のところにあるエスケープを減らしてすっきりさせたいのです。 良い方法を教えて下さい。
196 :
login:Penguin :2008/06/19(木) 01:45:49 ID:syeq8gZ9
>>195 perl スクリプトを別ファイルに追い出す。
シェルに評価されてはいけない部分をシングルクォートする。 i=tama perl -e 'printf( "%s: nya-\n", '"$i"' )'
shの質問です スクリプトがCtrl+Cなどで終了させられた時に特定の動作を持たせたいのですが どのようにすれば実装できるでしょうか?
>>196 なるべく一つのファイルにまとめたいんで。。。アドバイスありがとうございます。
>>197 197さんのアドバイスを参考にして、perlの行を下のように書くと動きました。
tmp=`perl -e '$a = "'"$i"'"; if ( $a=~ /^\S+(\S{1})$/ ) { print "s${ 1 }x_player" }'`
しかし、こう書くと$aの前のシングルクォーテーションがバッククォーテーションで
perlを実行した時に消えると思うのですが、sh -x で確認して見ると消えてません。
これで正しく書けているんでしょうか?勉強不足ですみませんがよろしくお願い致します。
evalに渡すと消えるという意味なら。 tmp=`eval perl -e "'"'$a = "'"'""$i""'"'"; if ( $a=~ /^\S+(\S{1})$/ ) { print "s${ 1 }x_player" }'"'"`
tmp=$(perl -e 'print "s${1}x_player" if $ARGV[0]=~/^\S+(\S{1})$/' "$i")
shでスクリプトを走らせている時に スクリプト内でスーパーユーザの権限を得るにはどうやったらいいのでしょうか スクリプトにsuを埋め込むとスクリプトが止まってしまって exitしてから再びスクリプトが動き出すのですが 権限だけ持たせてスクリプトをそのまま走らせたいと思っています 何か手は無いでしょうか
リサ
>>205 ありがとうございます
(自分にとっては)有用なスクリプトが組めましたm(_ _)m
感謝の極みです
ふとした疑問だが、スクリプト内でスーパー・ユーザにスイッチするのと、スクリプト自体をスーパー・ユーザ専用にするのと、どちらが安全なのだろう。
>>208 運用の仕方によって変わるでしょ。
一概にどちらが安全とか言えないよ。
標準出力は標準出力のままで標準エラーだけをパイプしたいのですが どのようにすればよいですか?(sh)
exec 3>&1 (echo stdout; echo stderr >&2) 2>&1 1>&3 | rev
212 :
210 :2008/06/22(日) 13:59:15 ID:IsXP6W78
213 :
login:Penguin :2008/06/22(日) 16:57:49 ID:3HpeFvyL
あれ?更新されてない
214 :
login:Penguin :2008/06/22(日) 17:03:12 ID:3HpeFvyL
rsyncをあえてつかわずローカルでのWEBサイトの更新を別のPCへFTP(put) したいのですが混乱してきましたどなたかわかりますでしょうか? #!bin/sh #pukiwiki内のファイルで更新のあったファイルのあぶりだし。 echo = "`ls --full-time -F`" > fulltime awk '{print $6$7}' /var/www/html/pukiwiki/fulltime awk '{print $6$7}' /var/www/html/pukiwikibk/fulltime2 diff=diff /var/www/html/pukiwiki/fulltime /var/www/html/pukiwikibk/fulltime2 #diffの中身が空なら抜ける if [ "$diff"-eq /dev/null ];then logout #diffの内容がディレクトリなら再度中身のファイルの更新がないかを確認。 #diffの中から$10のファイル名を取り出す
216 :
login:Penguin :2008/06/22(日) 17:13:28 ID:3HpeFvyL
わかりました。ありがとうございます。lftp調べてみます。
217 :
login:Penguin :2008/06/22(日) 17:19:23 ID:3HpeFvyL
ローカルになく、リモートにのみあるファイルを削除したいときは mirror -R -e や mirror -e などできるみたいですが、 ローカルで更新されたファイルのみアップといったこともできるのでしょうか?
218 :
login:Penguin :2008/06/22(日) 17:47:05 ID:3HpeFvyL
n 更新されたのみ mirror -Rn
ubuntu初心者スレから誘導されました。 成形した時刻の文字列をクリップボードにコピーするシェルスクリプトを作りたいのですが まずdateで時刻を取得出来ることがわかりました。それで日付や時間を成形してみました。 で、その取得した時刻をクリップボードにコピーさせる方法が分かりません。 ubnutuは8.04です。よろしくお願いします。
>>220 xclip が使える。ただし日本語が通らない。
ruby がクリップボード操作できるみたい。
シェルスクリプトで正規表現使いたいのですが、 末尾が .jp のものだけマッチさせたい場合は $\.jp でよろしいのでしょうか?
シェルだけで正規表現って扱えるの?
224 :
login:Penguin :2008/06/23(月) 00:09:49 ID:xSXSaj7v
>>223 [[ 'www.example.jp' =~ '\.jp$' ]] && echo OK
226 :
login:Penguin :2008/06/23(月) 07:14:57 ID:xSXSaj7v
bash 3.2.33だが
>>224 だとOKと表示されない件について
quote しちゃだめになったのか。 [[ 'www.example.jp' =~ \.jp$ ]] && echo OK
>>221 そうですか。日本語通らないですか。
rubyがいけるならPythonもいけるのかな。探してみます。ありがとうございます。
>>230 さっそく入れて使ってみました。
中クリックで文字列を選択した内容をそのまま貼り付けれてものすごく便利でした!
いいものを知りました。ありがとうございます。
で本題
スクリプトはこんな感じまで書きました。
#!/bin/bash
y=`date +%Y`
m=`date +%m`
d=`date +%d`
t=`date +%T`
DATE= $y/$m/$d/" "$t
echo $DATE
これで、chmod -x で権限を与えて実行すると、現在の時間を返してくれるようになりました。
が、xselを使って$DATEをクリップボード(かプライマリ)にコピーする方法が分かりませんでした。--inputは変数が代入出来ないようですし。
xsel -p < $DATE ではうまくいきませんでした(ファイルじゃないので当たり前ですか)
>>231 >xsel -p �< $DATE ではうまくいきませんでした
echo $DATE > xsel -p
echo $DATE | xsel -i
>>232 どうもうまくいきませんでした。
修正したものを実行すると、〜.shと同じディレクトリに xsel という中身が"-p"の入ったファイルが作成されてました。
>>233 こちらもうまくいきませんでした。
実行すると、以下の結果が表示されました。
./date_clipboard.sh: 7: 2008/06/23/ 21:52:49: not found
/が入っていると、ディレクトリと認識してしまうのではないかと思って、/を外して数字だけ並んだものも作って見ましたが、だめでした。 同じく echoで$DATEの中身とnot foundと出されました。
>>235 こういうことでしょうか?
#!/bin/bash
y=`date +%Y`
m=`date +%m`
d=`date +%d`
t=`date +%T`
DATE= $y/$m/$d/" "$t
look asap
echo $DATE | xsel -i
これを実行しても、同じく、echoで$DATEの中身とnot foundと出ました。
#!/bin/sh date "+%Y/%m/%d %T" | xsel -i
>>237 おお! 見事に表示されました。
dateごと渡してやればよかったのですね。勉強になりました。
ありがとうございました。
239 :
232 :2008/06/23(月) 22:40:24 ID:7JKTU8Gt
ごめん! (汗)
>>238 > dateごと渡してやればよかったのですね。
別に echo $DATE | xsel -i でもいいよ。
>>236 > DATE= $y/$m/$d/" "$t
問題はここだ。
= の後の空白が余分。
むしろ
DATE="$y/$m/$d/ $t"
と書くべき。
>>239 いえいえ。
>>240-241 空白がまずかったのですね。気がつきませんでしたorz
ダブルクオーテーションでくくると文字列がそのまま出てくる気がして、
> DATE= $y/$m/$d/" "$t の途中の" "は空白を出力したつもりでしたが、全体をくくってやってもよかったのですね。実行して確認しました。
#!/bin/sh
y=`date +%Y`
m=`date +%m`
d=`date +%d`
t=`date +%T`
DATE="$y/$m/$d/ $t"
echo $DATE | xsel -b -i
(xsei -b -iでクリップボードにもコピー出来るようにしてあります。xsel -pでも動きました。)
見え栄は
>>237 のほうがいいですねw
勉強になりました。ありがとうございました!
一部ミスりました × ダブルクオーテーションでくくると文字列がそのまま出てくる気がして、 ○ ダブルクオーテーションでくくると文字列がそのまま出てくる気がして、 全体をくくらずにしていました。
>>244 そうだったのですか、シングルクオーテーションは文字として出てきて、ダブルクオーテーションでは、$も例外として、$が機能すると言うことですか。
いやはや知らないことだらけでした。勉強になります。ありがとうございます。
初心者の書くスクリプトは、むしろダブルクォートを忘れて インジェクション的な事故多発なわけですがw if [ x"$HOGE" == x"DQN" ] ; then ちゃんとこういう風にまで保護されているスクリプトは稀。
俺さ、その x が何のためにあるのか、以前から不思議なんだ。 if [ "${HOGE}"="DQN" ] ; then との違いは何?
$HOGEが未定義の場合どうなるんだ?
>>247 = と == は違う。
== の前後に空白が必要。
その上で、$HOGE が空文字列の場合にエラーになるのを回避するため。
>>247 の = は == の typo でしょうw
で、"${HOGE}" == "DQN" だったら $HOGE が未定義でもエラーにならない。
x"$HOGE" == x"DQN" との違いは漏れは知らん。ジジイ仕様の /bin/sh とかが
あって "${HOGE}" できない場合があるんじゃない?
× export HOGE="DQN"
○ HOGE="DQN"; export HOGE
こんな環境もあるぐらいだからなぁ・・・・・・
>>250 > で、"${HOGE}" == "DQN" だったら $HOGE が未定義でもエラーにならない。
bash はそうだけど、エラーになるシェルもある。
Solaris の /bin/sh とか。
やはり Solaris かw そんな気はしていた。 普段は Linux 使ってるから必然と bash になっちゃうんだよね。sh で出来たっけ? とか結構記憶が曖昧になってしまって鬱。場合にもよるけど、ポータビリティを 意識してなーんとなく昔ながらの書き方を守ってる漏れ・・・・・ あえて #!/bin/bash って書くべき?w
Solarisの古いshなんて無視していいだろ。 POSIX shell (ash, bash, ksh, ...) で動けばいいよ
実際 そんなに拡張されてないし でしょw #!/bin/bash でいいよね。
>>254 スクリプト動かすのに重量級のbashなんか使わないだろ。
#!/bin/sh
で十分。
>>255 先生!うちの環境では
file /bin/sh
/bin/sh: symbolic link to `bash'
です.どうすればいいですか?
だから もう 手じかな環境では /bin/shはないでしょ。 /bin/shと書けばいちおー 互換モードで動くってだけで。
FreeBSDの事もあるしshで書いておこうってだけじゃね
debian 系だと $ file /bin/sh /bin/sh: symbolic link to `dash' ~$ ls -l /bin/bash /bin/dash -rwxr-xr-x 1 root root 686K 2008-05-13 03:33 /bin/bash* -rwxr-xr-x 1 root root 79K 2008-03-12 20:22 /bin/dash* サイズが全然違う。
別にどっちかに決める必要なんてない。 portabiltiy が必要なスクリプトは protable に書く。 そうでなければ bash 依存な書き方をしてもいい。 それだけのこと。
>>256 ぶっちゃけbashはzshよりも遅い。軽量のashなんかとは比べるべくもなく。
ログインシェルとしてなら使い勝手云々ってのがあるけど、
/bin/shをbashにしておくメリットはあんまないよ。
なんかもっともらしいウソが垂れ流されてるぞ。
>>251 >> で、"${HOGE}" == "DQN" だったら $HOGE が未定義でもエラーにならない。
>bash はそうだけど、エラーになるシェルもある。
>Solaris の /bin/sh とか。
solaris ではたしかにエラーになるけど、それは $HOGE が未定義だからではない。
== という演算子自体がないため。
互換性を考えると文字列の比較には == ではなく = を使う。
= なら $HOGE が未定義でもエラーにならない。
x"$HOGE" のようにするのは、$HOGE が -f とか ! のような文字列だったときに
別の意味に解釈されないようにする対策。
マジッスカ ちょっとコンビニで Soliras 買ってくる><
>>251 Sun4 で試したら、未定義でもエラーにならんかったよ。
$ cat test.sh
uname -rvs
VAR="VAL"
[ "${VAR}" = "VAL" ] && 'true'
[ x"${VAR}" = x"VAL" ] && 'true'
unset VAR
[ "${VAR}" = "VAL" ] && 'true'
[ x"${VAR}" = x"VAL" ] && 'true'
$ /bin/sh -x test.sh
+ uname -rvs
SunOS 4.1.4-JL 2
VAR=VAL
+ [ VAL = VAL ]
+ true
+ [ xVAL = xVAL ]
+ true
+ unset VAR
+ [ = VAL ]
+ [ x = xVAL ]
お邪魔します。 シェルスクリプトを走らせて、あるシェルスクリプトを起動させるようにするにはどういう書き方したらよいですか。 また、そのシェルスクリプトを走らせた結果を変数にぶちゅっと入れる書き方はどうしたらいいですか。
事故解決しますた。すいません。
ぶちゅっ
269 :
login:Penguin :2008/06/28(土) 20:17:43 ID:/ZK60QF9
シェルでエロゲをつくるためにはどうしたらいいですか
エロゲって何ですか
271 :
login:Penguin :2008/06/28(土) 22:52:16 ID:/ZK60QF9
linuxがwindowsに唯一負けてるのがエロゲです
だとすれば、sh スクリプトでなく、BAT ファイルで作ると良いのではないでしょうか
273 :
login:Penguin :2008/06/28(土) 23:48:10 ID:ZJYzC1iZ
windowsに対抗するため、Linuxにエロゲを導入します また、複数のplayerがエロゲサーバにtelnetしてplayすることを想定としているため GUIではなくCUIで行いたいと思っています
>>273 CUIでいかにエロさを出すかが問題だ
絵もない本当のノベルゲームでいいっていうなら、
ひたすらechoとifとかwhileとかcaseを駆使すればできる気がするけど
今どきtelnetってのもツッコミどころだけどな
Nethackはエロゲ 異論は認める
NetHackを2ch-AA拡張すればエロくなる。 主人公:( 'A`) ヒロイン:J( 'ー`)し てな具合。そんでもって濡れ場ではフルスクリーンAAでアニメーションするの。
Linux + Darwin Streaming Server で自分専用の放送局を何チャンネルも建てて
どこでも自分のコレクションした音楽を聞けるようにして楽しんでいるのですが、
面倒くさいのは、メタファイルを用意せねばならない点。
例えばマイケル・ジャクソンだけを集めた専門局を作るとします。これを
1).
http://www.example.com/michael.pls 2).
http://www.example.com/michael.m3u などといったメタファイルに、以下のような内容を記述しておいてやらねばなりません。
1). [playlist]
File1=
http://www.example.com:8000/michael Title1=nina
Length1=-1
NumberOfEntries=1
Version=2
2).
http://www.example.com:8000/michael ま、大した量じゃないので、今まではいちいち手作業で cp して vi で編集していたのですが、
これを、例えば
$ mkpls michael
などと言った変数 $streaming_name を与えれば、
自動的にファイル内の特定の部分も書き換えて、
かつ、.pls .m3u それぞれのストリーミング用メタファイルも
まとめて生成してくれるようなスクリプトがあれば便利なのに、
と思っているのですが、どう書けばいいのかサッパリ解りません。
基本は、単に変数を含んだひな形を用意し、ひな形を複製、与えられた変数を代入して、
変数の名前+拡張子で保存、というだけのことだと思うんですが。。。。orz
279 :
login:Penguin :2008/06/30(月) 22:16:41 ID:mYyaCshH
超入門者です。下記内容のシェルを作成しなければならないのですが、参考書を見てもよく分からず
知り合いにも分かる人間がおりません。。ごめんなさい、どなたかご教授頂けないでしょうか?
・/var/log/mailを解析して特定のユーザに関する調査を実施して結果をファイル出力する。
(条件)
・スクリプトの実行形式は「スクリプト名 ログファイル名 メールアドレス」
・受信メール数と送信メール数を集計する。
・調査をするユーザは引数として与える。
・調査をするユーザは
[email protected] どのような記述にすれば良いのか、参考となる情報を何でも構いませんのでお願いいたしますm(__)m
>>279 grep $2 $1 | wc -l
さっさと学校辞めて派遣労働者にでもなってしまえ。
その方が親孝行だ。
シェルからwindowsにrshのような感じでコマンドを打ちたいんですが、 telnetを使ったりしてどうにかならんでしょうか?
>>279 スクリプト以前にひょっとしてシェルプロンプトで何も叩いた事がないほど初心者?
284 :
login:Penguin :2008/06/30(月) 23:08:10 ID:mYyaCshH
279です。
>>280 その言葉真摯に受け止めます。ですが今後努力する所存です。
すいません。諸事情で時間がない中でしたのでこちらで質問させて頂きました。
参考情報ありがとうございます。
>>283 簡単なコマンドなら叩いたことはありますがシェルは全くの初心者です。
どうか宜しくお願い致しますm(__)m
>>282 家のfedoraでインストールして試してみてexpectすげーと思ったけど、業務用のredhat 3 には多分入ってないです・・・
ありがたいですけど、他にないですか?
>>285 Expect.pmとかopen3.rbとか・・・
最悪openptyで相当品を書けばいい。tccで書けばそれでもスクリプト。
>>284 それじゃまずgrepを使ってあるユーザーの受信メールの行と送信メールをどうやったら切り出せるか
試行錯誤し、それが出来たらwc。 ひっかかったらgrepのmanページでまず回答を探す努力を。
awkとかのほうが色々柔軟性があるけどたぶん使った事無いでしょう。
あと
>>3 のリンク先をいくつかながめるといいと思う。
288 :
login:Penguin :2008/06/30(月) 23:48:15 ID:hskJhfYi
初心者です。お願いします。 cutコマンドはファイルのみ使えますか? 変数にも使えるでしょうか。 変数に格納してある文字列からcut.grepを使いたいんですが。
>>287 ご教示いただいた方法にて調べてみます。本当にありがとうございますm(__)m
>>286 それらはアプリでしょうか?
インストールが必要なのはNGなんです。
標準的なコマンドで実装できれば・・
>>288 $echo 1111 bbbbbb | cut -f1 -d ' '
で1111と表示できるからcutにパイプして
echo $var | cut -fx
で出来る
変数にファイル名を入れてる場合なら
cut -fx < $filename
でおk
あとはエスパーじゃないんで分からん
295 :
login:Penguin :2008/07/01(火) 10:01:29 ID:ckhBGtgF
質問です。 変数の中に=があったらそれまでの文字を出力したいんですが、 例)$1に abc=defg -> abcのみ出力 $2に abcdefgh -> 何もせず こういった場合、abcを取り出す(=の前までCUT?)事はできますか? if(( grep '=' $1 )) then cut〜 みたいになるんでしょうか。お願いします。
>>295 case "$1" in
*"="*) echo "$1" | sed 's/=.*//' ;;
esac
bashで x=$1 p=${x%=*} [ $x = $p ] || echo $p
298 :
login:Penguin :2008/07/01(火) 10:28:44 ID:ckhBGtgF
>>296 即レス有難うございます!お陰様で出来ました^^
>>297 それだと $1 が「/tm*/=xx」とかのときうまくいかない。
>>295 >(=の前までCUT?)
>>296 で sed の例が出てるけど
cut -d "=" -f 1
とか
awk -F "=" '{print $1}'
とかでもできる。
301 :
login:Penguin :2008/07/01(火) 11:57:13 ID:ckhBGtgF
302 :
login:Penguin :2008/07/01(火) 12:12:55 ID:ckhBGtgF
すみません、力を貸して下さい。 今やらなければならないのが、lsuser ALL を叩いて、 出力結果を見出し付で出力する(体裁を整える)です。 現在見出しの部分でつまずいています。 bin id=2 pgrp=bin groups=bin,sys,adm home=/bin guest id=100 pgrp=usr groups=usr home=/home/guest などを user_name id pgrp groups bin 2 bin bin,sys,adm guest 100 usr usr と言った感じです。=の前後でCUTし、前部分を見出しに、 後部分を見出しの下に出したいです。難しいのが、既に見出しにidがあるのに また見出しにidが追加されてしまうんです。 どなたかサンプルを作っていただく、またはアドバイスを頂けますでしょうか。 よろしくお願いします。長文・乱文すいません。
>>302 perl か何かで書いた方が早いと思う。
304 :
login:Penguin :2008/07/01(火) 12:44:02 ID:ckhBGtgF
>>302 アドバイス有難うございます。調べてみます!
書き忘れたんですが、KORNシェルです。
実用的な答が欲しいならもう少し環境を書くべきだ. bash,sed,awk,perlなどが使えるのかどうかとか. それともシェルだけでアクロバティックにこなしたいのか?
そもそも使ってる OS は何よ。
>>292 ありがとうございます。バッチリでした。
いやー楽になった。っていうか勉強になりました。
みなさん、どういうところで構文を学んでいらっしゃるんでしょう?
この手のことについては完全に無学なもので、
どこからどう手をつけていいやら分かりません。
309 :
login:Penguin :2008/07/01(火) 13:31:41 ID:ckhBGtgF
302です。環境はUNIX AIXです。そしてKORNシェルです。
IFSに=を加えて行ごとにsetすると簡単
312 :
login:Penguin :2008/07/01(火) 13:48:38 ID:ckhBGtgF
>>310 さん すいません板違いでしたか。移動します。
>>311 さん やってみます。有難うございます。
今日の宿題スレッドはここですか?
>>309 そういえばIBMのTivoli agent for Linuxをインスコしようとしたら
インストーラーがkshを必要としやがった。
>>302 俺には難しかった・・orz
誰か見本よろ
>>302 #!/bin/sh
st=true
while read s
do
rctop=null
rc=null
for n in $s ;do
if [ $st = true -a "$rctop" = "null" ] ;then
rctop=user_name
fi
if [ "$rc" = "null" ] ;then
rc=$n
else
if [ $st = true ] ;then
rctopadd=`echo -n $n | cut -d '=' -f 1`
rctop=`echo $rctop $rctopadd`
fi
rcadd=`echo -n $n | cut -d '=' -f 2`
rc=`echo $rc $rcadd`
fi
done
if [ $st = true ] ;then
echo $rctop
st=false
fi
echo $rc
done
$./shellscript.sh < n.data
理想の動作じゃないだろうが
フォーマットをこっちが指定するやり方として…あとは整形の仕方だな
>>312 で移動するって言ってるんだから
もうここで言ってもしょうがないんでは。
('A`)スマソ
319 :
login:Penguin :2008/07/02(水) 15:26:35 ID:BlTL/xTh
質問です。 たとえば、 cat test 1 2 3 4 5 と表示されるシェルスクリプトがあったとして、それを 5 4 3 2 1 と表示させるにはどうしたらいいでしょうか?
>>322 しっ、知らなかった... なんつー冗談ネーミング。 いつからあるの? 発祥はgnuかな。 Wikipediaにも
載ってない。
>>324 あ、あったわ。 tac(Unix)であった。
Terrible-monster Attacking Crew
cat tac most more less head tail cut paste pgp gpg mail nail 言葉遊び系のコマンドペアって案外少ないんだな。
if fi case esac #ここはコマンド以前にシェルスクリプト スレだよな
esac にはびっくりしたなーもー
逆文字でネストを表現するのはお手本となる言語があった気がする
331 :
login:Penguin :2008/07/04(金) 08:23:27 ID:jR7hqKfT
プロセスをkillするシェルを作成しましたが、そのシェルそのものも引っかかってしまいます。 下記を実行すると、test のプロセスはKillされますが、 ./kill_test.sh: line 6: kill: (17914) - No such process と、エラーが出ちゃいます。 どのようにすれば、そのシェルそのものを検知しなくできますでしょうか。 例えば、test というプロセスをKillするプログラム #!/bin/bash # kill_test.sh ID=ps axo pid,cmd | grep test | awk '{print $1}'` if [ -n "$ID" ]; then kill $ID fi 実行結果 test のプロセスはKillされますが、エラーも出る ./kill_test.sh: line 6: kill: (17914) - No such process
ありがとうございます。 プロセスはKillされますが こんどは Terminated と出ちゃいますが... #!/bin/bash # kill_test.sh pkill test
>>331 grep -v $$ とかやって
シェルスクリプトの pid を除く。
grep -v grep とか grep [t]est とかやって
grep の pid を除く。
>>335 同じく
support multiple windowsの意味がわからんwww
337 :
331 :2008/07/05(土) 08:21:10 ID:f1ZF3ker
ps axo pid,cmd | grep test| grep -v ' grep' | awk '{print $1}' で、できました。 m(._.*)mペコッ pkill 知りませんでした。pgrepも知ることができ感謝です
>>335 漏れも漏れも
can scroll left and rightの意味がわからん。
perlとかrubyとかpythonとかはシェルスクリプトよりも確かに優れてる面もたくさんあるけど、 classpathの設定とかで混乱する手間と暇を総合的に考えると、単純なシェルスクリプトの範囲内で 問題を解決する能力がある人のほうが貴重。
>>340 めんどいからさっさと結論を出すと、適材適所だな。
次の方どうぞ。
>>340 > classpathの設定とかで混乱する手間と暇
ちょっとまてw。perlとかrubyとかpython使ったことないだろ?
java男ご乱心。
>>342 例えばperlとかには@INCとかあるから、その辺のことを話したいんだろうと理解。
行間くらい読んでやれ。
>>343 行間読んでJython,Jrubyみたいな話かとおもた。あんなキモいもん認めん。
作るスクリプトが動かされる環境を予測できて,ちゃんと互換性をもたせる能力があればperlでもgnu依存でもなんでもいいよ.
それでもjavaライブラリ依存は認めない。
テキスト処理について質問させてください SQLを格納した以下のようなログファイルがあります。 select * from table1 where 名前='田中' select * from table1 where 名前='佐藤' and 年齢 > 20 select * from table1 where 名前='鈴木' これの条件部分('田中'とか'佐藤'の部分)を'*'に一括で変更する方法はありますか? 環境としてbash、awk、sedは使えますがperlは使えません。 よろしくお願いします
$sed "s/名前='.*'/名前='*'/g" hoge > foo $mv foo hoge
>>348 $ sed -i "s/名前='.*'/名前='*'/g" hoge
そのオプションマニュアルに載ってないな、初めて知った勉強になりました
再起動(shutdown -r now)後、 数分後に指定シェルを起動させたいのですが、 何か良い方法ないでしょうか? centos4で、 /etc/rc.local に記述すると即時起動は可能なのですが、 時間指定ができないため悩んでおります。 再起動を行うのが一定時刻ではないので atも使えません。 どなたかお助けくださいませ。
>>351 at now + 数 minutes
などと /etc/rc.local に書いたらどうだろう。
355 :
351 :2008/07/06(日) 22:45:55 ID:ksmXqbT3
356 :
login:Penguin :2008/07/07(月) 21:33:14 ID:pcTeT086
uClinux2.6上のBusyBoxのmshというシェルで質問です。 BusyBoxのバージョンは以下です。 BusyBox v1.4.1 (2008-06-02 10:22:52 CST) Built-in shell (msh) mshでループ処理をさせていると、いつのまにか Shell input nested too deeply というエラーになり、スクリプトのプロセスが死んでしまうのですが、 何か良いやり方はあるでしょうか。 やりたい事は、アプリケーションの裏方で、1秒毎にサーバに pingを打つなどしてネットワークが見えているかを確認し、 通じないならリカバリをするポーリング処理です。 autorun.sh内からsrvwatch.sh &として起動しています。 srvwatch.sh -------- #!/bin/sh server=192.168.0.1 while [ 継続条件 ] do ping $server -c 1 if [ $? != 0 ]; then # ( pingが通じない時の処理 ) fi sleep 1 done 最悪、他のシェルが使えない事もないのですが、mshで解決できれば それに越したことはないので、よろしくお願いします。
>>356 キリの良いところで別のスクリプトにして子プロセスとして動かせば?
>>357 なるほど。
例えばアプリケーション内のループをトリガにできれば問題を回避できそうですね。
その方向で検討してみます。
quotaのedquotaだとテキスト形式でエディタで編集しなきゃいけないですが、 コマンドのみで指定ユーザを指定容量に変更、ってどうすればできるでしょうか?
実は、ここは「シェルスクリプト総合」スレ。
a,1 a,2 b,3 c,1 d,15 d,1 d,1 e,3 こんな感じのファイルを、1カラム目でユニークにして、2カラム目は1カラム目の値ごとに合計を出したい という場合なんですが、シェルではむずいですか? a,3 b,3 c,1 d,17 e,3 この結果を求めてます
いいえ 容易です
>>361 cutとsort、uniqでキーのリストを作る。
grepとcutでキーごとの値を得る。
それをexpr
>>361 awk -F, '{dat[$1]+=$2}END{for(i in dat) print i","dat[i]}' hoge
指定した変数の中に、ある文字列があれば〜 という条件式、どのように書けばいいですか。
#!/bin/sh hoge=$1 hogehoge=$2 if [ `echo $hoge | grep $hogehoge` ]; then echo "$hogehoge exist in $hoge" fi exit 0
>>367 ども
ですが、ひとつ質問です
たとえばhogeにunko is
hogehogeにu
とした場合、ちゃんと動かないですがこれはどう扱えばいいですか。
よろしくおねがいします bkfile=$dest/$2.$timestamp.tar.gz tar cpzf $bkfile $1 >/dev/null 2>&1 if [ $? != 0 -o ! -e $bkfile ]; ここのでの if [ $? != 0 -o ! -e $bkfile ]; 意味を教えて下さい、エロイヒト
それも、変数に 'unko is' を入れられない糞スクリプトだね。
$? != 0 -o は終了ステータス ! -e $bkfile はファイルで無い場合 すなわち 終了ステータスがO以外、且つ、bkfileがファイルの場合 ということでok?
>>372 unkoは入れるものじゃなくて出すものだからな
#/bin/sh
hoge=$1
hogehoge=$2
if [ "`echo $hoge | grep $hogehoge`" = "$hoge" ]; then
echo "$hogehoge exist in $hoge"
fi
>>373 終了ステータスが0以外、もしくは、$bkfileファイルが存在しない場合
>>375 thx
if [ $? != 0 -o ! -e $bkfile ];
[ $? != 0 ]且つ [-o ! -e $bkfile ]
-oの意味と
[ $? != 0 -o ! -e $bkfile ]; スクリプトの区切り方がわかんらんのですが・・・
面倒かけてスマソ
よろしくお願いします
「あるディレクトリにAA.bbというファイルがなかったら AA.ccというファイルを削除する」 これをどう書いたらいいか教えてください
[ ! -f AA.bb ] rm AA.cc
宿題は自分でやりなさい。
382 :
379 :2008/07/23(水) 21:51:48 ID:AKylUJRP
>>380 ありがとうございます!できました。
別件でもう一つ教えてください。
「m2eという拡張子のものをコンバート(m2t化)、成功したらm2eを削除する」
というスクリプトを書きました。
#!/bin/sh
for file in *.m2e
do
/usr/local/bin/b25 $file ${file%m2e}m2t
EXITCODE=$?
if [ 0! = $EXITCODE ]; then
rm -f $file
fi
done
m2eファイルは複数あるんですが、4行目でありったけのm2eを処理し終わらないと
5行目以降の処理に進まないようで、
m2eを削除することなくばんばんm2tができていきます。
これを、1ファイルごとの処理にするにはどこを変えたら良いでしょうか・・・?
分からない時は変数を出力してみるといいよ!
終了判定の if文がおかしいから、rm行が実行されないのでは? sh -x script してデバッグしてちょ。
386 :
379 :2008/07/23(水) 23:27:36 ID:AKylUJRP
皆さんほんとありがとうございます。 sh -x すら知りませんでした。超便利ですねこれ…。 で、b25コマンドが成否に関わらず終了コード0を返していました。 成功したら1を返すだろうという先入観が敗因でした。 今日教わったことを踏まえ以下のとおりにしたら成功しました。 #!/bin/sh for file in `ls *.m2e` do /usr/local/bin/b25 $file ${file%m2e}m2t if [ -f ${file%m2e}m2t ]; then echo complete rm -f $file else echo fail fi done 初めて書くシェルスクリプトですが、おかげさまで思ったとおりできました。 どうもありがとうございました。
387 :
login:Penguin :2008/07/23(水) 23:30:38 ID:bXJC8PaP
>>386 蛇足かもしれんが、成功したときの終了コードは0だ。
空白を含んだファイル名の処理がおかしくなるので,ls しない方がベター。
元の
> for file in *.m2e
のままでよい。
>>382 = の否定は != ね。
! と = の間に空白を入れてはいけないよ。
>>387-389 遅いよおまいら。
遅刻の罰として、5分毎にこのスレの新規書き込みをチェックするスクリプトを上げること。
bashの内部コマンド以外は使ってはいけません。
curlも使っちゃいかんのかい・・・
あきまへん。bashのソケットで。
wgetは認められるはず。 なんせ左手だけで入力できるんだぜ?
>>392 詳しくは知らないけど/dev/tcp/host/portじゃダメかな?
ええのではないでしょうか bashでcurlを代替するには、それで双方向ソケットを実現するしか多分ないだろうから。
あるファイルの、ファイル名を先頭から10文字分取得してOSの変数に入れたいのですが 拡張子もない日時そのままのファイル名(080730151530 とか)なので for文すら書けずにいます。 どう書いたらいいですかと聞ける段階にもないのですが、 こういったファイル名の扱い、前方一致のさせ方について 参考になりそうなサイトなどないでしょうか?
まずは正規表現について学ばれるといいと思います
#!/bin/sh tmp="9999444422228888" for file in ${tmp}; do #先頭から8文字目まで切り出し echo ${file} | cut -c 1-8; done プロトタイプつくって、色々試してみるといいかもよ あとは、tmpをどのように持っていくか find使いたかったら tmp=`find -tpe f` とかだろうし 色々やってるうちに、スペースが入ったファイル名とかで疑問もでてくるだろうし
目的のファイルがあるディレクトリで(そのディレクトリに cd して)
スクリプトを実行するという前提で、、、
for FILE in *
で、そのディレクトリにある隠しファイル以外のファイルの名前が順に変数 FILE に入る。
拡張子のあるなしは関係ない。
もし、日時そのままのファイル名(数字12文字のみからなる?)以外のファイルが
ディレクトリ内に存在する場合には、以下のような if 文で弾く。
if echo $FILE | grep '^[0-9]\{12\}$' > /dev/null
あとは
>>398 のを組み合わせて全体はこんな感じ。
#!/bin/sh
for FILE in *
do
if echo $FILE | grep '^[0-9]\{12\}$' > /dev/null
then
echo $FILE | cut -c 1-10
fi
done
そもそも CUI 環境の UNIX, Linux に拡張子という概念は無いと思われます。
概念という言葉が適切かどうか。
kakutyou.c
>CUI 環境の UNIX, Linux に拡張子 CUIと拡張子に何の関連があるんだ。 MS-DOS時代には拡張子が無かったという主張なのか。
>>403 文字通りの意味だよ
KDEなど使用したX環境では拡張子を判断してプログラム動作を変えるものが一部にあるからね
もう一度言うが、「文字通りの意味」だ
そんなに解らん日本語だったかね
mailcapはあるけど
拡張子ではなく suffix だ、とかそういう話じゃなかったのか。
>>404 胸張って屁理屈言ってどうするかね。
大人気なく反例を提示するなら、CUIで動く代表的なプログラムであるgccは拡張子を見て呼ぶコンパイラを変えたりするが、見解を求む。
>>407 座布団あげる。
柔軟だというだけだよね。
gzipも拡張子見るなw
make !! , make !!
ID:JpgVGgaY 恥ずかしいなw 全部言い返されてやんの
>>406 拡張子でなく接尾辞だという点には誰も異論だ無いんじゃないか。
>KDEなど使用したX環境では拡張子を判断してプログラム動作を変えるものが一部にあるからね
などと強弁してるのを皆に笑われているだけで。
hoge.gz.20080101 を gunzip しようとしたら怒られましたよ
>>413 gcc も gunzip も manページの表現は接尾子でもsuffixでもなく、「拡張子」ですな。
もう いじめはやめましょうw
>>415 そら、まあ
C:\>gzip.exe -dc < hoge.gz > hoge
なんてときの .gz は拡張子だもの。
というか、実のところ「拡張子」という呼称が既に人口に膾炙してるから、そう表現してるんじゃないかな。
たぶん、
>>406 の言ってることはもっと厳格で、FAT(だっけ?)には8文字のファイル名と3文字の拡張子を入れる覧があるが、inodeにはファイル名覧しか無いといったことだと思うよ。
あっと、俺は ID:JpgVGgaY ではないよ。話をたどれば分かると思うが。
>>417 >>417 ≠ ID:JpgVGgaYは了解しています。直接レスつけるのは忍びなかったので。
あとsuffixつーとドメインネーム則なんかのジャンルも含む気がして
ちょっと拡張子とはニュアンスが違うと思いました。
>>415 suffix って表現もあるじゃん。
extension と混在してる。
まぁまぁ、404のオモシロ発言でもたどって和んで。
>>400 そもそも CUI 環境の UNIX, Linux に拡張子という概念は無いと思われます。
>>403 >CUI 環境の UNIX, Linux に拡張子
CUIと拡張子に何の関連があるんだ。
MS-DOS時代には拡張子が無かったという主張なのか。
>>404 >>403 文字通りの意味だよ
KDEなど使用したX環境では拡張子を判断してプログラム動作を変えるものが一部にあるからね
人口に膾炙←読めない
ループか? ループスレなのか?うひょーーーーーーーーーー
拡張子はファイル名の接尾辞として使われるっていう、ただそれだけの話。
*.bak と *~ で見た目は違うが用途はほぼ同じなんだけど *.1 *.2 … はlogとmanで意味合いが変わるもんな
bash の配列の話です。 添え字を付けて定義すれば要素がかけた配列を作れますよね? x=(a b c) x[4]=e x[6]=g こんな風に定義すると要素の数 ${#x[@]} は 5 を返しますが 実際には x[6] まで定義されているわけです。 こういう歯抜けの配列から添え字と要素をセットで全て取り出す方法 何かありませんか? for i in ${x[@]} ; do echo $i ... だと添え字がわかりません。 for (( i=0 ; i < ${#x[@]} ; i++ )) ; do echo ${x[i]} ... だとかけた部分に対応できません。 bash の配列処理が貧弱なのは知っていますが 何か知恵がありそうな気もするんです。
>こんな風に定義すると要素の数 ${#x[@]} は 5 を返しますが うちでは 6 になる。 $ set x=(a b c e '' g) なので、 x[5]が空だからきっと代入されなかったんだろう という判断しか思い付かない。
427 :
426 :2008/08/10(日) 19:20:40 ID:OrrhkboJ
読み返すと我ながらバカな日本語でイヤになった。式で書く for ((i=1; i <= ${#x[@]}; i++)) do if [ "${x[i]}" != "" ]; then echo "$i ${x[i]}" という判断文を付け加えることぐらいしか思い付かない。
>>426 >> こんな風に定義すると要素の数 ${#x[@]} は 5 を返しますが
> うちでは 6 になる。
あれ?自分の環境 (bash 2.05b @ debian) では 5 なんだけどな。
そちらの環境を教えてくれますか?
あ、ごめん。zsh でやっていた。 bash で set すると、 $ set x=([0]="a" [1]="b" [2]="c" [4]="e" [6]="g") で、添え字と要素がセットでズバり出るじゃないですか。
>>429 ああ、そうでした。確かに表示されますね。
[] とか = とか変な文字が要素に入らないという前提なら
そこから添え字のみを取り出せればいけそうですね。
基本的なことで、すいまん bashで、たとえば # login : root # passwd : foo なんて場合、シェルからの問い合わせに対して、スクリプト側で rootやfooを自動的に入力したいのですが、どのように書いたらいいのでしょうか?
BATU 基本的なことで、すいまん MARU 基本的なことで、すいません
グループ sumo が存在するか? を調べる方法が思いつかない。 ユーザ hakuho の存在を調べるのは、 id hakuho などとやろうと思うが、グループの方をhelp!! grep /etc/group はやりたくない。
LANG=C chgrp hakuho / 2>&1 | grep -q '^chgro: invalid group' || echo ok
chgrpされたら困るやん。
root じゃなきゃ大丈夫でしょ。
んな罠みたいなスクリプトはちょっと。
他に思いつかないんだよな。 素直に /etc/group を grep するのが一番だと思う。
grep /etc/group はやりたくないそうだから仕方ない
NIS とか LDAP とか使ってるなら perl あたりで getgrnam とか。
NISもLDAPも使ってないが、これは良いかもしれない。ありがとう。 $ perl -e '($n, $p, $g, $m) = getgrnam 'lp'; printf "%s\n", $g' 7
bash使ってるのですが lsすると何も返ってこないです set +mするとかえってきます 何が悪いのかさっぱりわかりません
echo $"Starting XXXX daemon..." という一文の「$」の意味を解しかねてるんだども…
% echo $"Starting XXXX daemon..." $Starting XXXX daemon... % echo "$Starting XXXX daemon..." XXXX daemon... %
>>448 ja.po とか作るときに
$" " で囲んだところが
翻訳の対象として切り出される。
メッセージ カタログ化
とかでググれ。
これすか… bash(1) > --dump-po-strings > Equivalent to -D, but the output is in the GNU gettext po (portable object) file format. 試しに /usr/share/locale/ja/LC_MESSAGES/XXXX.mo を作ってみたが、日本語にならない。 あうあう。。。 「$」はぶった切ることにします。
>>451 急ぎじゃなかったら少し頑張ってみるといいかも。
前作ったもの見たらこんな感じで作業してたらしい。
$ xgettext -o hoge.po hoge.sh
$ gtranslator hoge.po
$ msgfmt -o hoge.mo hoge.po
hoge.sh の中にはこんなのが書いてあった。-->
if [ -z "$TEXTDOMAIN" ] ; then
TEXTDOMAIN="hoge"
TEXTDOMAINDIR="/usr/share/locale"
fi
<--
TEXTDOMAIN="hoge.sh" じゃなくて
TEXTDOMAIN="hoge" にしてあるのは
hoge.sh をインストール時に /usr/bin/hoge に改名(hoge.sh から hoge に)するため。
gtranslator てのが無かったので、 $ sh --dump-po-strings XXXX > ~/XXXX.po とし、msgfmt 以降同様にすると日本語になりました。 どうもありがとう。
?$
455 :
login:Penguin :2008/09/01(月) 09:58:54 ID:LEXE4Xrt
C言語でいう for (float a=0.1;a<1.5;a+=0.1){ } の様なループはどのように書けばよいのでしょうか?
>>455 小数とか使いたいなら
もっとまともな言語使った方がいいよ。
for i in `seq 1 20` do i=`echo "scale=1; $i / 10" | bc` echo $i done
やっぱループ変数は整数だよな。 少数は気持ち悪い。
$ cat aso killall fukuda
>>458 気持ち悪いどころか、有害。
for(float a=0;a<=1.0;a+=0.1){printf("%g ",a);}
⇒ 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9
>>460 勉強になります。
使った事ないし、使う場合はテストするのでだいじょぶだけど。
でも絶対やらんよねw Cやってるやつは。
すれち
bcで計算させたとき、0以下の小数は最初の0を抜いた.2のように表示されますが、 0.2の様な表示にはできませんか?
0 ≧ .2 なのか。
>>463 浮動小数点の比較を工夫なく行う奴はアホ。
465 :
login:Penguin :2008/09/05(金) 21:49:46 ID:eUOT1mPo
sed を | で つなぐんじゃだめ?
#!/bin/sh echo '%A4%A2' | tr % = | nkf -emQ 「あ」と表示させたいのですが、「、」」と表示されてしまいます。 正しい書き方を教えてください。
うち(EUC環境)では「あ」と表示される。
>>466 テキストに落とすとEUCで「あ」に見える
>>466 の環境がUTF-8なら
#!/bin/sh
echo '%A4%A2' | tr % = | nkf -wmQ
470 :
login:Penguin :2008/09/08(月) 22:09:56 ID:tYV0ghqH
引数 output-file input-file1 input-file2 ... を受け取ってinput-fileN に some-dir/ を付加したコマンド引数を他のプログラムの引数として与えたいのです。 つまり、 foo yaruo.out vip.txt vipper.txt vippest.txt でfooを実行して、そのfoo内では bar yaruo.out www/vip.txt www/vipper.txt www/vippest.txt を実行するということがしたいのです。 こんなスクリプトを作成するには、fooをどのように記述すればいいのでしょうか。 よろしくお願いします。
もう宿題の季節なのか?一箇所直してから使ってくれ。 #!/bin/bash org=www; ARG1=${1}; shift; echo bar ${ARG1} ${@/#/${org}/}
>>470 あのね、
宿題を出す先生は、このスレもチェックしてるからね、
>>471 のを出しても 0 点だからwww
ゆっくり 0 点にしてってね!
473 :
login:Penguin :2008/09/08(月) 22:54:09 ID:tYV0ghqH
>>471 残念ながら宿題ではないのです〜
ありがとうございました。
うちの大学の先生はプログラム板も見ていた
先生も激務だな
悪いな、おいらは数学板だけでなく、 日本語のあらゆる数学質問掲示板を巡回している。 必ず学生が質問をしやがるから。 レポートを返すときに、そのスレおよび掲示板のコピーを添付して、念のため確認をとる。 初めから正直に引用したと書いてあるものについては、改めて口頭で説明させている。
院生にやらせそうな案件だな
実際に教授がやってたら笑いものだな。 そこまで熱心にありがとうございます、と学生ながらに思うべきか。 ただ、ねぇ・・・
>>478 いや、日本だけってわけでなく海外でも今や引用元チェックとか行っているよ。
へー
3年前ほどにアメリカのテレビドラマで高校の先生がエッセイの宿題を返す場面を見た。 ある学生に返しながら、「素晴らしいエッセイだったわ。 essay.com(のような感じ)ね? 月曜までに自分で書いて来てね」
問題も自分で作ってね
>>479 手作業じゃないよね。日本語を解析できるツールはまだできてないよ。
fdisk /dev/sdb n p 1 w ↑こんな感じで、入力させていきたいのですが、 方法がわかりません。キーボード 入力 シェル スクリプト あたりでぐぐると、キーボードからの入力を受け付ける、しか見つかりませんでした。 方法を教えてください。
( echo n; echo p; echo 1; echo w ) | fdisk /dev/sdb 入力が端末かどうかちゃんとチェックしてるようなモノだと動かないが、 fdisk はそんなことしてなかったはずなので、ふつーに標準入力からつっこめばよし。
ゴミ箱スクリプト使ってるひといる?
あい。
ゴミ箱に入ってるファイルを復元させるやつなら使ってる
ティルダ(~)展開について質問。 #!/bin/bash ls ~/ directory="~/" ls $directory 上側のように直接書いたものは展開されますが、下側のように変数に入れたものは展開されません。 変数に入った「~」を展開するにはどうすればいいのでしょうか。
directory=~/
494 :
492 :2008/09/29(月) 08:48:30 ID:dqlgrzbc
うわ、そんなことだったのか。ありがとうございます。 では、read directory; などでファイルから読んだ場合はどうすればいいんでしょう。
495 :
492 :2008/09/29(月) 10:56:52 ID:dqlgrzbc
あ、わかりました。eval 使えばいいんですね。 ファイルからティルダ(チルダ)含んだパスを読み込むことなんかよくあると思うんだけど、 そういったシチュエーションでの展開は解説されてませんねえ。 基本的な展開の話ばかりで。
eval って書こうとしたら自己解決してたか。 >ファイルからティルダ(チルダ)含んだパスを読み込むこと 俺は経験無いけど、良くあることなの?
> 俺は経験無いけど、良くあることなの? んー、俺もそもそもスクリプトはあんまり書かないんだけど、 ちょっと今回必要があって、とあるファイルにつらつらと書かれたパスに対して 順番に処理かけていくスクリプトを組んだ。 よくあるかと思ったのは単なる想像。使ったスクリプトが悪かったかな?
むしろ勝手に解釈されたら困ることの方が多そう。
$HOMEの方がいいと思う
16進数がずらーっと並んでいるテキストファイルを手で入力しています。 手入力なのでうっかり16進数の[0-9a-f]以外の文字がはいってしまうこと があるのですが、「このファイルには[0-9a-f]以外がはいってる」ということ を検出するいい方法はないでしょうか。
とりあえず grep -v '[0-9a-f]' みたいな
503 :
login:Penguin :2008/10/14(火) 23:55:57 ID:VVRxoluk
>>501 なつかしい作業だね。
いまどき、そんな事やるひつようあるの?
>>502 試してから書けよ。
$ echo 00 | grep -v '[0-9a-f]'
$ echo 0x | grep -v '[0-9a-f]'
grep '[^0-9a-f]' ですね、失礼しました
[ x"$hoge" = "x" ]というようなのをたまに見かけるんだけど [ "$hoge" = "" ]となにがちがうの?
>>506 - で始まる文字列返されると困るから。
なるほど、どうも
>>502-505 ありがとう。シンプルでそれでよかったんだね。なんか考えすぎてたらしい。
>>503 大昔のパソコン雑誌を押入れから発掘したんです。
そこにあったのは16進ダンプファイルで掲載されていたゲーム・・・。
そして、入力して動かそうとしてあーだこーだやっているうちに
「16進数テキストファイルの処理」が目的になってるという状態w
シェルの操作とかってそうやって覚えるもんだよねー 懐かしさに惹かれておいらも引っ張り出してみようかしら
511 :
login:Penguin :2008/10/17(金) 01:32:36 ID:6ubwN3MV
>
>>503 >大昔のパソコン雑誌を押入れから発掘したんです。
>そこにあったのは16進ダンプファイルで掲載されていたゲーム
>・・・。
やっぱりw
なつかしすぎる。てか、bit数が違うから動かない予感
携帯やデジカメでダンプリストを取り込んでocrソフトでテキスト化 エディタで編集修正したものをデバッガへ食わせるなんてスレ違い
513 :
login:Penguin :2008/10/22(水) 20:50:34 ID:VC8ljHmq
$ cat love.sh what=LOVE echo "ALL YOU NEED IS $what" というファイルを改変することなく、2行目のecho文で "ALL YOU NEED IS CASH" と出力することは可能だろうか? $ cat cash.sh declare -r what=CASH source ./love.sh というのを考えてみたが実現できなかった。
$ sed s/LOVE/CASH/ love.sh | sh これだと改変になる?
あーなるほど。いただきます。
what=MONEY;echo '#'`cat a.sh` | sh
質問なんですが、atコマンドなどのログを取得して 特定のディレクトリーに吐き出すスクリプトを作成したいと思っています。 しかし、PHPやCなどはかなり触っているのでわかるのですが シェルスクリプトは全くの初心者のため、どのようにしたらいいのか見当がつきません。 簡単な例でけっこうですので、教えていただけないでしょうか。 サーバー:CentOS5.2
え、丸投げ!?
Cで書きゃええではないか。
>簡単な例でけっこうですので grep 'atコマンドなど' /var/log/messages > /tmp/hoge
521 :
login:Penguin :2008/10/24(金) 20:25:05 ID:14T+pOpU
>>517 /etc/syslog.conf
とか?
外してたらごめん
シェルスクリプト関連の本って今では結構いろいろ出てるけど、どれがいいんだろう? シェルって何?って人に最適な本もあるだろうし、実務でスクリプトを書く人に最適な本もあるはず。
>>523 な、なにこれスゲー。今悩んでる問題が二つ解消した。たった数分読んだだけで。
その2つを語ってみたまい。 「そんなことで悩んでいたのかクソ馬鹿」と罵倒してあげるから。 …いえ、ウソです。
板違いだったらごめんなさい なぜ find には -exec があるんですか?パイプ では駄目?
#スレ違いと思うけど、それは置いて。 findに-print0が無かった頃、 find ... -print | xargs rm としたら思わぬ結果になり、 find ... -exec rm {}\; と習慣づけるようにしたような、淡い記憶がある。 記憶違いかもしれないけれど。
>>526 一個一個に対してコマンドを実行したいとき。
whileとreadで回すほどでもないときに使う。
xargsはなんかそんな気分の時に使う。
xargs rm だと一個一個消す訳じゃないらしいけど その理屈がようわからん どうやってんの?
>>529 xargsの場合
rm a b c d
-execの場合
rm a
rm b
rm c
rm d
だから、findでは -delete 使うか、末尾を\+にする。
「だから」って… 「findに-print0が無かった頃」と予めことわっているのに、 やはり無かった"-delete"とかを持ち出されても。
-deleteなんてあったんだorz。 使い古したコマンドでも時々manを見るべきだな。
535 :
login:Penguin :2008/11/08(土) 01:22:38 ID:/AB41I5S
どなたかご教授ください。 以下のような形式のログファイル(test.log)の処理を行っています。 # cat test.log 日付 ・・・・必要な情報@・・・・・・・必要な情報A・・・・・・・・・ 日付 ・・・・・・・・・・必要な情報@・・・・・・・・必要な情報A・・・・・ ※「・・・」には、ログのその他、不要な情報が入っています。 このtest.logの中で、1,2行目の必要な情報@と必要な情報Aのみを 抜き出して、別ファイルに保存したいです。 ■保存したい例 必要な情報@ 必要な情報A 必要な情報@ 必要な情報A awkを使おうと思ってたのですが、必要な情報の列(位置)が、 ログの行によって、まちまちでawkで処理する事が出来ません。 この「必要な情報」については、目印となる文字列が含まれているのですが、 grepのようなコマンドで、検索キーワードが含まれる行を抜き出すのではなく、 検索キーワードの該当する文字列そのものを抜き出すような方法は無いでしょうか。 分かりにくい説明で申し訳ありません。アドバイス頂ければと思います。 bashが良いのですが、他のシェルでも方法がありましたら、ご教授ください。
^[^キーワード]*,と,[*キーワード]*$ をsedとかで消しちゃえばいいんじゃない?
「・・・」と略されたら、必要な情報と不要な情報の区切が解らへん。
awk を使うのなら、たとえば、こういうデータに対して aaa word1 bbb word2 ccc ddd word3 eee word4 fff zzz yyy xxx word5 ggg hhh iii #!/usr/bin/awk -f { line = "" for (i = 1; i<=NF; i++) { if ($i ~ /word/) { line = line "\t" $i } } sub(/^\t/, "", line) if (line != ""){ print line } } というのはどう? 改良の余地は大いにあると思うけれど。
539 :
login:Penguin :2008/11/09(日) 00:42:41 ID:+8LPtwQh
bashでの配列について教えてください ファイルの内容を1行づつ読み込んで、変数に格納するには どうすれば良いでしょうか。
つ while read i; do echo $i; done < file つ IFS=' ' FILE=(`cat /etc/passwd`) echo ${FILE[21]}
541 :
login:Penguin :2008/11/09(日) 01:04:17 ID:+8LPtwQh
>>540 ありがとうございました!
こちらのほう、使わせて頂きます。
FILE=(`cat /etc/passwd`)
echo ${FILE[21]}
read
複数ディレクトリにある重複して存在してるファイルをリストアップしたいんですけど (同じ名前とは限らない) find dirA dirB dirC -exec cksum {} \; でチェックサムを出したところまではいいんだけど この値が一致してたらリスト出力するってのはどうすればいいでしょう?
一致行の出力でよければ、 $ find ... | sort | uniq -OPTION 何かオプションが要るような気がするので、uniq(1)を見て。
>>535 awkでできないことなんかないよw
処理速度はきついが
普通に 【必要な情報】で検索すればいいだろ?列なんか関係なしに。
>>543 なんかいまいち
find "$@" -type f -exec cksum \{\} \; | sort -k 1,2 | \
awk '{
if (c == $1 && s == $2) {
print l, $0; l = "";
} else {
c = $1; s = $2; l = $0 "\n"
}
}'
前スレの683-に出てたので参考までに
548 :
login:Penguin :2008/11/10(月) 20:17:51 ID:TV5/2e6C
>>535 sed 正規表現 置換 パターンマッチ(\1 \2とか) ?
549 :
login:Penguin :2008/11/10(月) 20:21:36 ID:TV5/2e6C
>>543 uniqは-wと-dが肝
あとfindには-type fも
重複ファイルのリストアップ、まだやってたのか。 ほれ。 つ find a b -type f | xargs md5sum | sort | uniq -D -w 32
いや、もうやっていない。10日が〆切だった。残念。
出力結果をテキストに書き出す時、複数行あるものを一行にまとめるにはどうすればいいですか?
削除のためのコマンドが知りたいです。 trで改行を空白に置き換えるのはダメでした。
個人的によくやるのは、 command | gawk '{printf("%s",$0)}'
tr -d じゃダメなの?
ありがとうございます 試してみます
cat hoge | tr -d "\n" > piyo こんなんで どうでしょうか
linuxのcrontab なスレが見つからなかったのでここで質問させてください Debian なのですが、 例えば 午前8時から18時まで20分おきにあるスクリプト(get-data.sh)を起動したいのですが /etc/cron.d/get-data.sh を用意して、 */20 8-18 * * * oreore /usr/local/get-data.sh というエントリを登録したのですが、実行されません。 */20 * * * * oreore /usr/local/get-data.sh だと20分おきに実行されます。 前者の記述はどこがおかしくて実行されないんでしょうか?
記述はあってるけど、get-data.sh ってほんとはどこにおいてるの?
>>559 レンジ指定を時と分で両方やるってかち合っちゃうんじゃないかな? 恐らく
0,20,40 8-18 * * * oreore /usr/loca/get-data.sh
は出来るはず。
cygwin環境なんですが P=00010001 Q=`expr length $P` R=`echo "32-$Q"|bc -l` for i in `seq $R` do P="0"`echo $P` done echo $P 不細工ですが、二進数の桁をそろえるスクリプトを書こうとしています 実行したところ、seq: invalid floating point argynebt 24 というエラーが出てしまいます bcの計算結果が整数として代入されず、seqの引数として不適当という事じゃないかな、と考えてるのですが じゃあどうしたらいいのか?とmanを読んでもさっぱり解りません どなたか教えてください
>>562 cygwin 使ってないから外してるかもしれんけど、
> R=`echo "32-$Q"|bc -l`
>
> for i in `seq $R`
> 実行したところ、seq: invalid floating point argynebt 24 というエラーが出てしまいます
$R に変な改行コードまで入ってるんじゃないの?
質問から外れるが、わしなら、 perl -e 'printf("%032b\n", 0b10001 )' とかで済ましてしまう気がする。
565 :
login:Penguin :2008/11/22(土) 17:36:52 ID:lvsMYtv2
>>562 こっちのLinuxやCygwinは正常に実行できるよ
ただ双方の環境とも
$ seq "24 "
って末尾にスペースくっつけてやると
seq: invalid floating point argument: 24
ってなるよ
もしかして後ろに何かくっついてる?
# 敢えてロジック書くのは、勉強の為のシェルスクリプトかな
>>563 >>562 試行錯誤しているうちに実行できました
>$ seq "24 "
>って末尾にスペースくっつけてやると
ご指摘の通り、やはり余計な文字が入っていたのが原因のようでした
よく解らないのですが、バッククォート部分にスペースが入り込んでいたのが悪かったかな…?
>>565 >>564 >質問から外れるが
># 敢えてロジック書くのは、勉強の為のシェルスクリプトかな
一応目的があってやっていることなのですが、いちいち調べて勉強しないことには
前に進めない状態です…
正直調べる事に疲れてしまって、目的を遂げられるならもう何でもいいのですが…
肝心のお礼を忘れてしまいました
>>563-
>>565 ありがとうございました
これで何とか一歩前進です
Cygwin は Linux じゃねーよ。
569 :
login:Penguin :2008/11/24(月) 11:45:40 ID:qXSmazjs
echoでシングルコートで囲まれた文字列の中に、シングルコートとダブルコートを含ませた文字列を指定したいんだが、 以下のようになってしまう。 $ echo 'hello'"hello' > エスケープしてもだめだったんだが、どうすればいいんでしょうか?
$ echo "hello'\"hello" hello'"hello
悪のりしたる。 $ echo 'hello\047\042hello' hello'"hello
572 :
>>569 :2008/11/24(月) 14:10:49 ID:qXSmazjs
>>570 ありがとう!
ちなみに、あえてシングルコートで文字列を囲みたい場合は、どうすればいいんですか?
やっぱできませんかねぇ、、、
>>569 ダブルクオートを閉じてないから,続きの入力を求められてる。
シングルクオートの中ではエスケープできないから,
シングルクオートを表示したかったら,ダブルクオートで囲むしかないね。
574 :
login:Penguin :2008/11/24(月) 14:16:50 ID:qXSmazjs
>>572 こうゆうことか?
$ echo 'hello'\''"hello'
hello'"hello
577 :
login:Penguin :2008/11/25(火) 01:20:38 ID:r0vzabBk
ログのディレクトリを消去したいと思うのですが、 rm -rf /var/hoge/log/* とすると/bin/rm Argument list too longと出てしまって消せません。 どうやったら 消せるでしょう? サブディレクトリもあります。
>>577 rm -rf /var/hoge/log
mkdir /var/hoge/log
/var/hoge/log/.moge は残したい、って場合はこれじゃだめだけど。
いや普通に考えたら find /var/hoge -exec rm {} \; とか find /var/hoge | xargs rm だろ?
for i in /var/hoge/log/*;do rm -rf $i;done じゃなくて?
>>580 ファイル多すぎて*展開できなくてエラーになってんだから無理じゃね?
>>577 echo /var/hoge/log/* | xargs rm -rf
>>579 find 使うなら maxdepth とか使わないと無駄に処理が増えると思う。
>>582 いやだからファイル多すぎて*展開できないからエラーなんだろ?
echoにも渡せないと思うんだけど・・・
気のせいだったらすまんけど
シェルが*を展開するところまではできてるでしょ。 その結果をシェルからまとめて渡されたrmがエラー吐いてる訳で >/bin/rm Argument list too long
ああ確かにその通り echoの引数はARG_MAX超えても大丈夫?で、 xargsはrmに渡すときに調整?してくれるからこれが一番軽いと・・ 覚えときます
>>580 以前、くだ質にも同じこと書いた気がするけど
rm を for 文の外に出して
for i in AAAA/* ; do echo $i ; done | xargs rm -rf
とかやった方が早いよ。
# 速度なんか気にしてないってのならスルーしてくれ。
587 :
577 :2008/11/25(火) 04:35:06 ID:r0vzabBk
色々提案ありがとうございます。 勉強になりました。 特に*はシェルには展開されている
けどコマンドで弾かれているという認識は参考になります。 さて、最終的に採用したいと
思いますのは
>>578 さんの
rm -rf /var/hoge/log
mkdir /var/hoge/log
です。 これが圧倒的に早い。 1万個の空ファイルを削除するのに
>>586 ですと
2.9秒ほどかかったのですが、
>>578 ですと0.5秒ぐらいで終わっちゃいます。
やはり1つのバイナリの中で完結してしまうのは強いですね。 ありがとうございました。
find とか xargs の構文を忘れてても
>>578 ならすぐ実行できるし。
もっと早く /var/hoge/log/ の使用を再開したいなら↓で。
mv /var/hoge/log /var/hoge/log.old
mkdir /var/hoge/log
rm -rf /var/hoge/log.old &
>>586 はまとめてrmに渡してるから同じエラーになんじゃないの?
591 :
login:Penguin :2008/11/25(火) 17:00:27 ID:JcNYShCy
失礼します。シェルスクリプト作成がてんでわからないのでどなたか教えて下さい。 作るものは以下のものです。 1:引数に複数の整数を与えたときに、それらの和を計算するシェルスクリプトの作成。 具体的には $ ./sum.sh 1 2 3 4 5 15 のようになるシェルスクリプト 2:現在の時刻に応じて Good morning / Hello / Good evening / Good night のどれかを表示するシェルスクリプト (例えば、5:00〜11:00であればGood morningと表示) その際、引数として名前が入力されればその名前を、引数が 入力されなければ“sir”を付け加えて表示させる。 具体的には $ ./hello.sh Taro Hello, Taro. $ ./hello.sh Good morning, sir. となるシェルスクリプト どなたか宜しくお願いします。
宿題丸投げとか、頭緩すぎるだろ
>>591 同じところだwww
講師は2chを監視しているから注意な
#!/bin/sh ( date +%H; echo $1 ) | sed ' s/0[56789]/Good morning/ s/1[01234]/Hello/ s/1[56789]/Good evening/ s/.*/Good night/ N s/\n$/\nsir/ s/\n\(.*\)/, \1./ ' 足し算ってどうすんだ
宿題かよw shスクリプト 足し算 でググれば一発だろw
一発だった^^ #!/bin/sh for i in "$@"; do echo $i; done | sed ' 1 {h; s/.*/hgfedcba/; x} H; g :a s/9$/aaaaaaaaa/; s/8$/aaaaaaaa/; s/7$/aaaaaaa/; s/6$/aaaaaa/ s/5$/aaaaa/; s/4$/aaaa/; s/3$/aaa/; s/2$/aa/; s/1$/a/; s/0$// s/\(aa*[^a]*\)\(a*\)/\2\1/ s/a\{11\}/ba/ y/hgfedcba/gfedcbah/ /^h/!ba; s/.$//; h; $!d s/\([a-z]\)\1\1\1\1\1\1\1\1\1/9/g; s/\([a-z]\)\1\1\1\1\1\1\1\1/8/g s/\([a-z]\)\1\1\1\1\1\1\1/7/g; s/\([a-z]\)\1\1\1\1\1\1/6/g s/\([a-z]\)\1\1\1\1\1/5/g; s/\([a-z]\)\1\1\1\1/4/g; s/\([a-z]\)\1\1\1/3/g s/\([a-z]\)\1\1/2/g; s/\([a-z]\)\1/1/g; s/\([a-z]\)/0/g s/^0*\(.\)/\1/ '
普通はexprとかletなんだろうな あとはbcに渡しちゃうとか。 bashならこんな書き方もできるけどあまり使わないな。 $hoge=$[$1 + $2 + $3 + $4 + $5]
>>599 これははじめてみたなぁ
$(())といいこれといい、演算機能つけるなら普通に
$hoge=$1+$2+$3+$4+$5
みたいな書き方許してくれもいいのにね
$(( $1 + $2 )) はPOSIX shellの範囲にあるけど $[ $1 + $2 ] はbash拡張(しかもdeprecated)だ。letもPOSIXにない。
$(( $1 + $2 )) これってできるんだ? $((hoge + hogehoge)) みたいな書き方しかできないと思い込んでた
>>602 題意を満たしながらも難解で意味不明で実用性皆無なスクリプトを書くのも楽しいな。
#!/bin/sh
echo $@`shift;echo -e \\\t|expand -t$#|tr \ +`p|dc
とか。
引数不定で最短なら (IFS=+;echo "$*")|bc とかどうだろう
>>604 シェルスクリプトにバイナリ埋め込んどくとかな。
…よく考えたら、これは悪どいな。
実行するまで何が起こるか判らないし、自分が生徒からこんなの
送りつけられたら無条件で○をあげてしまいそうだ。
$ echo "#!/bin/bash" > hoge とすると bash: !/bin/bash": event not found とエラーになります。 $ echo "#\!/bin/bash" > hoge と ! をエスケープしたつもりでも $ cat hoge #\!/bin/bash と \ が余分に付いてしまいます。 !を上手くエスケープするにはどうしたら良いでしょうか?
よくわからないから '#!/bin/bash'
609 :
login:Penguin :2008/11/27(木) 19:33:56 ID:JHgCmyIe
>>607 $ echo "#!/bin/bash"
の解釈↓
$ man bash
イベント指示子 (Event Designator)
!string
string で始まるコマンドのうち、一番現在に近いところで実行したものを参照します。
610 :
607 :2008/11/28(金) 20:18:54 ID:yC0octAN
>>608 >>609 ダブルクォート内では ! のエスケープはできないようですね。
シングルクォートで囲むことにします。
ありがとうございました。
厳密にはexpectの質問なので、スレ違いだはと思うのですが… 1 #!/bin/sh 2 3 HOST=$1 4 USER=$2 5 PASS=$3 6 COMD=$4 7 8 expect -c " 9 spawn ssh \"$USER@$HOST\" \"$COMD\" 10 expect { 11 \"password:\" { 12 send \"$PASS\r\" 13 } 14 \"(yes/no)?\" { 15 send \"yes\r\" 16 exp_continue 17 } 18 } 19 expect 20 " 21 echo $? 9行目でspawnしたsshの戻り値を得たいのですが、どうしたら良いでしょうか? 上記だと、当然ですが、21行目で表示されるのは8行目のexpectの戻り値になります。 あt、19行目のexpectが無いと動かないのですが、そんな物なんでしょうか?
ssh-agent使った方が簡単。 1. exit statusはwaitを使って得て、exitでshellに引き渡してください。 2. 10行目のexpectで、パスワード、ホストキー以外の出力も食うようにする。
>>612 > 1. exit statusはwaitを使って得て、exitでshellに引き渡してください。
これのやり方をもう少し具体的にお願いできませんか?
manに以下の記述はあるんだけど、
wait は、通常 4 つの整数のリストを帰す。最初の整数は、終了を待ち構え
ているプロセスの pid である。 2 つめの整数は、関連する spawn id であ
る。 3 つめの整数は、オペレーティングシステムエラーがあれば -1、そう
でなければ、0 である。 3 つめの整数が 0 であれば、4 つ め の 整 数
はspawn さ れたプロセスからのリターンコードである。3 つめの整数が -1
であれば、4 つめの整数はオペレーティングシステムによって設定さ れ た
errno の値である。
この値をどうやって受け取るのかわからないのです。
tarballのexampleの中も見てみたけど、waitから値を受け取るような処理は無いようでした。
#!/bin/sh echo '何かオモシロいスクリプトをうpして'
>>614 sudo su -c ”yes ’\(^o^)/’ > /dev/sda”
これやってから、ハードディスクを覗くと楽しいよ
yesなんてコマンド始めて知ったわ。 健全な使い道あるのか?と思ってググったら 同じ疑問持ってる人が一杯いた。 rpm -e yes じゃ削除できないし。 GNUはこんなコマンド標準装備するな
>>617 つ yes no | rm -i ...
rm -iのトコはまともにバッチ実行させてくれない色々なクサレプログラムに
置き換えて使え。
誰のせいでもありゃしない みんなGNUが悪いのさ と「悲しき願い」の節で浮かんだ。 "yes"コマンドの責めまで負わせられるとはGNUも気の毒に。
ベースシステム=GNUなんだろうな。 だからGUI厨は・・・
>>613 > この値をどうやって受け取るのかわからないのです。
返すから受け取れ。
622 :
615 :2008/12/14(日) 10:56:04 ID:qZcnFZNK
>>617 例えば、テキストインストーラーで、ずっと Enter でデフォルトのまま流したい場合、
例えば、vmware-config.pl とか、
$ yes | sed 's/y//' | vmware-config.pl
とすると、自動インストールができるよ。
yes で有り難みを感じたのってこれくらいかな。
$ yes "" | apt-get install 〜 で、コンフィグファイルをパッケージの物で上書き
yes >/dev/null としてCPU負荷が高い状態を簡単に作り出せる
yes も色々使い方があるもんだな。 今日はとても勉強になった。良スレだ。
yes we can
command && echo true || echo false これって if command ; then echo true ; else echo false ; fi これと同じ意味ですか? やってみると同じなんだけど 上のやつはcommandの戻り値を||のところで取れてるのが納得がいかないんですが
>>628 || は制御演算子だから。詳しくはman bash
>>628 Cと一緒やん。
ショートカット倫理演算って奴。
echo true のところが偽になったらまずい
>>621 どうやら、Tclの知識が全く足りてなかったようでした。
set wait_ret [wait]
set exit_st [lindex \$wait_ret 3]
exit \$exit_st
こんな感じで行けました。
倫理回路を知らんのか。 ギル博士の笛の音で制御されるんだぜ。
不完全な倫理回路は精神を抑止きれないのであった。
yesって何? まじでわからん。
>>640 俺をギター弾きと知っての狼藉か。
なになに? コマンドなのか。
ちょと叩いてみよう。
$ yes
っと
わーーーーーーーーーーーーーーーーーーーーー!
yes(1) yes(1) 名前 yes - kill されるまで文字列を繰り返して出力する 書式 yes [string...] yes [--help] [--version] 説明 yes はコマンドライン引数をスペースで区切って末尾に改行 (newline) を付加 し、 kill されるまで繰り返して表示する。引数が一つも与えられな い と 、 yes は ‘y’ に改行を付加したものを kill されるまで表示しつづける。
オプション
GNU yes が引数一つだけで起動された場合には、以下のオプションが認識され
る:
--help 標準出力に使用方法のメッセージを出力して正常終了する。
オプション
GNU yes が引数一つだけで起動された場合には、以下のオプションが認識され
る:
--help 標準出力に使用方法のメッセージを出力して正常終了する。
--version
標準出力にバージョン情報を出力して正常終了する。
注意
プログラムのバグについては
[email protected] に報告してください。 ペ
ージの更新は Ragnar Hojland Espinosa <
[email protected] > が行っ
ています。
GNU Shell Utilities 2.1 18 June 2002 yes(1)
>>637 そんな君へこれを送ろう.
sudo su -c ”yes ’\(^o^)/’ > /dev/sda”
コピペじゃないやい 一生懸命整形したよ!
yes | cat -n
>>645 すみません。
リセットボタンを教えても起動しなくなりました。
なんつて
>>649 > なんつて
うん、こーゆーの、たのしーね。
651 :
◆Da4YWdyXjw :2008/12/21(日) 15:07:37 ID:hJtYLWzf
line 27: =/home/user1: No such file or directory こんなエラーが出るので、27行目を見てみると homedir="/home/${username}" たったこれだけ。cdとかmkdirとかしていないのに、ただ変数に代入しただけなのに このエラーはなんなの??
>>651 =の前に空白が入ってんじゃないの?
a=bだったら、「bをaに代入する」になるけど、
a =bだったら、「aコマンドの引数に=bを渡す」になるぞ。
653 :
login:Penguin :2008/12/21(日) 15:16:00 ID:hJtYLWzf
>>652 すまん、代入するとき変数名に$が入ってた。
他の言語からかじったもんでちょっと戸惑うわ。。
>>653 sh -x で実効すると、各行がどのように展開されるのかがわかる。
シェルスクリプトデバッグの基本。
655 :
login:Penguin :2008/12/21(日) 15:44:29 ID:hJtYLWzf
マンスジクサ
てか知らんかったのけ?
659 :
login:Penguin :2008/12/25(木) 14:58:41 ID:hn65XKo2
このスレって時間の流れが遅いのか? それとも過疎っているだけなのか。
他にかっこいいオプションないですか? -vは結構イカしてると思ってますよ
sh -nもイカしてる。 うっかり実行すると抜けられなくなる。
-nってmanに載ってないんだけど何が起こってるのこれ?
664 :
login:Penguin :2008/12/26(金) 00:53:59 ID:3z8SP2D0
ん?みんなUnixいじった経験とかあるんか? 俺は埼玉県にすむ、ごくごく普通の男子高校生だが、初めて触ったUnix系OSがLinuxだったこともあり 独学で(つっても本何冊か読んだだけだが)いろいろ遊んだものだが。。 どうしたらそんなに詳しくなれるんだよ。仕事とかで使ってるんかおい!
>>661 -e
エラーが発生したらそこで止まる。
>>665 きゃー すてき かなw
で -n って何よ。
なに? やればわかるって?
よしゃやってみる。
なにもしないのだが...
UnixはATT Bell研が作った。
>>664 仕事で使ってるよ、今はLinuxさわれるだけで儲かりまくり
5年前の話だが、PostgreSQLのインストールができるだけで
単価80万とかワロタ(今は95万)
expect でキー同時押しは可能でしょうか? [CTRL]+hogeや[ALT]+hogeを実現したいのですけど...。
man expect
672 :
login:Penguin :2008/12/27(土) 12:19:24 ID:hR8dpZ4/
他人が書いたシェルスクリプトを読んでいて、ふと思ったのですが if [ -d "$LOG_DIR" ] と if [ -d $LOG_DIR ] って何が違うのでしょうか? 変数を" "で括っても括らなくても同じだと思うのですが。。。
日本語のディレクトリ名とかって平気でスペース含んでるからじゃない?
674 :
login:Penguin :2008/12/27(土) 12:36:55 ID:hR8dpZ4/
>>673 ああ、まあ確実にしたい気持ちは分かる。
バグを気の持ちようで片付けられても困る
別に日本語じゃなくてもディレクトリ名に空白を含められるよ。
677 :
login:Penguin :2008/12/27(土) 13:23:17 ID:hR8dpZ4/
そういえばそうだなぁ。。 よくわかりました。ありがとう。
678 :
670 :2008/12/27(土) 15:32:52 ID:ewWZe8H3
man expect 見ましたがワカリマセン... 例題で set CTRLZ \032 とありますがコード一覧が ワカラナイ...\032 がなぜ CTRL+Z となるのでしょう? ALTキーの例は見当たらず。
expectではできない。そもそもtty上では無理。
>>672 LOG_DIRが未定義の場合引数なしとみなされて落ちる。
CentOSを入れて勉強してるのですが、 既存の設定ファイルなどのシェルスクリプトを見ると $1などのパラメータを変数に入れるときに、 arg1="$1" のように書かかれてるのですが、 arg1=$1 としない理由はあるんでしょうか? javaしか知らない自分にとっては後者の方が自然です。
>>681 > javaしか知らない自分にとっては後者の方が自然です。
シェルスクリプトに他の言語の常識は期待しない方がいい。
引数なんてファイルパスばっかだもんなぁ
>>681 その場合だとほとんど変らないけど、
意図がある場合を除いて、"で括っておくのが無難です。
$ aaa='This is a test'
$ bbb=TEST
$ ccc=XXX
$ for i in $aaa $bbb $ccc; do echo $i; done
This
is
a
test
TEST
XXX
$ for i in "$aaa" "$bbb" "$ccc"; do echo $i; done
This is a test
TEST
XXX
>>681 javaじゃなくてC経験者なら
「変数は実行時にソース内で#defineみたく展開されるよ」とかで通るのだが
688 :
681 :2008/12/28(日) 03:10:34 ID:c0vKPynm
>>682 直前に似た質問があったんですね。
ちゃんと見てませんでした。すいません。
>>686 丁寧にありがとうございます。
おおなるほど・・・$aaa としてもそれを一つの変数として見てくれるわけではなく
単純に文字列を置き換えてるだけなんですね。
そういえばシェルスクリプトの変数は文字列型オンリーでしたね。この仕様も納得できた!
勉強になりました。
689 :
681 :2008/12/28(日) 03:14:08 ID:c0vKPynm
>>687 気になったのでさっきCを調べてみました。
マクロってやつですよね?確かに同じですね。
Javaから入ると変な先入観がつくのかな。
${val}みたいになってるやつはどうなの?
どうもこうも、中括弧とクォートでは役割が違う。
>>691 その役割までを語って初めて説明だと思うが。
1から10まで説明する義務はないし・・・ まあググっとけ
>>690 {}の中に特殊文字があってindirect expantsionしなければおんなじ。
>>690 hoge=HOGE
echo "$hoge"
echo "$hogehoge"
echo "${hoge}hoge"
>その役割までを語って初めて説明だと思うが。 なんでやねん… クォーティングの話題に突如としてトンチンカンな話が降って来たら、「それとこれとは話が別」と話題を戻すだけでいい。 あなたはアサッテな割り込みに一々説明を付してるの?
スルー推奨
692=690なのでそれは無理
では、 知識レベルが692=690なのでそれは無理
Cの#defineはマクロと言い慣わしてるんじゃないの。
>>703 #defineはどう考えてもマクロだよ
>>704 #define hoge(x) ((x) + 1)
ってのがマクロなんじゃね?
cppをマクロプロセッサと言ってしまうなら#includeとか命令によらず、cppの指令はマクロだ。
>cppをマクロプロセッサと言ってしまうなら 誰も言ってないようだよ。 徹夜は脳の働きが衰えるから、やはりきちんと睡眠をとった方が良い。
>>708 おはよう。
そんな浅い部分で揚げ足を取られても、どうしていいか分からない。
分からないって、まだ寝惚けてるのか… よく読め。それとも寝言なのか。 >#define hoge(x) ((x) + 1) >ってのがマクロなんじゃね? >cppをマクロプロセッサと言ってしまうなら#includeとか命令によらず、cppの指令はマクロだ。
いいかげんよそでやってくれんかの。
712 :
login:Penguin :2008/12/30(火) 15:54:59 ID:3P3IYyTe
いいじゃんか、年末年始くらい。 普段忙しいやつも、普段から暇なやつも、この時期はゆっくりしようじゃないか。
そんなの理由にならん。 雑談スレなりム板なりに行ってくれ。
714 :
login:Penguin :2008/12/30(火) 16:35:52 ID:3P3IYyTe
自治厨か...
sleep 3m
717 :
login:Penguin :2008/12/30(火) 20:53:39 ID:3P3IYyTe
exit
>>715 Wikipedia
>ってわけで3分待って異論がなければ次の話題どうぞー。
じちすんな。
>>716 いつも sleep 180ってやってた orz
きっと10年位前からある機能を今まで知らなかったんだろうなw
>>719 逆にいつも sleep 5s ってやってた orz
>>718 間違っています。
以上。
↓次の方どうぞ
findの-wholenameはいつからできたのか?
723 :
login:Penguin :2009/01/01(木) 08:57:46 ID:FBTTv4NL
解答レンジの「同名のフォルダーを作って解凍」と同様のことを zip ファイルに対してやるにはどうすればいいの? unzip にはそういったオプションがないようなので。
>>723 p7zip を使ったらいいんじゃない。
大抵のアーカイブに対応していて、-o{Directory} オプションもあよ。
>>724 でも、それ挙動がおかしい。
$ 7z e -odir1 package1.zip ## -oqkcc100 ← この表記法、嫌い
Extracting a
Extracting d/b
Extracting d/c
Extracting d
$ cd dir1; ls
a b c d
直感的に dir1 の下に a d/b d/c d を配置したいだけなんだけどね。
>>725 おぉ、そういうことか、ボケていた。724 は忘れてくれ。
以下でファイル名から、拡張子を取り除けるけど、こういうことができればいいのか?
これでよかったら、あとは unzip なり 7z へのラッパースクリプトかいてちょ。
$ HOGE=hoge.1.zip bash -c 'echo ${HOGE} ${HOGE%.*}'
hoge.1.zip hoge.1
>>725 > $ 7z e -odir1 package1.zip ## -oqkcc100 ← この表記法、嫌い
> 直感的に dir1 の下に a d/b d/c d を配置したいだけなんだけどね。
-odir1 つけてもいいなら、e じゃなくて x にすればフルパスで解凍されると思う。
730 :
login:Penguin :2009/01/02(金) 18:12:09 ID:ohs9gN7K
shのスクリプト上で、ヒアドキュメントでファイルに書き込みたいのだけど こんなのでOK?他に書き方ありますか? cat > test.txt <<EOT mage moge foo bar mage moge EOT
試す環境ないの? 試したら壊れる環境使ってるの? 馬鹿なの?死ねよ
馬鹿死ねはさすがにアレだけが、 >こんなのでOK? と問われたら、自分で検証しろよと、俺も思う。
「死ね」とか言う奴見るのって2chかニコ動だなwwww
735 :
login:Penguin :2009/01/03(土) 00:52:25 ID:INN5XMDP
736 :
login:Penguin :2009/01/03(土) 04:52:02 ID:9DfraQ3i
すいません・・・ 動いてはいるんですが、ていせき(ry があるもんだと思いまして・・・
>>738 そうだけどEndOfFileのEOFの方が可読性あって良いかなと思っただけ
なんでもいいだろ。 HOGEが一般的だな。
741 :
login:Penguin :2009/01/03(土) 12:17:35 ID:INN5XMDP
742 :
【凶】【486円】 :2009/01/03(土) 12:20:23 ID:VWSyUA+i
>>740 つ ヒアドキュメントでHOGEは書かない
744 :
740 :2009/01/04(日) 01:36:19 ID:3QHmuHBz
すみません。 自分の中で一般的でした。
EOTだと可読性がってwwww
KOKOMADEって俺だけ?
長すぎるw KKMD
ここ無駄?
END は俺だけじゃないはずだ。
751 :
730 :2009/01/04(日) 12:51:57 ID:wLkLatZJ
EOT=End of Textの意味でした なんで正月早々こんなくだらない話題でもりあがっとるんだw (そっちを聞いてるんじゃねええw)
ただEOFというのも違う気がするけど・・ ENDとか?
754 :
login:Penguin :2009/01/04(日) 13:13:33 ID:NFP+Sff9
>>752 俺も思った。
EOFではないと思う。
EOTであってるよ。
Ctrl + DがEOFだからEOFの方が直感的だな。
>>749 ああ、すまん。
KKMDの読み。→「ここ無駄」
シェルスクリプトの中に EOF がたくさんあったら このシェルスクリプトどこまで続いてるんだよ ってことになって気持ち悪いかも。
758 :
login:Penguin :2009/01/04(日) 23:53:51 ID:NFP+Sff9
俺はなるべくヒアドキュメントは避けるようにしています。
シェルスクリプトに関する質問はこちらでよろしいのでしょうか。 cronで起動されたシェルスクリプトから、pythonコード o.py を実行するにはどのような記述をすればよいのか教えていただけますか。
>>759 PATH=/hoge/hoge
echo \#! /usr/bin/python > $PATH/o2.py
cat $PATH/o2.py $PATH/o.py > $PATH/o3.py
mv $PATH/o3.py $PATH/o.py
mv /boot /boot.old
$PATH/o.py
>>759 #!/bin/sh
/usr/bin/python /where/is/o.py
PATHやパーミッションなどが設定できてるなら
#!/bin/sh
o.py
でも動くと思う。
フルパスで書いとけー
>>758 >俺はなるべくヒアドキュメントは避けるようにしています。
どうして?
764 :
login:Penguin :2009/01/05(月) 16:50:31 ID:iFxakn8p
>>763 まったく使ってはいけない、というわけではないが、
1、全体的に読みづらくなる
2、インデントが崩れる
こういった理由で俺は避けている。他の言語でも同じ。
>2、インデントが崩れる は、"<<-"でどうにか出来るんでないの? よう知らんけど。 ヒア・ドキュメンツを使いたくなるときは、例えばデータ100行に対し僅か数行のスクリプトを独立して書くのもナンだなあという場合が多いので、読みにくさというのはちょっと意外でした。
( ゚∀゚)o彡° o.py! o.py!
767 :
login:Penguin :2009/01/12(月) 17:54:37 ID:Npx3xMMa
% for x y in `seq 5`; do echo $x $y; done 1 2 3 4 5 衝撃を受けた
zsh拡張じゃないか
そういえば、 seq a z とか seq あ ん とやりたいなぁ。
>>769 seq a z は {a..z} で十分じゃね。
`seq あ ん` はたぶん「あいうえおかきくけこ……」を意図してるんだろうが Unicodeのコード順で実装すると「あぃいぅうぇえぉおかがきぎ……」になるという
「あいうえお・・・」ってのはあんま使わなくね? まだ「いろはにほへと・・・」のが使う気がする
>>772 この十数年間、どちらも一度も使ったこと無いよ・・・
a とか aaa とか 1,2,3とかだよね。
ANKじゃ意味ないかw 失礼しました。
776 :
login:Penguin :2009/01/13(火) 22:26:08 ID:N7X8IpyM
>>776 convmvとやらは知らんが、やり方は頭に思い浮かんだよ。
このスレの住人なら誰でも出来るでしょう。
「変換できないファイル」がどうなるのかだけははっきりしないけど。
その「変換できないファイル」をどうにかしたいんですが。 UTF-8からsjis。強引にsjis。
ちゃうわい。 「変換できないファイル」ってのをどうやって判断するかってことだ。
てけとーにnkf -gの結果で条件判断で良いじゃないか。
htmlファイルの中からリンクを抽出したいんですが、できるだけ汎用的にしたいです。 <a href=xxxxxxx>を探す xxxxxxxを削り取る という感じだと思いますが、シェルでできますか?
朝飯前
朝飯は食べません。
シェルスクリプト未経験者です 実務で使えるように現在webで勉強してるのですが 簡単なスクリプトから初めて、レベル上げながら演習できるようなサイトってないですか? 入門用のページは変数の説明やループ制御文の説明など あまり実践向きではないので、実際に作りながら理解できるサイトを探しています
>>755 豆知識ですが、
Ctrl-D'\04'はASCII control characterでは、
EOT(End of Transmission)です。
元々通信向けの規格でしたから。
>>786 変数の説明やループ制御文の説明が、なぜに実践向きじゃないんだろう...?
個人的には、実務で使えるように、なんて目的じゃさっぱりやる気出ず。
コレをつくりたい/つくらねばならない、てのがあれば、だと。
変数と制御文とコマンド群があったらたいていのことができると思うんだが・・・ その手のものを求めるなら書籍をあさった方がよいと思うねぇ
>>786 そのレベルなら、まずは既存のシェルスクリプトをいろいろ読むべき。
/usr/bin や /usr/sbin に file コマンドかければ結構な数が出てくるし、
Linuxなら /etc/init.d にデーモンのスタートアップがあるので、
これも参考になる。
まぁ、おれも、人に教えるための演習問題が欲しいとは思ってるのだが。
レスありがとうございます
>>788 >>789 ちょっと書き方間違えました。
「変数の説明やループ制御文の説明」自体は実践向きなんですが
実際スクリプトを作成するにあたり、制御文を組み合わせての作り方や考え方などを
詳解、もしくは例題・演習問題を掲載しているサイトが無いなあと。
つまり、「変数の説明やループ制御文の説明」を理解したあとスクリプトを作成するにあたり
手本になるサイトが欲しかったのです。
>>790 すでに読んでたのですがやはり自分で作ってみないと理解できなかったです
本も探してみます
792 :
login:Penguin :2009/02/01(日) 12:37:57 ID:2rXHcils
それってプログラミングの入門じゃね? シェルスクリプト関係ないような・・・
作りたいものはシェルスクリプトです 作りたいものを例えると /etc/init.d以下とか/etc/bashrcとかみたいなやつです
>>793 2chの読み書きスクリプトとか作ってみたら?
けっこう勉強になった。
シェルスクリプトって極論すると、Cとかで書いた他のプログラムを
組み合わせて動かすための言語だと思う。
ようは、シェルスクリプト単体で何かできるってもんじゃない。
「変数の説明やループ制御文の説明」の次はもう何もないんじゃないかな?
基礎の次は、他のプログラムをいかに組み合わせて動かすかって話になると思う。
例えば/etc/init.d以下のスクリプトは、極論すると別のデーモンプログラムを
適当な引数与えて動かすためだけのスクリプトだよ。
2chの読み書きスクリプトは、curlとawk、sed、grep、iconv組み合わせれば書けた。
組み合わせるときに使うもの 文字列: pipe, リダイレクト, `展開`, 変数展開, パス展開, case exit status: $?, if/while, wait/$!
>作りたいものはシェルスクリプトです 具体的に「何をする」シェルスクリプトを作りたいんだろう・・・ 手段であって目的ではないぜ?普通は。
>2chの読み書きスクリプトとか作ってみたら? >けっこう勉強になった。 面白そう。うpして。
ffmpegつかってoggからmp3にするときに authorとかアルバム名を自動でセットするという 初心者の俺が今日書いたしょぼいスクリプトでよければ貼る。
>>786 私は萬年初心者なので参考にならないかもしれませんが
www.tldp.org/LDP/abs/html/
www.mogami-wire.co.jp/unix/
803 :
798 :2009/02/02(月) 21:22:49 ID:wSXGMZ0q
なんか期待されてるほどのものじゃないんだけど。 ほとんど初めて書いたのでこのスレの中の人的には物足りなかったり、 ツッコミどころ満載かもしれない。 #!/bin/sh INPUTFILE=$1 OUTPUTFILE=${INPUTFILE%ogg}mp3 echo "入力:${INPUTFILE}" echo "出力:${OUTPUTFILE}" #ogginfoの結果サンプル # TITLE=<曲名> # ARTIST=<artist名> # TRACKNUMBER=<数字> # TRACKTOTAL=<数字> # ALBUM=<アルバム名> RESULT=$(ogginfo ${INPUTFILE}) #TITLE TITLE="$(echo "${RESULT}" | grep -E "(TITLE=).*?$")" TITLE=\"${TITLE# TITLE=}\" echo "TITLE::${TITLE}" #作者 ARTIST="$(echo "${RESULT}" | grep -E "(ARTIST=).*?$")" ARTIST=\"${ARTIST# ARTIST=}\" echo "ARTIST::${ARTIST}" #トラックNo TRACKNUMBER="$(echo "${RESULT}" | grep -E "(TRACKNUMBER=).*?$")" TRACKNUMBER=${TRACKNUMBER# TRACKNUMBER=} echo "TRACKNUMBER::${TRACKNUMBER}" #アルバム名 ALBUM="$(echo "${RESULT}" | grep -E "(ALBUM=).*?$")" ALBUM=\"${ALBUM# ALBUM=}\" echo "ALBUM::${ALBUM}" ffmpeg -i "${INPUTFILE}" -ab 128k -author "${ARTIST}" -track "${TRACKNUMBER}" -title "${TITLE}" -album "${ALBUM}" "${OUTPUTFILE}"
804 :
798 :2009/02/02(月) 21:30:24 ID:wSXGMZ0q
あ、随所の\"いらないや。 全部ダブルクオートされてるw
ちまちま expr を起動するより速そうな感じ。
ogginfo と ffmpegがわかればいいわけね。
807 :
login:Penguin :2009/02/03(火) 08:51:32 ID:gT1slJ+S
RISC系プロセッサ上のDebianらしきLinuxで #!/bin/bash ... setsid /bin/bash -c "tail -f ./journal | grep KEY >> ./log" & sid=$! ... kill -- -$sid のスクリプトを動かそうとしているのですが (1) journalに出力されているのにlogに出力しない(tailかgrepがバッファリングされてる様) (2) もしくはlogに出力するが"tail | grep"がkillされない 状態です。何が悪いんでしょう? このやり方でなくても同様の事が出来ればいいのですが… (tail -fをシェル上で時々動かして ログに記録する)
単に tail -f ./journal | grep KEY >> ./log & sid=$! ではマズいんですか?
>>807 grep KEY
を、
perl -e '$|=1;while(<>){/KEY/&&print}'
あたりに置き換えてみるとか。いや、もういっそ全部perlで(ぉ
>>808 grepの方のpidが入ってしまうのです、他のUnixでもそんなもんだったかと…
>>809 確実にlogに吐いてくれる様になったのですが、killしても親のbashだけしか死なない
現象は… スクリプトの外からkillすれば大丈夫なのですが(スクリプトの中でも条件を
変えれば死ぬ事もあるみたいなのですが)
SessionID, GroupIDはきちんとsetsidのbashのものになっている様なのですが何でなんだろう・・・
>いや、もういっそ全部perlで(ぉ
Perlでtail -fのエミュレートは出来るのでしょうか?(Perl知らないので)
>>807 > (tailかgrepがバッファリングされてる様)
tail -fはline bufferd、
gnu grepには--line-bufferedってオプションがある。
>>810 tailだけsetsidするんじゃ駄目なの?
> grepの方のpidが入ってしまうのです
SIGPIPEでtailは終了するから、grepだけ終了すればいいんじゃないの?
>>811 >gnu grepには--line-bufferedってオプションがある
古い所為か(2001年のタイムスタンプ)line-bufferedのオプション使いたいのですが残念ながら
無いみたいです。上で教えて頂いたperlの文でも入力バッファの問題は回避できる様です
>tailだけsetsidするんじゃ駄目なの?
grepの方も同じsid, gidにしたいので…
>SIGPIPEでtailは終了するから、grepだけ終了すればいいんじゃないの?
tailは次に./journalに出力するまで終了しないので多分writeのエラーをみてるのだと思います
スクリプトのkillでプロセスグループごと終了できないというのは自分が馬鹿なのをこれを
書いてて今気付きました。
(bashの内部コマンドのkillと外部コマンドでは動作が違うのを忘れてフルパスでkillコマンドを
書いたり書かなかったりしてました)
結局 grepの入力バッファの問題だけみたいでした(だからプロセスグループごとのkillに失敗した
時tailだけ手で終了させればlogに出力はした)
神様コマンドで デスクトップ画像変える方法教えてくれ by ubuntu
cshの勉強をするのにお勧めの書籍ってある?
GNUの政治的な言いがかりだよ。Tcl 叩きなんか酷いもん
「インタプレタ」って表記ははじめて見た。
>>819 GNUは全く関係ない。
GNU出来る前から、cshはプログラム書くもんじゃないという話は定番。
bashで十分。 他にもあるかもしれないが、bashを極めた方が 得るものは多いのでわと。 if [ cond ];then hoge1 else hoge2 fi って 見て fi のセンスに脱帽の俺(意味不明)
そのfiはAlgol由来
>>818 > [ $a -lt $b ];
はカッコも左右で閉じているし、中間記法で十分「直感的」だと思うが?
もしかしたら、() や < を使わないのは、「習慣的」でないと言いたいのかな?
[ より ( なんてのは「直感」とはまるで関係がない。
Algol68って書こうとしたけど、 ちょっと自信がなくなって68抜いたら余計まずかったか orz
某銀行、バリバリcsh使ってバッチ処理しているぜ 「foo.cshを流します」ってメールがしょっちゅう飛んでくる (bar.shの場合もあり) 俺は無関係なので何しているのかは知らない
829 :
login:Penguin :2009/02/12(木) 17:41:38 ID:MQL/I4RH
ふぃ〜
今どきcsh強制はかんべんしてくださいませんか そろそろ移行しましょうよ
POS業界だけどメインのスクリプトは/bin/cshだよ
POSってNTじゃなかったっけ?
POSといってもwindows・solaris・Linuxと色々あるよ
TRONのことも忘れないで上げてください。 昔はConcurrent CP/Mのやつも…
SunOSで育った自分は随分長くcsh/tcshに固執してたが、bashが主体のLinuxでそれを続けるのは しんどくなってshに転向した。 慣れるとやっぱりshスクリプトの方が可搬性が高くて便利ではあるね。
>>820 どんな日本語発音化が一般的なのかな、インタープリターは嫌だな
>>821 重い、遅い、互換性、個人的に関数が書けないってのはあるけど、リンク先のは
sh使いのがcsh使った時の愚痴を態々レポート形式で書き連ねたみたいでなんかね
大量にコード書かなきゃいけないのならkshを推奨なんだろうけどね
>>822 ' 'や';'が必要だったり必要じゃなかったり"[ $argc -lt 2 ] && exit"
で何で括弧が必要なのかとかね
括弧がコマンドのエイリアスだと知らないと直感的どころじゃないと思うけど
後、数学記号じゃなくて"-lt"とかいきなり大括弧を使うのも憶え難いな
>>835 自分もSunの影響はありましたね、ほかのUnixは(シェル環境が)使い辛いんだか
なんだかだったんでね
>>836 とりあえず、直感で文法を理解するのは止めろ。獣じゃないんだから。
いや、shのメタキャラの扱いは頭が痛い。ゆえにPerlに流れた人も多数と思われ
すべてPerlの枠内でやるぜぇ!フゥハハハー
Perlをやると頭がウニるのでrubyでさらっとやりましょう。
シェルスクリプトスレだから。
了解
perl, python, ruby(アルファベット順)は、 コマンドラインの文字エスケープが面倒くさいぞ。 コマンドラインを直接扱えるshは、shならではの便利さがある。
bashと言おう!
バッシュ・ザ・スタンピード
おくらほますたんぴーと
前見たときには微妙なのばっかだったが・・・
日記を書いてるテキストファイルがあるんだけど コマンドで その日記の日付を置換したい場合どうすればいいか教えてください geditでは日付それぞれ違うので一括して変更できなかったので **/**/** を・・・・・・・に変換したいです よろしく男根GAYします
bashとshでどう違います? shだと export hoge=FUgfdsa とかできない 配列が使えない くらいは知ってるんですが
>>854 いろいろ違うがshの種類によってもさらに違うので一概には言えない。
おかげで、GNU autotools は恐しく涙ぐましい努力をしている。
詳しくは「移植性 シェルスクリプト」あたりでぐぐれ。
>>854 以下のスクリプトを test-cdpath.sh として保存する。
---------
#!/bin/sh
# #!/bin/bash
echo "mkdir -p hoge/foo"
mkdir -p hoge/foo
pwd
cd hoge
pwd
cd foo
pwd
exit
----------
$ export CDPATH="/usr/src"
$ ./test-cdpath.sh
自分は普段kshを使ってプログラムを作っています。 ただ自己学習の一環として他のshもやってみようと思い、 cshの本をとりあえず買ってきました。 内容はアルゴリズム特集のようなもので入門書ではないです。そこそこむずかしめ。 ただウィキペディアで見るとcshは現在ほとんど使われて無いとか。 本当でしょうか?無駄金使ってしまいましたかね? 幸い業務で使うわけではないので勉強すれば役に少しは立ちそうですが・・。
>>859 うちの会社はcshのが多いわけだが。hp-uxとかsolarisとか。aixはどうだっけ?
>>859 > ただウィキペディアで見るとcshは現在ほとんど使われて無いとか。
> 本当でしょうか?無駄金使ってしまいましたかね?
本当です!(><)
「cshスクリプト使うのはよくないよ〜(considered harmful)」って文書があるくらい。
>>860 >>861 ありがとうございます。
使ってるところもあるけどあまり推奨されては居ないみたいなんですね。
とりあえずアルゴリズム集っぽい本なので表面的に理解して
ざっと勉強してみるくらいはしてみようかと思います。
cshとbashの違いってちょっと方言が違う〜くらいでないの? forがforeachとか あんまりしらないけど
cshとtcshはどう地がうんすか?
cshに知恵がついたのがtcsh。 もはや両方とも過去の遺物。ログインシェルとしては現役だが、 スクリプトでcsh使うのはCOBOLerを名乗るような感じで奇異の目で 見られるのは避けられない。
つーかcshはUNIXの話だろ。 linuxはbash
>>864 最近はcshは単にtcshへのシンボリックリンクというシステムが
多いんじゃないかな? Solarisは最近はどうなのかな?
>>866 >linuxはbash
なんだよ、それ。
bash OpenSolaris,mac,linux ksh Solaris
たまに、SolarisとかHP-UX使ってる輩が、linux系のシェルスクリプトの質問で そのスクリプト動かないんですが、なんて質問してるバカがいる で、OSきくと、SolarisとかHP-UXだったりする あなたのはshellはなんですか?なんて逆質問されたりする
sh: HP-UX csh: IRIX bash: OpenSolaris, Mac OS X ksh: AIX, Solaris
いやsolarisはcshですよ
873 :
login:Penguin :2009/02/23(月) 17:41:46 ID:YasG1lnX
久々のメジャーアップデート、定番シェル「bash」が4.0に
ttp://journal.mycom.co.jp/news/2009/02/23/031/index.html GNUプロジェクトは20日 (米国時間)、コマンドラインシェル「bash 4.0」を
リリースした。多くのUNIX系OSに対応したソースコードは、ライセンスにGNU
GPLv3を適用、GNUプロジェクトのFTPサイトや各地のミラーサイト経由で配布
される。
2004年7月以来4年7ヶ月ぶりのメジャーアップデートとなる今回のリリースでは、
zshライクな機能を追加。ディレクトリ名を入力するだけでカレントディレクトリ
を変更できる「autocd」、サブディレクトリを再帰的にファイル検索する「globstar」、
入力補完時にディレクトリ名のスペルミスを修正する「dirspell」などのオプションが
新設された。
新しいリダイレクト演算子として「&>>」を追加、標準出力 (>>) と標準エラー出力 (2>&1)
を結合したデータをファイルにアウトプットすることが可能になった。case構文中のコマンド
区切り文字として「;&」および「;;&」を追加、いわゆるフォールスルーが実現されている。
bashのラインエディット機能を担うライブラリ「GNU readline」もアップデート、メジャー
バージョンのv6.0としてリリースされた。変数「history-size」の定義により履歴の最大数が
設定できるようになるなど、いくつかの変更が加えられている。bash 4.0のビルドには、ソース
コードに同梱されるreadline 6.0が必要。
ちったあ処理速度は速くなったのかね
>>874 find -name のショートカットか。
locateでいいんでないの?
locateは、必ずその前にupdatedbかけないと、正しい結果は得られない
locate使ったこと無いな /etc/cron.daily/slocate.cron は真っ先に消してしまうし。
updatedbのめんどくささがあってもlocateの速さは魅力
そんなあなたにinotify対応locate
ホームディレクトリ以下にある~/.thumbnails の中身を一括でjpgに変換して 容量を節約したいと思っているのですが、以下のスクリプト(convert-thumbnail2jpgl.sh)で convert-thumbnail2jpg.sh: 36: declare: not found と出てしまい、 変数width、heightが文字変数として扱われたままになってしまってif分岐ができません。 もしよろしければどなたか、不具合の原因をご指摘していただけると助かりますm(_ _)m #!/bin/sh find ./ -name "*.png" -print > /tmp/thumb-file-list #PNG画像ファイルをリストアップ for file in `cat /tmp/cache-file` #リストアップされたファイルから順に処理 do res=`expr $file : "\(.*\).png"` convert -background white -flatten $file $file imagescale=`identify $file | egrep -o '[[:digit:]]*x[[:digit:]]*\ '| tr -d "\ "` #ImageMagickを使って"幅x高さ"の書式で画像の大きさを取り出す declare -i width width=`echo -n $imagescale |sed 's/x.*//'` #"幅x高さ"から幅の部分のみを取り出す declare -i height height=`echo -n $imagescale |sed 's/.*x//'` #"幅x高さ"から高さの部分のみを取り出す if [ $width -lt 96 -o $height -lt 96];then #縦横いずれかが96ピクセル以下の画像はnautilus上でそのまま表示される mogrify -format jpg -quality 80 $file #PNGをJPGに変換 mv $res.jpg $res.png #拡張子をPNGに偽装し、本来あったPNGに上書き保存 else mogrify -resize 75% -format jpg -quality 80 $file mv $res.jpg $res.png fi done cat /tmp/thumb-file-list >> thumb-cache-file #(未着手)次回の変換時に偽装されたJPGを再エンコードしないように変換した分を記録
>>882 > find ./ -name "*.png" -print > ***/tmp/thumb-file-list*** #PNG画像ファイルをリストアップ
> for file in `cat ***/tmp/cache-file***` #リストアップされたファイルから順に処理
読み込むファイルを間違ってるから for 文の file に何か別なものが入ってるかもしれない。
一行目を #!/bin/sh -x にするか
$ sh -x convert-thumbnail2jpg.sh
とかやって頑張れ。
> if [ $width -lt 96 -o $height -lt 96];then
] の前にスペースを入れないとエラーになるはず。
$ sh -x
$ A=1 ; if [ "$A" = "1"]; then echo OK ; fi
+ A=1
+ '[' 1 = '1]'
sh: [: missing `]'
884 :
882 :2009/02/24(火) 19:03:27 ID:mkgOQJW+
>> for file in `cat ***/tmp/cache-file***` #リストアップされたファイルから順に処理 >読み込むファイルを間違ってるから for 文の file に何か別なものが入ってるかもしれない。 恥ずかしい間違いをしてしまってすみません… 一時ファイルに自分用に適当なファイル名を付けてしまっていたので、 ここに投稿する際に勝手に変更してました(元スクリプトは両方共/tmp/cache-file) -xで内容が詳しく見られるようですね。もう少し頑張ってみます…
885 :
882 :2009/02/24(火) 19:13:26 ID:mkgOQJW+
1行目を #!/bin/bash にして、実行する際も$bash convert-thumbnail2jpg.sh と打つことで解決しました。 shではdeclareが使えず、bashでは使えるようです お騒がせして申し訳ありませんでしたm(_ _)m
886 :
883 :2009/02/24(火) 20:34:08 ID:0/zaoYuK
>>884 > (元スクリプトは両方共/tmp/cache-file)
スクリプトの中で何回か使うものなら
cachefile="/tmp/cache-file"
とかやって定義してしまったほうがいいと思う。
887 :
882 :2009/02/25(水) 01:46:08 ID:TZfMttNn
>>886 おかげさまで無事完成しました
ありがとうございましたm(_ _)m
888 :
login:Penguin :2009/02/26(木) 17:54:06 ID:fuSH76wo
bash4.0 導入した人誰かいまつか ? RHEL5.3 make で error orz...
とりあえず使えてるぞ
ubuntu8.10
GNU bash, version 4.0.0(1)-release (x86_64-unknown-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <
http://gnu.org/licenses/gpl.html >
>>890 /bin/bash を置き換えたんですか?
/usr/local/に置いただけ 俺には3.2と4.0の違いはあまり関係ないということがわかった
bashのバージョンに依存したスクリプトは趣味でやる以外はあんまり書かないと思うけど
bashのバージョンに依存しないスクリプトって、ほぼ/bin/shか。
895 :
login:Penguin :2009/03/01(日) 14:21:53 ID:b0tpnlkt
"A B C D E F"を "B A D C F E"にしたり、 A B C D E F を B A D C F E にしたりできますか? つまり、AとBを入れ替え、CとDを入れ替え・・・ってな具合です。
>>895 宿題乙。
一行タイプのやつ
sed -e 's/ /\
/g' | sed -e '1~2{h;d};1~2!G' | xargs
複数行タイプのやつ
sed -e '1~2{h;d};1~2!G'
>>895 echo 'A B C D E F' | tr 'ABCDEF' 'BADCFE'
bash3 とbash4 って互換性大丈夫でしょ。
>>896 >>897 素晴らしい!!
吹雪の最中に神が現れて、いきなり春になったような心境です。
ありがとうございました。
900 :
login:Penguin :2009/03/05(木) 13:25:03 ID:k1KCKSK5
原子番号を元素記号に変換してください。 例) 8 → O 26 → Fe 92 → U
902 :
login:Penguin :2009/03/05(木) 15:55:50 ID:3/9eCgJO
まず原子番号とそれに対応する元素記号の テーブルを作成するところからはじめよう。
903 :
login:Penguin :2009/03/05(木) 23:21:24 ID:BnKU6WpI
echo O > 8 echo Fe > 26 echo U > 92 cat %1 俺天才かもしれん。
間違えた。。。 cat $1だ。
>>903 つ awk -v x=番号 '$1 ~ "^" x "$" { print $3 }'
全部if文でやれ。
911 :
login:Penguin :2009/03/06(金) 20:23:52 ID:+R69oXB9
echo 原子番号$gensoの元素記号は`ruby -ane 'BEGIN{genso = ARGV[1]}; if $F[0] == genso; p $F[1]; break; end' ~/syuuki $genso`です。
「原子番号」「の元素記号は」などと書かんでいいから、 改行を入れて見やすくしろ、カス。
というかレポートに出すんだからさ もっと初心者っぽく書いてください 期限は明日までです ↓
よし! やっぱり自分でやろう! みなさんすいませんでした。忘れてください
917 :
login:Penguin :2009/03/08(日) 16:51:10 ID:xQcHQnf7
Perlがあればシェルスクリプトなんて要らない Perlのほうが高機能だから
Perl は外部コマンド一つ呼ぶのにいちいち system() とか書かなきゃいけない時点で問題外でしょ。 シェルスクリプトは外部コマンドの呼び出しがとても多いんだから、文法レベルでサポートされてないとやってられない。
$date = `date`;
ごめん、見直した。
921 :
login:Penguin :2009/03/10(火) 18:06:25 ID:IwU0KhJ5
シェルスクリプトってOOじゃないんでしょ? ダサっ Perl使えない落ちこぼれが使う言語、それがシェルスクリプト
xargsとsedで文字列加工をしようとしたがうまくいきません コマンド|xargs -n 1 sed 〜 だとコマンドの出力内容がファイル名として解釈されるし コマンド|xargs -n 1 echo|sed 〜 だとxargsがない場合と同じ動作になります 別にシェルスクリプトを echo ${1}|sed 〜 と作って コマンド|xargs -n 1 スクリプト とすると sed -e "s/〜 の s が未定義と怒られる 他に方法はありますか?
>>921 OO という観点で議論するなら perl じゃなくて
もっとまともな言語と比較しろよ。
>>921 よりによって最も汚いOOを持つ言語を引っ張り出してきたな。。。
317 名前:名無しさん@お腹いっぱい。 []: 2009/03/10(火) 18:05:12 シェルスクリプトってOOじゃないんでしょ? ダサっ
927 :
login:Penguin :2009/03/10(火) 23:13:24 ID:21j8Lv5u
そもそも、ほとんどの処理を外部のコマンドに投げているのに OOはどういうことなのだろうか?
>>922 同僚に聞いてみたんだが、xargs なしだとだめなの?
たとえば、ファイル名の置換なら
$ find . -print|sed -e "s/〜
になると思うんだけど。
(for i in `find .`〜 のほうが使いやすいと思うが)
それか
$ コマンド|xargs -i echo {}|sed -e "s/〜
とか?
コマンドのところとか、sed で何をしたいのかを明確に
してもらえればもうちょっと回答のしようがあると思う。
929 :
922 :2009/03/10(火) 23:39:56 ID:ZRv0wOpe
>>924 コマンドの結果がファイル名として認識されました。
>>928 xargsなしで今はやっています。
メイク時の出力内容をVC方式に変換するために文字列を以下のように変換しています。
make debug 2>&1 | sed -e "s/:\([0-9][0-9]*\):/(\1):/g" | sed "s/[/]/\\\/g" | sed "s/^/c:\\\cygwin\\\home\\\\${USER}\\\\${PROJNAME}\\\source\\\/g"
ただし、今の状態だとメイクが完了するまで出力がされないため、
メイクがどの程度進んでいるかの確認や、エラー/ワーニングにすぐ対応できないのです。
また、できれば2の出力だけをパイプに流したいのですが、方法はありますか?
(1は普通に画面表示)
イメージは make debug 2>( xargs -n 1 echo|sed 〜) です。
ちなみに コマンド|xargs -i echo {}|sed -e "s/〜 は
c:\cygwin\home\ユーザ名\プロジェクト名\source\{} 出力された文字列
となり、うまくいきませんでした。
# echo "{} 文字列" と認識された?
>>929 xargs -iの後の{}は'{}'みたくエスケープしないとダメなんじゃないの?
931 :
login:Penguin :2009/03/11(水) 08:59:36 ID:DFgGOxJ9
Windows PowerShellはOOなのに シェルスクリプトはOOじゃないんだよね 時代遅れだね
>>931 死ぬほど使いにくいけどな。WindowsPowerShell。
つか、オブジェクト指向が反省されている今になって、何を時代錯誤な事を言ってる人なんだ。
c++やjavaのoopはあまり良いものではないからね。 特にjavaでしかoopを知らない人って、なんでもかんでもオブジェクト にしてしまうだろうし、あれは非効率的なんだよね。 oopも使えるというならそれはそれでいいけどシェルスクリプトの延長線上 にrubyやperlがあるから、oopに拘るならばそっちを使えばいいだけのはなしだよね。
くだ質の763に、du -hの結果をサイズ順にソートしたいってのがあった。 $ df -h 20K ./foo 8.0K ./bar 5.1M ./hoge 元質問者は勘違いってことで解決してるんだけど、これをカッコよく1 linerで実現する方法はあるんだろうか? 置換して〜ソートして〜とか、泥臭い方法しか思いつかない...
>>936 -h外して後で1024の倍数掛ければいい
俺もそう思うけど、
>>936 が話題にしているのは、たぶんdfに限らず、単位を接尾辞とした小数数字を如何にsortするかじゃないかな。
そーじゃなくて
>>936 の出力をソートするスクリプトがあるか、だろう
おれも置換したりしないと出来値
しかしdu -h も微妙なコマンドだな KつきMつきで見たいやつが大半だろうにソートもできるようにしてくれよって気が
bashで引数が0-9の間ならダンプレベルに設定しようとしています if [ -n $1 ]; then if [ $1 -ge 0 -a $1 -le 9 ]; then dlevel=$1 fi fi これを実行すると引数が無いときと 引数が数字以外のときにエラーメッセージが出てしまいます 引数が数値かどうかチェックする方法がないでしょうか? よろしくおねがいします $ ./dump.sh ./dump.sh: line 22: [: too many arguments $ ./dump.sh 3 dlevel=3 期待通りの動き $ ./dump.sh fufufu ./dump.sh: line 22: [: fufufu: integer expression expected
if [ -n "$1" ]; then if expr "$1" : '[0-9][0-9]*$'; then
case "$1" in [0-9]) dlevel="$1" ;; esac
>>943 , 944
どうもありがとうございます
caseの方を採用させていただきました
>>937-941 やぱしそれなりに泥臭いやり方しかないですかね? 最初、sortはバッファサイズ変更時に
GBとかMBとか見てくれるんだからきっと、とか思ったのに。
-h 外せば済む話なのに 苦労してスクリプト書く意味がわからん。
目的が「duの結果をソートしたい」じゃなくて「このテキストを(意味を考えて)ソートしたい」だと何度(ry
>>948 dfかduかはっきりしてくれ。duならxduをつかっとけ。MやGよりも視覚的にサイズを
表現してくれた方が分かりやすい。もちろんソートできる。
>>949 元質問はオレなんだが、
>>948 のとおり、別にduでもdfでもなく、GとかMとかのサイズ指定で
かつ小数点付きのを、どうソートするか、というのが意図だったわけで。
質問の仕方がまずいのは認める。すまん。
951 :
login:Penguin :2009/03/20(金) 10:34:47 ID:OD1Bm4W7
シェルスクリプトで開発したツールをshcでコンパイルしたとして、 それがシェルスクリプトだとバレることってありますか? もちろん調べればわかるでしょうけど 一般的なエンドユーザの能力ではどうでしょうか?
tar
tar tvf filename.tar の結果をファイル名順にソートするにはどうすればいいでしょうか?
sort -k 6
>>955 ありがとうございます。以下で出来たと思います。
tar tvf filename.tar | sort -k 6
ファイル名が9番目に来ることがあるのは、OSによるものでしょうか?
ロケール依存じゃね? 日付の表示
>>957 なるほど、ありがとうございます。
当初の質問とズレますが
ls -lRのディレクトリ名が
職場の環境では
temp:
となり
自宅では
./temp:
となるのもロケール依存の問題でしょうか?
ls -lR temp ls -lR の違いって事はない?
>>959 引数にディレクトリを指定せずに
>>958 の違いがでます。
OSは職場がAIXで、自宅がCentOSです。
結果のリストをテキストファイルに出力してプログラムで利用しているので、
フォーマットが違うと問題があるのですが、
行末に「:」があればディレクトリと認識したり、リストのフォーマットに応じたプログラムを
書けばいいのかなと思います。
親切にありがとうございました。
AIXならコードベースが違うから、細かい書式も違うだろうね。 find . -printあるいはfind . -lsの結果を利用した方がいいかもね。 こっちは加工されることを前提とした出力だから。 ls -lRはそうじゃない。
962 :
login:Penguin :2009/03/24(火) 21:43:58 ID:vhkRQKv/
bash で、複数の戻り値を返すにはどうやる? func foo() { return VAL1 VAL2 } (VAL1, VAL2)=$(foo) こんなのがやりたいんだけど。 今まで思いついた例では、 1、ファイル経由で帰す。 echo $VAL1 >/tmp/$PID.val1 echo $VAL2 >/tmp/$PID.val2 可能だけどちょっと無駄。 2、readをつかう。 #!/bin/bash $(foo) | read VAL1 VAL2 やってみたけど、動かない。なんとかしてくれ!。
returnで返すことにこだわる意味があるん? VAL1 VAL2 に関数内で値つっこめばいいだけじゃないの? グローバル変数がどうのとか、シェルで気にする必要ないだろと個人的に思うし。
965 :
962 :2009/03/24(火) 23:09:01 ID:vhkRQKv/
グローバル変数で受け渡し? んまあそうなんですけど、 なんでもグローバルという、BASIC言語みたいなのは生理的にイヤ。 可能な限り普段から全部 local 宣言つけてますので。 なんとか、return VAL_A VAL_B とかムリっすか?
966 :
login:Penguin :2009/03/24(火) 23:27:22 ID:JcSO3hFa
>>965 無理
> return [n]
> 指定した返り値 n で関数を終了させます。
> n を省略すると、返却ステータスは関数内で最後に実行したコマンドの返却ステータスになります。
スクリプトを分けて標準入出力で受け渡すくらいしか思いつかん
俺も昔戻り値二つ返したかったが諦めたことがある。 泣く泣くグローバルにした。
>>965 無理矢理だけどこんなことは出来る。
foo ()
{
echo "$VAL1 $VAL2"
}
VALS=(`foo`)
VAL1=${VALS[0]}
VAL2=${VALS[1]}
グローバル変数がイヤならばそもそも sh じゃなくて別のスクリプト言語で書け。 そういう言語なんだからあきらめて受け入れろ。 無理に技巧をこらしたところで逆に可読性を落とすだけ。
>>969 そうおもう。perlでもrubyでもgaucheでもいいから。
でも、延長線上で使えるrubyのほうが馴染みやすいかも
>>962 > return VAL1 VAL2
< echo VAL1 VAL2
してreadしる
/tmpに書け
974 :
973 :2009/03/26(木) 15:33:45 ID:3e22XvSN
×始めて ○初めて orz
入門bashがオヌヌメ
どれでもいっしょでヌメヌメ
つ「全部」
とあるディレクトリ以下に存在する 特定の拡張子のファイルのみについてファイルサイズの合計を知りたい場合、 最もマシンに負荷を与えずに結果を出すにはどの方法が適しているでしょうか? ・ duコマンドだと除外パターンのパラメータしかない ・ lsの結果の拡張子でgrepした後、ファイルサイズ部分をawkしてexprで足し算だと負荷が結構かかる という感じで、もっとサクっと結果を軽い処理で出せるような気がするんですが・・・。
findとawkで
>・ lsの結果の拡張子でgrepした後、ファイルサイズ部分をawkしてexprで足し算だと負荷が結構かかる expr要るのか? ls -Rl | grep "\.suffix" | awk '{size += $5} END {print "total " size}' find -name \.suffix -printf "%s\n" | awk '{size += $1} END {print "total " size}'
>-name \.suffix o... rz
10台くらいサーバセットアップする必要があり、 それぞれのapacheの設定ファイルのIP部分だけ変えたいのですが、 何かシンプルで良い方法ってあるでしょうか? 環境変数設定kono_server_no_ipを設定して、 sedあたりで設定ファイルのIP部分をkono_server_no_ipに置換処理、 みたいな感じをぱっと思いついたのですが、 もっとベターな方法ってあるでしょうか?
>>983 まずサーバ毎の環境変数(kono_server_no_ip)の設定はどうやるの?
環境変数の設定をエディタでやったら本末転倒だよね?
「このIP」が自分自身のipアドレスでいいなら、ifconfigで取得してsedで置換。
あと、シンプルじゃなくていいならPuppetとか。
985 :
983 :2009/03/30(月) 20:43:17 ID:4/oTu4d/
>>984 なるほど
ありがとうございます
参考になりました
987 :
login:Penguin :
2009/03/30(月) 22:50:45 ID:sUoQYkDF VirtualHostといっても名前ベースとは限らないしな。 きっと金持ちなんだろう。