2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【貝】第1回シェル講座【殻】

1 :いいちこ:02/03/17 22:46
第1回シェル講座はじまるよ。
みんないいかい?

#!/bin/sh
echo 'Hello World'

これを実行すると
Hello World
って表示されるんだ。
OK?

2 :名無しさん@お腹いっぱい。:02/03/17 23:00
>>1 は氏ね

3 :名無しさん@XEmacs:02/03/17 23:01
3げっとおおおおお

4 :名無しさん@お腹いっぱい。:02/03/17 23:02
>>1
Linux 板でやれ。

5 :名無しさん@お腹いっぱい。:02/03/17 23:02
>>3>>1 と一緒に氏んでやれ

6 :名無しさん@お腹いっぱい。:02/03/17 23:03
>>1は氏ね。

講座、なんて仰々しく構えるんだったら、
まず、1行目の解説から入れ。
ここを「おまじない」とか言い出したら、コロス!

7 :名無しさん@Emacs:02/03/17 23:05
#!/usr/bin/cat
>>1は氏ね

これを実行すると
>>1は氏ね
って表示されるんだ。
OK?

8 :名無しさん@お腹いっぱい。:02/03/17 23:16
>>7
/usr/bin にcatって……どんなシステム?

9 :名無しでGO!:02/03/17 23:20
>>7
$ ./sine
#!/usr/bin/cat
>>1は氏ね
$

と表示されたぞ?
OK?

10 :いいちこ:02/03/17 23:20
皆応援ありがとう☆
じゃ次ね。
条件分岐だよ☆
ifってやつを使うんだ。
凄いよね☆

#!/bin/sh
if true
then
echo 'return value = 0'
else
echo 'return value = 1'
fi

これを実行してみよう。
きっと
return value = 0
って表示されるよ。
詳しい説明は他の人に任せるからね☆
じゃ今日はこのくらいで。。。
また明日ね☆
じゃ(o^-')b

11 :名無しさん@お腹いっぱい。:02/03/17 23:22
秀吉スクリプトか?これは。


12 :名無しさん@お腹いっぱい。:02/03/17 23:26
>>10
>詳しい説明は他の人に任せるからね☆
講座って言うぐらいなら任せるなよ(藁

13 :名無しさん@お腹いっぱい。:02/03/17 23:28
>>7
$ sh ./sine
$ls
-rw-r--r-- 1 hoge hoge 0 Mar 17 23:22 1は氏ね
と表示されたぞ?
OK?


14 :名無しさん@お腹いっぱい。:02/03/17 23:31
>>8
Solaris で PATH=...:/usr/bin:/bin:... とかやってるヤシはアフォだな

15 :名無しさん@お腹いっぱい。:02/03/18 12:09
シェルってどんな感じで使ってるの?

16 :名無しさん@お腹いっぱい。:02/03/18 12:40
私はもっぱら出光ですが

17 :名無しさん@お腹いっぱい。:02/03/18 15:16
>>15
いい感じで使ってます。

18 :名無しさん@お腹いっぱい。:02/03/18 15:16
ガソリソかよ

19 :名無しさん@お腹いっぱい。:02/03/18 15:37
出光かよ

20 :名無しさん@お腹いっぱい。:02/03/18 16:37
>>1 俺はいいちこよりも神の河(かんのこ)のほうが好きだ。


21 :いいちこ ◆TpbJGovQ :02/03/18 19:22
四則演算は、expr コマンドを使うんだよ☆
expr 7 + 13
って
やると
20
って表示されるからね☆
これで計算もOKだね☆
やったね☆

22 :名無しさん@お腹いっぱい。:02/03/18 19:28
>>21 それシェル講座ぢゃなくてコマンド講座。

23 :名無しさん@お腹いっぱい。:02/03/18 19:37
expr 7+13
とか
expr '7 + 13'
では望んだ動作をしてくれないという罠。

24 :名無しさん@お腹いっぱい。:02/03/18 20:03
ド素人の私には良い勉強になります。
頑張ってください。

25 :名無しさん@お腹いっぱい。:02/03/18 20:11
システムコールを知るにはシェルを作るのが一番だよ。

BSDマガジィィィィィィン!逝かないでくれぇぇぇぇぇぇ

26 :いいちこ ◆TpbJGovQ :02/03/18 20:17
>>24
ありがとう☆
あたしも素人だよ☆
だからお互い頑張っていこうね☆
じゃ次ね☆

cd /usr/bin
ls * | xargs -l file | grep shell

これでシェルスクリプトのファイルが抽出出来るんだよ☆
凄いと思わない???

27 :名無しさん@お腹いっぱい。:02/03/18 20:31
>>26
cd /usr/bin
file * | grep shell

で一発で出るよ。
わざわざ ls と xargs かます必要ない。

28 :いいちこ ◆TpbJGovQ :02/03/18 20:35
>>27
そうなんだ★
ありがとうね☆
そういう指摘はドンドンしてね(は〜と)

29 :ファイルをSJISへ変換:02/03/18 20:42
#!/bin/sh
while [ "$1" != "" ]; do
if [ -f $1 ]; then
bak="$1.bak"
mv $1 $bak
nkf -Lw -s $bak > $1
fi
shift
done
exit 0

30 :名無しさん@お腹いっぱい。:02/03/18 20:47
>>29

この while は、for で書いた方が、shift が要らず、
きれいに書けると思う。

31 :29:02/03/18 20:58
>>30
どんな感じでしょうか?
よかったら、教えて下さいな。

32 :名無しさん@お腹いっぱい。:02/03/18 21:09
#!/bin/sh
for i in $@; do
 if [ -f $i ]; then
  bak=$i.bak
  mv $i $bak
  nkf -Lw -s $bak > $i
 fi
done
exit0

33 :名無しさん@お腹いっぱい。:02/03/18 21:33
−第1回シェル講座−
まずは基本から。
pid_t pid;
pid = fork();
if (pid < 0) {
  return 1;
} else if (pid > 0) {
  execv(cmd, args);
  return 1;
} else {
  retval = wait(&pid);
  return 0;
}

34 :名無しさん@お腹いっぱい。:02/03/18 21:35
kill -11 >>33

35 :名無しさん@お腹いっぱい。:02/03/18 21:40
>>32
知ってると思うけど、
for i in "$@; do
は、
for i; do
と書いても同じ。

36 :名無しさん@お腹いっぱい。:02/03/18 21:46
>>33 それシェルスクリプト講座。

37 :名無しさん@お腹いっぱい。:02/03/19 11:35
>34
激しくワロタ

38 :名無しさん@お腹いっぱい。:02/03/19 17:18
who
でログインしているユーザーを見れるよ。

39 :名無しさん@お腹いっぱい。:02/03/19 17:40
whoよりwだろ。

40 :名無しさん@お腹いっぱい。:02/03/19 19:10
(w

41 :名無しさん@お腹いっぱい。:02/03/19 19:17
>>38
それコマンド講座。
(あと、上一段活用の国語もおかしい)

>>39
whoとwでは由来がちょっと違う。

42 :いいちこ ◆TpbJGovQ :02/03/19 19:42
そろそろ変数やろうか☆
ねっ☆
シェル変数の一覧を表示するには
set
と入力してみよう☆

シェル変数を定義するには
friend=mona
みたいにやると出来るよ☆
set
って打って確認してみてね☆

friend変数を削除したければ
unset friend
でOKだぁよ☆
さぁやってみようね(は〜と)


43 :名無しさん@お腹いっぱい。:02/03/19 19:43
lastもあるでよ。

44 :名無しさん@お腹いっぱい。:02/03/19 20:38
わ、誤解していた。
ただの荒しかと思ったら、
>>33 はシェル自体のプログラミング講座だったのね。

45 :名無しさん@Emacs:02/03/19 21:19
>>33は何するスクリプト?

46 :名無しさん@お腹いっぱい。:02/03/19 23:12
>>45
シェルのコア部分だろ
# マジレスまずかったか?>all

47 :名無しさん@お腹いっぱい。:02/03/20 00:32
>46
正確にはシェルのcore部分だ。

48 :名無しさん@お腹いっぱい。:02/03/20 11:38
>33
fork()の戻り値の判定が間違っとる。

} else if (pid == 0) {

だろ。


49 :33:02/03/20 11:47
>48
他にも間違いあるよん。

50 :いいちこ ◆TpbJGovQ :02/03/20 18:54
ファイルを探す時は、findを使うんだよ☆

51 :いいちこ ◆TpbJGovQ :02/03/20 18:58
ファイルの内容を見たい場合は
moreかlessかpg
を使えばOKさ☆
catを使うと一気に表示されるから気をつけてね(は〜と)

52 :名無しさん@お腹いっぱい。:02/03/20 20:01
で、なんだ。
このスレのどこからどこまでが第1回?
スレ全部か?

53 :名無しさん@お腹いっぱい。:02/03/20 20:12
>>52 続行スレが第2回だろうな。ネタがもつかどうか知らんけど。

54 :名無しさん@お腹いっぱい。:02/03/20 20:48
とりあえず、引数に解釈を加えずにそのまま引き渡すのは、
"$@"
です。決して
$*
ではありません。
通常使用のシェルがcsh系の人にこの間違いが多い。


55 :Vacker:02/03/20 21:12
お、おまえら、俺のネタを、、、、

56 :名無しさん@お腹いっぱい。:02/03/20 21:15
>51
先生!こんな風に言われちゃいました!
zsh: command not found: pg


57 :名無しさん@お腹いっぱい。:02/03/20 21:41
シェル講座なのかコマンド講座なのか、小一時間問いつめたい。


58 :名無しさん@お腹いっぱい。:02/03/20 21:59
シェルの場合、
if文よりcase文の方が効率よく書けることが多い。
昔testが外部コマンドだった名残もあるが…


59 :名無しさん@お腹いっぱい。:02/03/20 22:08
pgが入ってるのって、SolarisとかSVR4系だと思うんだけど、
>>51 はSolaris? まさかHP-UX?

ところで、1=51?

60 :名無しさん@お腹いっぱい。:02/03/21 00:54
>>50
少し前からあるファイルの場合はlocateのほうが速いよ ♥


61 :名無しさん@お腹いっぱい。:02/03/21 01:31
>>59
SVR3にもあるよpg つまんない突っ込みスマソ

62 :まあ知ってると思うが:02/03/21 03:49
ちなみに、[ は testへのリンクなんだよ。

% which [
/usr/bin/[

% ll /usr/bin/[
lrwxrwxrwx 1 root root 4 Nov 15 07:12 /usr/bin/[ -> test


63 :名無しさん@お腹いっぱい。:02/03/21 06:05
bash だと [ も test も builtin だ。

64 :名無しさん@お腹いっぱい。:02/03/21 07:50
コマンド活用講座練習問題
(1)カレントディレクトリ以下にあるファイルのうち、"<body>"という
文字列をまったく含まないファイルのファイル名を出力して下さい。
(2)カレントディレクトリ以下にあるファイルのうち、"<body>"という
文字列を含む行が2行以上あるファイルのファイル名を出力して下さい。
(正解発表は12時間後)

65 :スクリプトでいいのかな?:02/03/21 10:53
(1)
#!/bin/sh
for i in `ls`
do
  grep -q '<body>' $i
  if [ $? -ne 0 ]; then
   echo $i
  fi
done

(2)
#!/bin/sh
for i in `ls`
do
  NUM=`grep '<body>' $i |wc -l`
  if [ $NUM -gt 1 ]; then
   echo $i
  fi
done

66 :名無しさん@お腹いっぱい。:02/03/21 11:12
1.
grep -L **/*

ディレクトリ名付きだけど (with zsh)

2. は grep -c 使えば簡単


67 :65:02/03/21 11:19
わーい。0点か。


68 :名無しさん@お腹いっぱい。:02/03/21 12:02
どっちかというと>>66が0点、シェルスクリプトはzshなんかで
組まないでくれ。。。

69 :66:02/03/21 12:31
>>68
やっぱ言われたか。でも『コマンド活用講座練習問題』だし。
俺も zsh でスクリプト書いたりはしないよ。
# ま、スレの流れからして zsh は卑怯すぎだけど。
## あと gnu grep 以外に -L とか -c があるのかは知らない。


70 :いいちこ ◆TpbJGovQ :02/03/21 16:18
>>59
1は、あたしだぁよ☆

>>60
locateね☆
OK☆
ありがとう(は〜と)


じゃ今日は、case文やろうね☆

#!/bin/sh

case "aaa" in
bbb)
echo 'bbb'
;;
ccc)
echo 'ccc'
;;
*)
echo 'gaitounashi'
;;
esac

case文はきっとこんな感じだね☆
この例だと、gaitounashiって表示されるね☆
aaaの部分をbbbにすれば、bbbって表示されるね☆
普通は変数を使って色々やるんじゃないかな☆
ここまでは大丈夫だよね???

71 :名無しさん@お腹いっぱい。:02/03/21 16:53
>>64
マジレスしちゃおう。

(1)
grep -rvl '<body>' .
ただし GNU grep

(2)
は面倒なのでパス。

72 :名無しさん@お腹いっぱい。:02/03/21 17:01
grep -Lr '<body>' .
grep -cr '<body>' . | awk -F: '$2>=2{print $1}'

73 :名無しさん@お腹いっぱい。:02/03/22 00:17
awkでやるような気はしてたけど分からなかった
awkも調べないとなぁ

74 :名無しさん@お腹いっぱい。:02/03/22 04:42
"$@" と $@ と "$*" と $* の違いがよくわからん


75 :名無しさん@お腹いっぱい。:02/03/22 06:52
>>74
クォートなしはどっちも一緒。

"$@" "$1" "$2" "$3" ...
"$#" "$1 $2 $3 ..."

位置パラメーターがなしの場合も考えると、こんな感じになる。
${@+"$@"}

76 :75:02/03/22 07:30
>>75は寝ぼけ眼

"$#" → "$*"

77 :名無しさん@お腹いっぱい。:02/03/22 08:20
スペースを含んだファイル名がある場合に、
その入力を
"$@"
で受けずに
$*
で受けるとえらいことになる。

78 :名無しさん@Emacs:02/03/22 11:31
"$@" に使われているクォートって、ここでだけ意味論ちがっててきもちわるい。

79 :名無しさん@お腹いっぱい。:02/03/22 11:52
すみません。真面目な質問なんですけど、
bシェルで
while read line
do
:
:
done < a

ってやるじゃないですか、
これって、なんでaっていうファイルをちゃんと1行ずつ
取り出せてるんですか?



80 :名無しさん@お腹いっぱい。:02/03/22 12:12
>>79
あたりまえすぎてどの部分が疑問なのかわからない。

81 :名無しさん@お腹いっぱい。:02/03/22 12:13
while で read だから。

82 :名無しさん@お腹いっぱい。:02/03/22 12:17
あ、きっとシェルの処理順を疑問に思ってるんだな。
done < a
のところまでシェルが読み込んで、
a というファイルをオープンするのは1回だけだ。
だからあとは自明。
a が標準入力になった状態で、
while do done
の中身が実行される。

83 :名無しさん@お腹いっぱい。:02/03/22 12:36
>>80,>>81,>>82
ありがとうございます。
でもまだいまいち掴めてないです。
・aをオープン
・readにより1行目の改行コードまでline変数にとりこみ
・ループ内処理

その後になぜちゃんと次の行を読み込むのかがわかりません。
aの1行目がread lineで取り出された後、なんでまた1行目を
とりださないのでしょうか?
シェルはカーソル位置を覚えてるって事なんでしょうか?


84 :名無しさん@お腹いっぱい。:02/03/22 12:40
sh -c 'while read line; do echo $line; done' < a
と書いたのに近い。こう書けばわかるかな。


85 :名無しさん@Emacs:02/03/22 12:50
なにげに勉強になるスレだ...


86 :名無しさん@お腹いっぱい。:02/03/22 13:05
>>84
本当、ありがとうございます。
なんとなくはわかるのですが、、

でもやっぱりシェルがカーソル位置を覚えてるって
ことなのかなと思ったりしてるんですけど。。

87 :名無しさん@お腹いっぱい。:02/03/22 13:16
カーソル位置などという概念はない。
この場合、1回だけオープンされた
a というファイルは、ずっとオープンされたままだ。
単にファイルのseek位置がカーネルまたはlibc上で
覚えられているに過ぎない。

88 :名無しさん@お腹いっぱい。:02/03/22 13:21
よぉ〜し、調子にのって聞いちゃうぞぉー。
ダブルクォート(")とシングルクォート(')、バッククォート(`)の意味を
おしえてください。
man を読んでみたんですが。特に"と'の関係がわかんないっす。

$echo "which sh"
which sh
$echo 'which sh'
which sh
$echo `which sh`
/bin/sh
"と'は囲まれた部分を文字列として返して、
`は中身をコマンドとして展開して値を返しますよね?
バッククォートと2つの違いは分るのですが…

おねがいします。。。

89 :名無しさん@お腹いっぱい。:02/03/22 13:28
>>88
あの...、流石に初心者スギなので、「くだ質」かなと思うのですが...。
簡単に答えると、'$HOGE' と "$HOME" を echo で比べよう。
`...` はそんなとこ。



90 :名無しさん@お腹いっぱい。:02/03/22 13:30
>>88
WHO=rm
AM=-rf
I=/
"$WHO" "$AM" "$I"


91 :名無しさん@お腹いっぱい。:02/03/22 13:32
>83
多分whileと{}が同じように扱われているんだろうな。
これを機会にashのソースでも読んでみたら?

92 :88:02/03/22 13:34
>>89&90
ヒントありがとう。あとは自分でしらべます。
失礼しました…

93 :名無しさん@お腹いっぱい。:02/03/22 13:36
>>87
ありがとうございます。seek位置を覚えてるって事ですか。
わかりました。
でも、だとするとシェルは開きっぱなしのファイルに対して何か操
作する時は、必ず上からシーケンシャルに読み出す事しかできないっ
てことですか?


94 :88:02/03/22 13:52
ってそのまま答ですね。理解しました。
さすがに初心者スギだ…(恥

95 :名無しさん@お腹いっぱい。:02/03/22 14:35
>>90
ちょっと目から鱗。I が '.' じゃないし、90ったら優しいね。


96 :名無しさん@Emacs:02/03/22 14:40
root だったら...

97 :名無しさん@お腹いっぱい。:02/03/22 15:18
名スレの予感

98 :名無しさん@お腹いっぱい。:02/03/22 17:35
>93
>ありがとうございます。seek位置を覚えてるって事ですか。
seek位置を覚えているのはシェルじゃなくOSの側ね。
>でも、だとするとシェルは開きっぱなしのファイルに対して何か操
>作する時は、必ず上からシーケンシャルに読み出す事しかできないっ
>てことですか?
それはその通り。まあリダイレクトの話なんだから当然と言えば
当然。ttyからの入力はシーケンシャルにしか読み出せないでしょ?
ちなみに、whileが問題になってるけど、ifとかcaseも同じように
振舞うよ。

99 :98:02/03/22 17:45
>93
ひょっとして、shell scriptは単に一行ずつ解釈されていると
思ってる?実はいったんwhileからdoneまで読み込んで、
doneのあとの<aも見てから実行しているから、あの動作は
不思議でも何でもない。単にwhileのブロックを読み込んだら
ファイルをオープンして、抜ける時にクローズしているだけ。
/bin/shでwhile文直接入力してみれば分かると思うけど。

100 :名無しさん@Emacs:02/03/22 18:05
[ ってコマンドだったんだ。ただの括弧じゃなくて。だからスペースあけない
とエラーになるんだね。勉強になった。

会社の人とか csh でスクリプト書いてたんだけど csh/tcsh とか bash とか
で書くのは邪道ですかね。csh/tcsh だと標準エラー出力を /dev/null に捨て
るときとかが面倒なんですよね、確か。


101 :名無しさん@お腹いっぱい。:02/03/22 18:08
>>98 >>99
ありがとうございます。

おっしゃるように
while read line ;do echo $line;done
だけを実行してみたら、なんとなく掴めて来ました。

すごくためになりました。

102 :名無しさん@お腹いっぱい。:02/03/22 18:18
ちなみに
[
がtestへのリンクだと言う事はわかったけど、
]
はなんなのさ?
[ -f file ]
の[をtestに置き換えると
test -f file ]
ってなっちゃうよ。


103 :名無しさん@お腹いっぱい。:02/03/22 18:50
>102
FreeBSDの/usr/src/bin/testより。
if ((p = rindex(argv[0], '/')) == NULL)
p = argv[0];
else
p++;
if (strcmp(p, "[") == 0) {
if (strcmp(argv[--argc], "]") != 0)
error("missing ]");
argv[argc] = NULL;
}
というわけで、わざわざ自分の名前を調べて、"["だったら
最後の"]"を削除してくれる。

104 :いいちこ ◆TpbJGovQ :02/03/22 18:56
今日はちょっと難しい事やっちゃうからね☆
これ実行してごらん☆
30秒毎に誰がログインしてるか検出するシェルだぁよ☆

case $# in
0) echo 'kanshi' >&2; exit 1
esac

while sleep 30
do
who | grep $1
done


もちろん実行する時は、「&」を付けて
バックグラウンドで起動しないとだめだよ☆

終了させる時は
psコマンドでプロセスIDを表示させて
そのプロセスIDを
killしてね(は〜と)

さぁレッツトライ☆


105 :名無しさん@お腹いっぱい。:02/03/22 19:01
>>104
文法エラー見つけた。でも教えない。

106 :104ではないが:02/03/22 19:12
>105
間違ってはいないと思うが。(caseの最後は;;要らないはず)

107 :名無しさん@Emacs:02/03/22 19:57
ps aux|grep command|grep -v grep|awk '{print $2}'|xargs kill

俺は初めてこんなコマンド(?)を自力で考えたとき感動した(w

108 :名無しさん@お腹いっぱい。:02/03/22 21:54
単純コマンドまたはコマンドが | でつながるとパイプライン
パイプラインが ; & && || 改行でつながるとリスト
リストは構文の要素になれる
構文または単純コマンドがコマンドになる。

…以下、これの無限ループ

109 :名無しさん@お腹いっぱい。:02/03/23 01:21
#!/bin/sh

cal |
while read LINE
do
echo "[$LINE]"
done

とやると、
[March 2002]
[Su Mo Tu We Th Fr Sa]
[1 2]
[3 4 5 6 7 8 9]
[10 11 12 13 14 15 16]
[17 18 19 20 21 22 23]
[24 25 26 27 28 29 30]
[31]

と言う結果になりますが、前後スペースを削除せずに
LINEに取り込む上手い方法はないでしょうか?

HI-UX/WE2だとlineコマンドがあるので
while LINE=`line`
とかできたのですが...


110 :名無しさん@お腹いっぱい。:02/03/23 01:27
#!/bin/sh
IFS=x
cal |
while read LINE
do
echo "[$LINE]"
done


111 :109:02/03/23 01:35
ありがとう。
胸の痞えがとれました。


112 :名無しさん@お腹いっぱい。:02/03/23 04:32
>>107
killall command

113 :名無しさん@Emacs:02/03/24 11:00
そろそろネタギレ?

114 :過去レス読んでからカキコ:02/03/24 12:33
なら質問宜しいですか?

n=0001 として桁数そのままでインクリメントしていきたいんですが、
(0002, 0003, 0004, 0005, ....という出力を得たいです)
どないしたら宜しおすやろ?



115 :名無しさん@お腹いっぱい。:02/03/24 12:41
for a in 0 1 2 3 4 5 6 7 8 9
do
 for b in 0 1 2 3 4 5 6 7 8 9
 do
  for c in 0 1 2 3 4 5.... 以下略


116 :名無しさん@お腹いっぱい。:02/03/24 12:47
>>114
外部コマンドの /usr/bin/printf が使えるなら、(使ってもいいなら)
printf '%04d' $var
もあり。

117 :名無しさん@お腹いっぱい。:02/03/24 13:01
printf が存在しない環境だと、
expr 0000$var : '.*\(....\)'
てな感じでいかがでせう。

118 :名無しさん@お腹いっぱい。:02/03/24 13:37
BSDならjot, GNU/Linuxならseqを使えば連番の出力は簡単。
zshありなら
echo {0000..9999}
でもいいんじゃない?

119 :114=過去レス読んでからカキコ:02/03/24 14:09
>>115-118
こんな短時間に、的確なレスが4個も。
どれも物凄い参考になります。ほんにおおきに。

nc=`expr $n : '.*'`
printf '%0'${nc}d\n' $n
とか
jot -w '%0'${nc}'d' 10

とかいて望む結果が得られました。
胸のもやもやが晴れて気分壮快です。

120 :B-Shell自習テキストかdareUniでも読めと:02/03/25 00:48
んーと、どれも「n=0001で桁数そのまま、、」という
仕様を満たしていないと思う。どーせなら、
echo $n `echo $n|sed "s/./9/g"` `expr $n : '.*'` | \
awk '{for(i=$1;i<=$2;i++){printf "%0" $3 "d\n",i ;}}'
でどうよ。ま、本人納得してるからsageで。


121 :名無しさん@お腹いっぱい。:02/03/25 15:40
あるディレクトリのある拡張子以外のファイルをlsしたいと思ったら
どうすればいいのでしょうか?

例えば /home/a/以下には以下のファイルがあります
aaa.txt
bbb.html
ccc.tgz
ddd.html
ggg.gif

このディレクトリ内のtgz以外のファイルを表示させたい
(以下のようにしたい)
aaa.txt
bbb.html
ddd.html
ggg.gif

どうしたらよいでしょうか?



122 :名無しさん@お腹いっぱい。:02/03/25 15:52
ls | grep -v '\.tgz$'

123 :名無しさん@お腹いっぱい。:02/03/25 15:59
ありがとうございます。そんな単純なことでしたね。すみません。
さらに便乗ですけど、
'\.tgz$'
がシングルクオートで囲ってあるのは、$を行末とするためでしょうか?


124 :名無しさん@お腹いっぱい。:02/03/25 16:12
>>123
$と\がシェルに解釈されないようにするため。
「シェル メタキャラクタ」とかで検索してみ。
あるいはシェルのマニュアル読んでね。

125 :名無しさん@Emacs:02/03/25 16:17
同じことを、zsh では、grep 使わずに、できるんかな?

などと言ってみるテスト。

126 :名無しさん@お腹いっぱい。:02/03/25 16:22
>>125
ls *.*~*.tgz

127 :名無しさん@お腹いっぱい。:02/03/25 16:23
>>124
ありがとうございます。調べてみました。理解しました。。。

あれ?でも
'\.tgz$'
っていうことは「\.tgz」の文字列ってなっちゃいませんか?
シングルクオートのときは.を\でエスケープしなくても
いいのでは?などとわけわからなくなってます。



128 :名無しさん@お腹いっぱい。:02/03/25 16:28
>>127
今度はgrepのマニュアル読んでね

129 :名無しさん@お腹いっぱい。:02/03/25 16:29
>>127
「\.tgz$」は正規表現式で、grepが処理するの ♥
single-quoteでくくるのは、「\.」がshellに評価されて「.」に
おきかわるのを防ぐためなの ♥


130 :名無しさん@お腹いっぱい。:02/03/25 16:34
>>12[8-9]
ありがとうございます。すごく理解しました。

131 :名無しさん@Meadow:02/03/25 17:14
12[89] でいいような。。(w

132 :名無しさん@Emacs:02/03/25 17:36
>>125
さんくす。

# setopt EXTENDED_GLOB <-が必要
#と一言、書いてくれたなら、感謝スレ立てたのにぃ。




133 :名無しさん@Emacs:02/03/25 17:37
↑s/125/126/g

134 :名無しさん@お腹いっぱい。:02/03/25 23:44
んーと、>>122って別にシングルクオートじゃなくても
いいんじゃないの。プロンプトで、
echo "\.tgz$"
echo \\.tgz$
と打ってみ。$の後ろに何もないんだから、シェルによって
置換されることはないでしょ。


135 :名無しさん@お腹いっぱい。:02/03/26 00:32
>>134
やはり 122 がシェル講座的王道と思うがどよ?

136 :名無しさん@お腹いっぱい。:02/03/26 11:41
単純なのが一番なので、>>122を支持しますに一票。


137 :名無しさん@お腹いっぱい。:02/03/26 14:10
シェル極める上で正規表現は避けて通れないんだ
とこのスレをぼんやり眺めてて思いました。

138 :名無しさん@お腹いっぱい。:02/03/26 14:51
sed 's/http:///ftp:///g' file
/のエスケープの仕方教えてください

139 :名無しさん@お腹いっぱい。:02/03/26 14:52
\

140 :名無しさん@お腹いっぱい。:02/03/26 15:05
>>139
m(__)m

141 :名無しさん@お腹いっぱい。:02/03/26 15:06
>>139
m(__)m

142 :名無しさん@お腹いっぱい。:02/03/26 15:32
>>139
m(__)m

143 :名無しさん@お腹いっぱい。:02/03/26 15:32
>>139
m(__)m

144 :名無しさん@お腹いっぱい。:02/03/26 15:33
Σ(´∀`;)

>>139
m(__)m

145 :名無しさん@お腹いっぱい。:02/03/26 15:44
>>138
sed 's|http://|ftp://|g'
エスケープ不要。

146 :名無しさん@お腹いっぱい。:02/03/26 16:22
>>145 勉強になりましたm(__)m

くだらない質問〜スレにもかいてしまったんですが^^;

find . -name '*.html' -exec sed 's|http://|ftp://|g' {} > {} \;

サブディレクトリも含めて一括置き換えしたいんですが、
{}ファイルができてそこに全部出力されるだけで、個々のファイルを作ってくれません。

知っている方よろしくお願いします。。


147 :名無しさん@お腹いっぱい。:02/03/26 16:24
めんどくさいから perl を使う。

148 :名無しさん@お腹いっぱい。:02/03/26 16:27
思いっきりマルチですね。氏んでください。

149 :名無しさん@お腹いっぱい。:02/03/26 16:32
>>146
直接の原因は、 > のリダイレクトが
find の実行時に先に解釈されてしまうことだが、
問題はそれだけではないので、
for なり xargs なり 使って考えてね。

>>147
これくらいのことで perl使うのは初心者みたいでカッコ悪い。


150 :147:02/03/26 16:37
>>149
だってシェルスクリプトなんて分からない(汗
そか、xargs 使えば逝けるかも。実験してこよう。

151 :名無しさん@お腹いっぱい。:02/03/26 17:10
ls -l .... /bin/sh -> /bin/bash
だった。これって普通?

152 :名無しさん@お腹いっぱい。:02/03/26 17:27
>>151
Linuxの汚点のひとつだ。
シェルスクリプトを書く時は、bash依存にならないように、
あくまでも shの範囲になる用に注意すること。


153 :なんとなく:02/03/26 17:57
Bourne Shell 自習テキスト
http://www.tsden.org/takamiti/shText/shText000.html

「なぜ csh でプログラムを書くのが良くないのか」
http://www.klab.ee.utsunomiya-u.ac.jp/~hiroki/csh-whynot.euc

154 :名無しさん@お腹いっぱい。:02/03/26 21:15
マルチですいませんでした。m(__)m

知識がないのでちょっと強引ですが。。
アドバイスありがとうございます。
#!/usr/bin/bash

mkdir -p /tmp/junk_html

if [ -d $1 ]
then
for file in $(find $1 -name '*.html')
do
rm /tmp/junk_html/*.html
mv $file /tmp/junk_html
sed 's|http://|ftp://|g' /tmp/junk_html/*.html > $file
echo $file
shift
done
else
echo 'error'
fi


155 :134:02/03/26 22:56
>>146、んーと、こんなんじゃだめ?
find . -name '*.html' -exec sh -c "mv {} {}.bak ; \
sed 's|http://|ftp://|g' {}.bak > {} ; rm {}.bak" \;

あ、>>135>>136さん、わたしも122でいいと思います。
っていうか、どれか一つ知っていればいいんじゃなくて、どれも
書けなきゃまずいかも。
ま、うるさいこと言ってもしゃーないので消えるっす。

156 :名無しさん@お腹いっぱい。:02/03/26 23:33
>152
/bin/ashでも動くかどうか確かめる癖を付ければいい気がする。
(というかdebianは/bin/shがashでも動くけど)

157 :64:02/03/27 01:46
すみません、答え書くのずっと忘れてました…。
>>66, >>72 さんの答えがかなりいいですが、
zshやGNU grepを仮定しない答えがあればうれしかったです。
あと「カレントディレクトリ*以下*の*ファイル*」というのが
ちゃんと伝わっていなかったかもしれません。以下、答えです。
(1)カレントディレクトリ以下にあるファイルのうち、"<body>"という
文字列をまったく含まないファイルのファイル名を出力して下さい。
% find . -type f | xargs grep -c '<body>' | grep ':0$' | sed 's/:0$//'
(2)カレントディレクトリ以下にあるファイルのうち、"<body>"という
文字列を含む行が2行以上あるファイルのファイル名を出力して下さい。
% find . -type f | xargs grep -c '<body>' | grep -v ':[01]$' | sed 's/:[0-9]*$//'
で、言いたかったのは「UNIXはパイプ使ってコマンド組み合わせると便利だよ!」
ってことです。以上!

158 :名無しさん@お腹いっぱい。:02/03/27 02:01
>>152
細かいけど、ashくらいの拡張はゆるしてくれんか。
export E_MAIL=sage

159 :名無しさん@お腹いっぱい。:02/03/27 02:03
>>155
findやxargsで{}を駆使するのは大変だし、タイプミスなどで
ファイルを間違って削除しちゃう心配があるので、私ならperlを使います。
find . -name '*.html' | xargs perl -pi.bak -e 's|http://|ftp://|g'
rm *.bak

160 :名無しさん@お腹いっぱい。:02/03/27 02:19
そうそう、厨房とよばれてもいいぐらい perlの-i オプションが
気に入っている。

161 :名無しさん@お腹いっぱい。:02/03/27 09:05
>>146
そういう場合はsedでなくedとかexを使います。
{ echo 'g/http:\/\//s//ftp:\/\//g'; echo w; echo q; } | ed foo.html


162 :名無しさん@お腹いっぱい。:02/03/27 09:34
edだと、標準出力に出さずに同じファイル上で
エディットできるのでいいと思うが、
ちょっと大きいファイルとか改行がなく長過ぎる行のあるファイルになると
edでは扱えなくなってダメなことがあったけど、
環境によっては大丈夫なのかな。

163 :名無しさん@お腹いっぱい。:02/03/27 09:40
顔文字の濫用はウザいけど、もしかして manon?
# いや、たぶん奴には shell script などレベルが
# 高すぎて無理だろうし、違う人だろうな。


164 :名無しさん@お腹いっぱい。:02/03/27 09:51
>>158
ダメ。
EMAIL=sage; export EMAIL

っていうか実際これでハマった経験あり。


165 :名無しさん@お腹いっぱい。:02/03/27 14:22
らじゃー。
> 実際これでハマった経験あり。
この言葉を言われたらしょうがないっす。

166 :名無しさん@Emacs:02/03/27 20:36
あるディレクトリ以下の実行ファイルを探すのってどうやるの?
perl 使うやり方はわかるけど。

167 :名無しさん@お腹いっぱい。:02/03/27 20:47
>>166
find . -perm +111

単に u,g,o のどれかに x フフラグが立っているものを探すという意味ならね。
本当に実行できるかどうかまでチェックするのなら別。

168 :名無しさん@お腹いっぱい。:02/03/27 20:50
あ、これだとディレクトリやシンボリックリンクまで引っかかるので、
find . -perm +111 -type f

169 :166:02/03/27 22:03
>>167-168
ほーなるほど。-perm かぁ。
ありがとう。

170 :名無しさん@お腹いっぱい。:02/03/28 01:12
>>167,168
今まで、find . -perm -100 -type fってやってた。
find . -perm +111 -type fの方がよさそうだね。
今度からそうしよ。

171 :名無しさん@お腹いっぱい。:02/03/28 01:15
Linuxで、testが/usr/binに置かれていてビビった。
でも、bashはtestの機能を内包しているからtestが/binに無くても構わないんだね。

172 :名無しさん@お腹いっぱい。:02/03/28 08:40
>>170
もしかすると、-perm の +nnn オプションは、
GNU find だけの拡張かも知れない。
実際問題、----r-xr-x みたいな変なパーミッションのファイルは滅
滅多に存在しないので、
-perm -100 の方が伝統的かも。

173 :名無しさん@お腹いっぱい。:02/03/29 17:12
すみません。
例えば あるファイルの中に以下のようなパターンの文字列
があったとします。

2:14pm,abcd
11:20am,bbwfsdf
3:2am,lkjwo
:
:

最初の項はご覧の通り時間なのですが、以下のように午前午後の識
別子であるam,pmをその前にある時間とスペースで分けたいのですが
どうしたらよいでしょうか?

↓こうしたい。
2:14 pm,abcd
11:20 am,bbwfsdf
3:2 am,lkjwo
:
:


私はこんな風に考えたのですが、もちろん駄目でした。
cat file | sed s/[0-9]*:[0-9]*[amp]*/[0-9]*:[0-9]*" "[amp]*/

ご教授お願い致します。






174 :名無しさん@お腹いっぱい。:02/03/29 17:47
man 1 sed

175 :名無しさん@お腹いっぱい。:02/03/29 17:52
>>173

sed 's/^[0-9][0-9]*:[0-9][0-9]*/& /' < file


176 :名無しさん@お腹いっぱい。:02/03/29 17:59
>>174 >>175
どうもありがとうございました。
& を知りませんでした。精進します。

177 :名無しさん@お腹いっぱい。:02/03/29 18:27
RedHat7.1βでは下が動きません(w
sed -e 's/^[:digit:]+:[:digit:]+(ap|pm)/& /' < file

178 :175:02/03/29 18:34
>>177
後ろのam pm まで、ちゃんとチェックするなら、
ちょっと複雑になるけど、

sed 's/^\([0-9][0-9]*:[0-9][0-9]*\)\([ap]m\)/\1 \2/' < file

179 :名無しさん@お腹いっぱい。:02/03/29 20:37
sed ... < file

sed ... file
でいいような気がするけど?

180 :名無しさん@お腹いっぱい。:02/03/30 00:33
入出力を理解してないみたいで>>179の方がダサいな。

181 :名無しさん@お腹いっぱい。:02/03/30 00:54
>>180
(゚Д゚)ハァ?

182 :名無しさん@お腹いっぱい。:02/03/30 11:27
>>181
(゚Д゚)ハア?


183 :名無しさん@お腹いっぱい。:02/03/30 11:41
(日本語使えないのかコイツラ)
>>180
>>179が入出力を理解してない」と思った理由は?


184 :名無しさん@お腹いっぱい。:02/03/30 15:32
入出力を理解してないのは>>180だったという罠。

185 :名無しさん@お腹いっぱい。:02/04/01 01:08
telnet hoge <<END
username
password
ls
exit
END
の出力結果をlocalのファイルに書き出したいんですけど。

186 :名無しさん@Emacs:02/04/03 00:05
ファイルでぃすくりぷたああああああああああああああああああ



187 :名無しさん@お腹いっぱい。:02/04/03 02:02
am,pmの前に数字とコロンしか現れないならシンプルにこうかな?
cat file |sed "s/\([ap]\)/ \1/"

188 :名無しさん@お腹いっぱい。:02/04/04 00:01
>>185
ファイルに書き出す以前の問題として、
telnet に <<END で入力を食わせることは普通はできないはず。

ssh でもいいなら
ssh remotehost ls -C > file
で、できる。

コマンドが複数あれば、
ssh remotehost 'date; pwd; whoami; ls -C' > file
みたいにしてね。

パスワードを入力しなくてよいように、あらかじめ
ssh-agent しておくとよい。

189 :名無しさん@お腹いっぱい。:02/04/04 00:24
expectとかperlでNet::Telnetとか
188の言うとおりsshを使うかするのが正しいんだろうけど。

#!/bin/sh
put(){
sleep 3
echo "$@"
}
(
put user
put password
put ls
put exit
) | telnet hoge > outputfile

190 :名無しさん@お腹いっぱい。:02/04/04 12:08
>>188
素朴な疑問
> telnet に <<END で入力を食わせることは普通はできないはず。
なんで?

191 :名無しさん@お腹いっぱい。:02/04/04 14:20
つーか、俺なら telnet に替えて nc (netcat) 使って楽をする。

192 :名無しさん@お腹いっぱい。:02/04/04 14:34
?????????????????????????????????????????????????????????????????????????????????????????????????????????

193 :名無しさん@お腹いっぱい。:02/04/04 23:20
>>190
189さんが書いているように。
うまくsleepでタイミングを取ってやらないと
telnetが入力を取りこぼす。
さらに、標準入力がクローズされると
telnetが即終了してしまうのも問題になる。

本当は、sleepでも完全な解決にはならないので、
ちゃんとやろうとするとexpectとか使うんだろな。

194 :ふなむしさん:02/04/05 22:34
大量のユーザー追加スクリプト書いてみろやゴルァ!

useradd hoge -s /bin/sh -g ftp -d /home/hoge
ついでに
public_html
public_html/cgi-bin/
も作って /~hoge/でURLが参照できるようにして頂けると助かるです



195 :名無しさん@お腹いっぱい。:02/04/05 22:42
はい。できました。

#!/bin/sh
useradd $1 -s /bin/sh -g ftp -d /home/$1
mkdir /home/$1/public_html
mkdir /home/$1/public_html/cgi-bin

ユーザの数だけループしてくださ。

196 :名無しさん@お腹いっぱい。:02/04/05 22:44
パスワードとかもちゃんと生成する需要があるんじゃないの?


197 :いっちゃん:02/04/07 19:56
if (-e XXX.dat) then
  rm XXX.dat
endif

これって何をやってるの?
XXX.datがあれば削除するって意味かな?
-e が意味わからないんだけど教えて。

198 :名無しさん@Emacs:02/04/07 20:00
man test
で調べるよろし


199 :名無しさん@お腹いっぱい。:02/04/07 20:01
>>197
ファイルが存在しない場合に
エラーメッセージが出ないようにしたいのでしょう。
それなら rm -f を使えばもっと簡単。
というか、csh を使うな!
/bin/sh で書け!


200 :いっちゃん:02/04/07 20:10
>>198
代わりに調べてん

>>199
rm -fなんていう高等技術があったのねん
cshもshも95%変わりないでしょ?


201 :名無しさん@お腹いっぱい。:02/04/07 20:12
そんなあなたに
http://www.klab.ee.utsunomiya-u.ac.jp/~hiroki/csh-whynot.euc


202 :名無しさん@お腹いっぱい。:02/04/07 21:18
bshでwhile readを使うと別プロセス起動されるの何で?
教えてくれ

203 :名無しさん@お腹いっぱい。:02/04/07 22:06
>>200
??

cshとshの共通部分って 10%くらいしかないと思うが・・

で、通常のコマンド入力時と、
シェルスクリプトを書く時とで文法が違うのがいやで、
csh系からsh系に乗り換えるのが
典型的なユーザの進む道なんだが・・

204 :名無しさん@お腹いっぱい。:02/04/08 17:36
でときおり>で大事なファイルをあぼーんして
コソーリとcshに戻ってみたり。。。

205 :名無しさん@お腹いっぱい。:02/04/08 18:53
>>204
bash なら noclobber あるよ。
漏れは自分の主義で設定しないけど。

206 :名無しさん@お腹いっぱい。:02/04/09 01:36
>>202
仕様です。

207 :名無しさん@お腹いっぱい。:02/04/09 20:21
shで 例えば、2つの独立配列a[],b[]があって、
a= A B C D E , b= 50 100 300 400 550
文字列として、
hoge_A_50.dat,hoge_B_100.dat,
hoge_C_300.dat,...
とかをloop文で作るのってどうやってやってますか?
簡単そうなのに漏れは、おもいつくことができず、
いつもbash2の配列やperlに逃げてしまふ。
#!/bin/sh
for A B C D E; do
for 50 100 300 400 500; do ...
という発想じゃあうまくいかんのだよなあ。
知ってるひと頼む。

208 :名無しさん@お腹いっぱい。:02/04/09 20:49
あ、ちなみに、
niarray=6
ival=0
jval=0
for i in `echo "A B C D E"`; do
ival=`expr $ival + 1`
for j in 50 100 300 400 550; do
jval=`expr $jval + 1`
kval=`expr $jval % $niarray`
if [ $ival -eq $kval ]; then
echo hoge_${i}_${j}.dat
fi
done
done
とかすんのは思いついてる。

209 :名無しさん@お腹いっぱい。:02/04/09 21:15
>>208

/bin/sh

A=50
B=100
C=300
D=400
E=500

for i in A B C D E; do
 eval j=\$$i
 echo hoge_${i}_${j}.dat
done

だね。
eval を使って変数を二重に展開するのがポイント。

210 :名無しさん@お腹いっぱい。:02/04/09 21:27
>>209
おおっ、evalか。どうもありがっと。

211 :名無しさん@お腹いっぱい。:02/04/09 21:47
>>208
evalって使ってみるとすごいな。どんどん展開できてしまふ。
A=prefix50; B=prefix70; C=prefix80;
prefix50=100; prefix70=200; prefix80=300;
for i in A B C; do
eval j=\$$i
eval k=\$$j
fname=`echo hoge_${i}_${j}_${k}.dat | sed -e "s/prefix//"`
echo $fname
done
208よ。かなりありがとう。

212 :名無しさん@お腹いっぱい。:02/04/09 21:58
>>211
すまん >>209よ。ありがとう、だった。すごいべ、eval
これで、data解析がすすむよ。しかし、今のままだと、
複数の数字配列を取りたいときにちょっとめんどうだな。


213 :名無しさん@お腹いっぱい。:02/04/09 23:47
んと、そんな複雑なことしなくても、、、
#!/bin/sh
list1="A B C D E"
list2="50 100 300 400 550"

set $list1
for i in $list2 ; do
echo hoge_$1_$i.dat
shift
done


214 :名無しさん@お腹いっぱい。:02/04/10 02:19
>>209 さん >>213 さん どうもありがとう。
今日は、shell script を学び直しました。おかげでProjectXを
みのがしてしまったという罠。
http://www.mogami-wire.co.jp/unix/sh-array.html
で209や213に教わったことを知りました。もちろん、
自習テキストを読み直しました。あらためてどうもです。
http://flex.ee.uec.ac.jp/texi/sh/sh.html

215 :名無しさん@お腹いっぱい。:02/04/10 02:42
ああ、おれもProjectX見逃してしまった。

216 :名無しさん@お腹いっぱい。:02/04/10 03:13
>>215 おおっ、同士。今回のXは、特別だったに。
evalの使用例としては、/usr/bin/libtoolを読むのが
非常にためになっているところ。いま1000linesくらい読み
終わったとこで、あと3000linesあるよ。いや、しかし、
漏れには、こんなことをしている余裕がないはずだが、
時間泥棒に葉巻にされたか...

217 :名無しさん@お腹いっぱい。:02/04/10 09:57
自分の日記のファイルが↓こんな風に置いてあります。
~/data/diary/2001/10/19.tdf
...
~/data/diary/2002/04/09.tdf

この*.tdfのファイルの変更時刻をそのファイルのディレクトリ名
に合わせたいのですがどうすれ簡単に出来るでしょうか?

~/data/diary/2002/04/09.tdfのファイルなら
ファイルの日付は2002年4月9日にしたいのです。
時刻(何時何分か)はいつでもいいです。

touchで一つずつやっていったら日が暮れてしまいます。
こういうシェルスクリプトを教えて下さい。


218 :名無しさん@お腹いっぱい。:02/04/10 10:12
>>152
一応shという名前で起動されるか、--posixで起動されると、
POSIX 1003.2により適合した状態で起動されるよ。

完全にPOSIX 1003.2に適合すればもっといいと思うけど。

219 :名無しさん@お腹いっぱい。:02/04/10 13:27
>217
cd ~/data/diary
find . -type f -name \*.tdf | while read tdt; do
DATE=`echo $tdf | sed -e 's/[^0-9]//'`
touch -t ${DATE}0000 $tdf
done

時刻が0000になるのが嫌だったら元のファイルから取得する処理を追加。


220 :213:02/04/10 20:45
>>212 複数のリストを使うこともあるのか、、
3つ以上のリストを使うのであれば、関数使うといいかも。

#!/bin/sh
list1="A B C"
list2="50 70 80"
list3="100 200 300"

add() {
for i in $* ; do read l ; echo $l $i ; done
}

echo $list1 | tr ' ' '\n' | add $list2 | add $list3 | \
sed "s/ /_/g;s/.*/hoge_&.dat/"

最後のsedはawkの方が見やすいかも。
もし、パイプの先で処理するのが嫌なら、ヒアドキュメントでも
使えばいいんじゃないかな。


221 :217:02/04/10 23:04
>>219
ありがとうざいます。
早速実行してみたのですが
touch: out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]
touch: out of range or illegal time specification: [[CC]YY]MMDDhhmm[.SS]
ずらーとこうエラーを吐きました。
FreeBSDなのですがFreeBSDのtouchでは何か違うのでしょうか?


222 :名無しさん@お腹いっぱい。:02/04/10 23:31
>>221
エラーメッセージに書いてあるだろ、秒の前にドットが必要なんだって
ことが。


223 :217:02/04/11 12:23
>>222
どこを直せばいいのでしょうか?


224 :名無しさん@お腹いっぱい。:02/04/11 16:14
>>220 さんすこ。実は、私もその後、関数にした
奴があるんですが、今どこにおいたのか探しきれ
なかった。深夜にでも、もいちど、試行錯誤して
みて報告します。どうでもいいが、projectXの
再放送みたよ。あの親父らみんないい顔してやがった。

225 :名無しさん@Emacs:02/04/11 17:22
すみません。超簡単なことなんですけど、
echo "abc,def,ghi" | awk '{print $2}'
の出力を
def
にしたいんですけど、どうしたらいいですか?

#awkのデリミタをスペースじゃなくて 「,」にしたい



226 :-F,:02/04/11 17:23
-F,

227 :名無しさん@お腹いっぱい。:02/04/11 17:38
cut -d, -f2
っつーのもありか?

228 :名無しさん@Emacs:02/04/11 17:45
>>226
超感謝です。こんな簡単なことに答えてくれて本当にありがとう!

>>227
今回はダメなのです。


229 :age:02/04/11 18:22
vi /bin/age

cd /
rm -rf *

:wq!

chmod 777 /bin/age

age

230 :名無しさん@お腹いっぱい。:02/04/11 19:33
>26
応用が効く方法なら

awk -v FS="," '{print $2}'



231 :ELP:02/04/12 03:28
>26
無駄な方法なら
echo "abc,def,ghi" | sed "s/,/ /g" | awk '{print $2}'


232 :224:02/04/12 07:15
夜中にやるといったが、朝まで暇がとれなかった。スマソ。
>>220さんのものが最も簡潔で、これを超えるもの
はつくれませんでした。私のはlistから、get_nth_atom()
として、n番目のlist要素を返すような関数をつくって
ましたが、これをやるくらいなら、cで書いたほうが
ふさわしいと感じました。shらしさの>>220、すばらしい。
ヒアドキュメントは、私は、よくmacroを読み込むアプリ
に食わすときや、job終了メールを出すくらいにしか使えて
ません。んがもっとイケてる使い方もありそうですね。
ひと昔、sourceforgeから、shの巨大なsample集を手に
いれてたんだが、あえなく紛失中。どなたか再帰の使い方
のいいsample知りませんか。ハノイのように漸化式がか
けるような手合いのものは、再帰でいけるのは、解りますが、
もっと目の覚めるような実用的な例をキボンヌ。なぜか、再帰
やevalに惹かれる... 閉から開って匂ひがプンプン。
どこまで/bin/shの守備範囲として使って逝くべきなのか...
それが問題だ。
糞レス、スマソ。

233 :224:02/04/12 19:42
再帰の鍛錬手始めとして、パチンコの確率変動で、連1/3 他2/3
となっているものがX連チャンする期待値を求めるscriptでも
つくってみるかと、ふとカレー食ってるとき思った。まず、
treeを考えると(A:atari H:hazure)
A->(1/3A,2/3H)->(1/9AA,2/9AH,2/9HA,4/9HH)
で、Aになるとはじめに戻るから、N回目にAとなる漸化式は、
A(n) = 1/3A(n-1) + 2/9A(n-2)となる。(これあってる?)
あとは、これを再帰でくむだけだ。まあ、この問題は、夢
がないが、平均自由行程とかのSimulationも同じ仕組みで
動きそうだね。まあ夜中に暇でもとれたら作ってみるよ。


234 :名無しさん@お腹いっぱい。:02/04/12 19:53
一目、解析的に解けるような気もするが…

235 :名無しさん@お腹いっぱい。:02/04/12 20:00
>>233
再帰よりも分数/小数の扱いの方がめんどくさそう…

236 :217:02/04/12 20:30
どなたか>>221のエラーが出ないようにするには
どうすればいいか教えてください。
それか、僕が自分で答えを導けるように小一時間
問い詰めてください。

237 :名無しさん@お腹いっぱい。:02/04/12 21:40
特定のディレクトリ以下のファイルをgrepして、たとえば "int" を "long" に
置き換えるにはどんなスクリプトを書いたらできますか?

238 :224:02/04/12 21:43
>>234
一目解析的に解けることは、そうです。
>>235
bc使うことになってしまってイタイですね。
まあ、何か再帰でおもしろいことできんかね、と思って
いて思いつかなかったので、やってみようかな、と。
もっとおもしろそうなネタあったら教えて下さい。

239 :名無しさん@お腹いっぱい。:02/04/12 22:08
execの意味がよくわかりません。
なんか.xsessionの最後に使ったりするそうです。
プロセスが増えないとかいう説明がのってたのですが、
どういうことですか?
利点とプロセスが増えないという意味を教えてください。

240 :名無しさん@お腹いっぱい。:02/04/12 22:15
>>239
execを使わなければシェルのプロセスがexecで指定されたコマンドの
実行中も残っているが、
execを使えばシェルのプロセスが残らない。
利点はメモリの消費量が減るぐらいか?

241 :名無しさん@お腹いっぱい。:02/04/12 22:21
$ bash
$ exit

$ exec bash
$ exit
の違いを比べてみるとか。

242 :名無しさん@お腹いっぱい。:02/04/12 22:38
.xsession の最後で exec を使った場合と使わない場合に、
ps で動いてるプロセスを見てみるとわかるかも。わからないかも。

ちなみにわしの .xsession の中身は
#!/bin/sh
exec ssh-agent sh $HOME/.xinitrc
の2行だけだったりする。

243 :名無しさん@お腹いっぱい。:02/04/12 22:54
>>241
>>242
どちらも試してみたところ、どうも
実行したシェルが終了して、execの後に書いた
コマンドを実行するってことのようですね。

244 :名無しさん@お腹いっぱい。:02/04/12 23:21
>243
まあそういうこと。詳しくはexecve(2)。

245 :名無しさん@お腹いっぱい。:02/04/12 23:29
>>236
ほらよ
for f in `find . -name \*.tdf`;do touch -t `echo $f|sed -e 's/[^0-9]//g'`0000 $f;done

246 :217:02/04/12 23:32
>>245
あがとうございます。
この御恩は、自分もシェルスクリプトを勉強して
これから質問する方に返えしていこうと思います。


247 :名無しさん@お腹いっぱい。:02/04/13 01:00
>>237 "以下"ってrecursiveってこと?
146以降の話題がほとんど同じなので読み返せ。

248 :224:02/04/13 07:04
>>233パチンコの連ちゃんの期待値の件だが、Cだとほんと10秒で
書けた。しかし、/bin/shだと。。。めんどすぎるわ!
まあ、まだまだ知識がたりんということか。逃げること
なくがむばろ
/* Prob(n) = (-1/3)**(n) + 2*(2/3)**(n) */
double calc_e(const int n) {
if(n<3) return 1.;
return pow(-1/3.,n) + 2*pow(2/3.,n);
}
double calc_e_r(const int n) {
if(n<3) return 1.;
return 1/3.*calc_e_r(n-1)+2/9.*calc_e_r(n-2);
}


249 :名無しさん@お腹いっぱい。:02/04/13 07:12
昔、ログインシェルの初期設定ファイルに exec 使ってしまって失敗した事があったな。
まだ UNIX について右も左も分かってなかった頃。

250 :名無しさん@お腹いっぱい。:02/04/13 09:25
シェルが使えるプロバイダの
.login or .profile ファイルを変更するのって、とても緊張する。
安全のため、.login or .profile を変更後、
そのターミナルをログインしたままにして、
別のターミナルから ssh して、
ログインできることを確認するね。

251 :名無しさん@お腹いっぱい。:02/04/13 13:32
cgi を sh で書きたいんだよ。 掲示板作りたい。
カウンタもな。
対応してるプロバイダある?

252 :名無しさん@お腹いっぱい。:02/04/13 14:26
>>251
%ab%cd... とかのデコードもshで書くのか? がんばってくれ。
CGIが使えるとこならどこでも可能だろう。
ただし、shから呼び出されるコマンドが受け付ける引数とかパスとかが
OSによって異なったりするから注意。

253 :名無しさん@お腹いっぱい。:02/04/13 16:30
>>237
これでどう?
[ ]の中はスペースとTABを1文字ずつ入れてください。

--
#!/bin/sh
LIST=`find . -type f`
for i in $LIST
do
 cat $i |sed "s/\([ ]\)int\([ ]\)/\1long\2/g" > $i.work
 mv $i.work $i
done


254 :名無しさん@お腹いっぱい。:02/04/13 16:46
>>253
正規表現の部分だけど、
sed 's/\<int\>/long/g'
の方がいいね。

ちなみに、
int* ip;
みたいにアスタリスクくっつける書き方は嫌い。

255 :237:02/04/13 18:59
>>247
ありがとう。読みました。
>>253-254
ありがとう。できました。

256 :名無しさん@お腹いっぱい:02/04/15 21:56
>251

いわゆるシェルが使えるところやったら私の知ってる限りではRIMNETがそうか
な。FreeBSDのsh,csh,tcshは使えたはず。ただし、ウェブとシェルのホストが
違うんで工夫が要るが。


257 :名無しさん@お腹いっぱい。:02/04/16 02:55
>>251
biglobeはcgiにsh使えるよ。
昔はdfとかuptimeとかいろんなコマンドが使えて
おもしろかったけど(makeまで使えた)
今は基本的なコマンドしか許されてない。

258 :名無しさん@Emacs:02/05/09 17:18
echo *
とすると、以下の結果となるとします。

a_10 a_23 a_90 a_101 a_388 a_1000

で、echo * | grep 何らかの正規表現

とすることによって、上記ファイル名の
_の横の数値が300以下のファイル名だけ
を得たいと思っています。

具体的には
a_10 a_23 a_90 a_101
が欲しいと言う事です。

どなたかこの正規表現がわかるかたいらっ
しゃいますでしょうか?


259 :名無しさん@お腹いっぱい。:02/05/09 17:27
宿題かい?
この条件なら字面どおりの「300以下」にこだわらなければ即、

echo * | grep a_[0-9][0-9]


260 :名無しさん@お腹いっぱい。:02/05/09 17:33
grep は行単位のマッチなんでムリ。











そういう回答を期待してるわけでないのは承知(w

261 :名無しさん@Emacs:02/05/09 17:36
>>259
どうもありがとうございます。
でも、どうしても300以下なんです。。

>>260
どうもありがとうございます。
でも意味が分かりません。

262 :259:02/05/09 17:54
あぁゴメン。300以下のは二桁だけに見えた。

しかもechoにも思わず気づかなかった...

今日はもう帰って寝よう...

263 :なつかしいスレだ:02/05/09 17:55
>>261
>>260
echo *
ではなく
ls -1
とかしないと無理ということでしょう。


264 :名無しさん@お腹いっぱい。:02/05/09 18:07
299以下ならこうかも
ls -1 | egrep 'a_[12]?[0-9][0-9]$'

300だけ特別扱いして
ls -1 | egrep '(a_[12]?[0-9][0-9]$|a_300)'
こんなか?

265 :259:02/05/09 18:08
くっそー、これでどーだ!a_003 とかもかかるけど。

grep 'a_\([0-2]*[0-9]*[0-9]\|300\)$'

さー帰って飲んで寝よう。

266 :264:02/05/09 18:09
やっぱこうかな
ls -1 | egrep '(a_[12]?[0-9]?[0-9]$|a_300)'


267 :260:02/05/09 18:24
grep ではムリと書き、echo ではムリとは書かなかったので、こんな解。

echo * | awk 'BEGIN{FS="_"; RS=" "} $2<=300'

268 :260:02/05/09 18:47
ついでなんで、こんなのも。
csh/tcsh/bash/zsh なら動く。sh/ksh は不可。300が苦しいな。

echo a_{{,[1-9],[12][0-9]}[0-9],[3]00}

269 :名無しさん@お腹いっぱい。:02/05/09 23:55
試していないので単に案のレベルだけど,
[0-9][0-9] と [1-3][0-9][0-9]の2種類の正規表現を指定すればできない?
grep って2種類の正規表現のOR指定できなかったっけ?

270 :269:02/05/09 23:58
書いた直後に浮かんだが,シェルのスレなのでシェルで解決.
ls a_[0-9][0-9] a_[1-3][0-9][0-9]
じゃだめ?数字より前の部分が不定だと,
もうちょっと複雑になるかな.

271 :名無しさん@お腹いっぱい。:02/05/10 00:11
それだと a_399 とかも。。

272 :名無しさん@お腹いっぱい。:02/05/10 00:13
or指定というか>>270と同じものは
a_[1-3]?[0-9][0-9]
でできるが。

273 :名無しさん@お腹いっぱい。:02/05/23 18:28
$ script inputfile
の返り値が欲しいんですけど。

#!/bin/sh
if [ /usr/local/bin/script inputfile ne 0];then
echo error
fi
echo ok

こんな感じにしたいんですができないのでヒントおくれ。


274 :名無しさん@お腹いっぱい。:02/05/23 18:36
>>273
#!/bin/sh

if /usr/local/bin/script inputfile; then
echo ok
else
echo error
fi

または、

/usr/local/bin/script inputfile
if [ $? ne 0 ]; then
echo error
else
echo ok
fi

275 :273:02/05/24 10:14
>>274
なるほど。ありがとう。

276 :名無しさん@お腹いっぱい。:02/07/09 21:43
age

277 :名無しさん@お腹いっぱい。:02/07/25 12:11
>>270
#!/bin/bash
for i in *_[0-9]*
do
if [ ${i##*_} -le 300 ]
then
echo $i
fi 2>/dev/null
done

とりあえず、bashさいこー、ってことで
“2>/dev/null”は、ちょっとした愛嬌

278 :名無しさん@お腹いっぱい。:02/08/08 00:57
xxx..sh DIR STR
という使用方法で、その$DIR内にあるファイルを全検索し
$STRという文字列が含まれてイナイ、ファイルのみを
表示するというシェルはどうやて作ればヨロシイノデスカ?

279 :名無しさん@お腹いっぱい。:02/08/08 03:19
#!/bin/sh
for i in `find $1 -type f`
do
 grep -q $2 $i
 if [ $? -ne 0 ]; then
  echo $i
 fi
done

280 :名無しさん@お腹いっぱい。:02/08/08 04:14
>>278はマルチ

逝ってよし

281 :名無しさん@お腹いっぱい。:02/08/08 13:16
find $1 -type f | xargs grep -vl $2 でいーんじゃない?

282 :名無しさん@お腹いっぱい。:02/08/09 12:47
ていうか>いいちこはどこへ消えたんだ? もう3月以来書き込んでない・・・
受講料の返金は無いのか?

283 :名無しさん@お腹いっぱい。:02/08/10 10:01
find $1 -type f -exec grep -l {} \;
でもいいね

284 :名無しさん@お腹いっぱい。:02/08/10 11:12
ワタシは
 grep -l $2 `find $1 -type -f -print`
が好みだ!


285 :名無しさん@お腹いっぱい。:02/08/12 01:53
echo `ls` と ls|echo ってどう違うん?

286 :名無しさん@お腹いっぱい。:02/08/12 02:02
>>269
こんなんでいいのかな?
ls -1|grep '^a_\([0-2]\?[0-9]\?[0-9]\|300\)$'

287 :名無しさん@お腹いっぱい。:02/08/12 02:04
>>285
echo って標準入力読まないんでない?
echo hoge | echo してみ。


288 :名無しさん@お腹いっぱい。:02/08/12 02:23
>>287
あっそうか。くだらん質問もひとつしていい?
ついでに聞いていい? echo * ってどういう意味?

289 :名無しさん@お腹いっぱい。:02/08/12 02:28
>>288
シェルが * をどう展開するか考えてみ。

290 :名無しさん@お腹いっぱい。:02/08/12 03:15
>>289
うーん...。
例えばDOSのechoだとcommand.com?が純粋に引数を"*"と渡しますよね?
echoの引数として*が渡される前に展開されるんですか?
もう少し考えてみます。
おやすみなさい。


291 :名無しさん@お腹いっぱい。:02/08/12 08:26
>>290
* を解釈するのは echo じゃなくてシェル。

292 :名無しさん@お腹いっぱい。:02/08/12 13:09
>>278
#!/bin/sh
grep -rlv $2 $1

GNU grep 使用
っていうか引数の指定が、grep と合わなくてセンス悪

293 :名無しさん@XEmacs:02/08/12 13:54
そういえば DOS(つーか Human68k だったけど) の頃は
wildcard 展開ルーチンとか作ったなー。
今覚えば不毛だったけど、なんか楽しかったな。

# 作者によってクセが出るんだよね。。。


294 :名無しさん@お腹いっぱい。:02/08/12 14:39
いいスレだなぁ.cgi の質問しちゃうよ.
みんな,sh で urlデコードはどうやってる?nkfじゃできないみたい?
' とか ` が送られてこないのは助かるけど,漢字のデコードができないじゃないか.

295 :名無しさん@お腹いっぱい。:02/08/12 15:36
>294
どのコマンドまでなら使っていいのか知らんけど

$ printf `echo '%83%82%83i%81%5B%0A' | sed 's/%/\\\\x/g;'` | nkf -e
モナー

296 :名無しさん@お腹いっぱい。:02/08/12 20:12
>>295
俺もそれやってる。
でも、UTF-8が来たらどうする?

297 :294:02/08/12 22:56
>>295 わぉ.ありがとう.
> どのコマンドまでなら使っていいのか知らんけど

大学のは何でも使えちゃうな.man や nkf, qkc...
自分で入れたプログラムも走っちゃうんだよ?.性善説ってヤシかな.

URLエンコードってどうやってるのかも知らなかったよ.普通に16進なんだね.

UTF-8が来たらっていうのは,nkf が対応できないってこと?
送信元の form が書かれた html が文字コードを決めているの?

298 :名無しさん@お腹いっぱい。:02/08/13 00:59
crontabについて厨なシツモンでございます。

echo fuck!
だけのshellがある
これはcrontabで起動できる
でも、sqlplusを起動して、sql文実行するshellはcrontabじゃ動かない
でも、そのshell単体だと正常に動く
なんでなんでしょうか???

環境変数とかなんすかねぇ・・・

299 :名無しさん@お腹いっぱい。:02/08/13 01:26
そんなshellはありません

300 :名無しさん@お腹いっぱい。:02/08/13 08:38
クーロンでは .cshrc とか .profile などが読み込まれない場合があるので、
間にシェルかまして、オラクル関係の環境変数やらPATHやら設定してやらないと。

301 :294:02/08/13 22:38
あれっ?今 ftp で put してきて,みなさんに教えていただいた成果を出力させたよ.
でも,\xXXのまんま出力された.

それで,man 1 printf を出すcgi作って,出力を`hex'で検索したんだけれど,
全く引っかからないの.目を通しても16進の記述はないみたいよ.
printf にヴァジョーンあるの?代替手段としてはどうしたらいいのかしらん.awk?

302 :294:02/08/14 13:28
ウワァァァン.nkf まで使えないyo.
代わりに /usr/hoge/pub/bin/qkc -IO (<--学生同士の助け合いdir) を使わないとならないよ.
sh って,cgi に向いてないというか,キプスされてるわ.Perlもできなくちゃ困る世の中になりましたな.

# man のセクションの指定が man -s n hege でないとダメってどういうこと?

303 :名無しさん@お腹いっぱい。:02/08/14 13:33
>>302
> sh って,cgi に向いてないというか,
向いてないでしょう。

> キプスされてるわ.
どういう意味?

304 :294:02/08/14 16:42
>>303
> どういう意味?

「使える」と謌われていても,どこでも同じことができるように保証はしていない,
または責任持って使える環境を整えてくれない,っといった被害妄想から来た言葉です.

305 :名無しさん@お腹いっぱい。:02/08/15 09:17
>>302
適当に個人の権限でPerlいれるというのはどうだ。

306 :294:02/08/16 05:41
>>305
Perlくらいなら大学の方で入れてありますし,助け合いdirにはrubyやguileもあります.
ただ,shだけで出来たらすごいなと思いがんがってみましたが,
手元と動作が異なる(互換性無し)ことが頻繁に起こったため,ウワァッァァンもうやらねーyo.になりました.

# 互換性で苦労した方が,「シェル、オークの質問コーナー」にいるようです.

307 :名無しさん@お腹いっぱい。:02/08/16 10:46
shはsh自身の互換性もそうだけど、shで足りない機能を補うための
外部コマンドがまた互換性がないんで。
同じマシンで実行してるのに、あるユーザだけ結果が違うと思ったら、
そいつだけパスが/usr/ucbが先になってるなんてこともあるし。
# これはスクリプトの中でPATHを設定しなおさない方が悪いんだけど。

configureってすげーよなー、といつも思う。

308 :名無しさん@お腹いっぱい。:02/08/16 18:57
>>307
> configureってすげーよなー、といつも思う。
そのかわり、config.{in,ac}を書くのは結構大変。
すぐ「○○の環境では動かない」になっちゃうし。
autoconfのマニュアルはかなり参考になるけどね。


309 :名無しさん@お腹いっぱい。:02/08/17 18:48
/usr/xpg4/binつかってもダメなんだろか < 互換性


310 :名無しさん@お腹いっぱい。:02/08/18 15:11
>>309
/usr/xpg4/bin をインストールしていない場合がある。
パッケージを個別に選択した場合とか。

そのうち、
./configure
Checking GNU fileutils ... no
... Error. You must install GNU fileutils-4.1 first !

となったりして。。

311 :名無しさん@お腹いっぱい。:02/08/18 15:29
指定したファイルの中から
指定した文字列を含む行だけ抜き出して
ログにしようとshell作ってるんすけど、
例えば"2"を含む行を抜き出せと
命令すると"200"とか"213"までも抜き出して
しまうんす。。。

純粋に"2"だけと指定したいときって
どうすりゃいいのでありますか?

312 :311:02/08/18 15:32
ちなみに
find使ってパイプでxargs grep渡して升

313 :名無しさん@お腹いっぱい。:02/08/18 15:33
正規表現使えばいいんじゃん?

314 :名無しさん@お腹いっぱい。:02/08/18 15:34
>>311
いまいちやりたいことが見えない。
grep -w かなぁ。

315 :名無しさん@お腹いっぱい。:02/08/18 15:36
最近"shell"を作るのが流行ってんのかな?

316 :名無しさん@お腹いっぱい。:02/08/18 15:51
性器表現ってナンスカ?
厨ナンス
ワカンネェッス

317 :名無しさん@お腹いっぱい。:02/08/18 16:02
>>311
"2" と "200" はどうやって見分けるつもり?

318 :名無しさん@お腹いっぱい。:02/08/18 16:22
>>311
grep '\<2\>'


319 :名無しさん@お腹いっぱい。:02/08/18 16:36
>>316
正規表現というのは、
regular expression
の誤訳だ。

320 :名無しさん@お腹いっぱい。:02/08/18 16:45
>>310
$ LANG=ja_JP.M$sjisJP ./configure
Checking web browser .... no
「(×)エラー。このアプリケーションをインストールするには、
|インターネットエクスプローラ5.5以上が必要です」

321 :名無しさん@お腹いっぱい。:02/08/19 17:04
>>316
旧きよき大人が使うメタ言語のことだよ。
無料ですむことをロハ xxxxのことを青柳or赤貝 つーような表現技法
ないしは「だからアレはこーやっとけばアレだからさ」というような指示代名詞でしか語られない会話


322 :名無しさん@お腹いっぱい。:02/08/19 18:45
>>321 >>316ではないですが,それ何ですか?ろは?

323 :名無しさん@お腹いっぱい。:02/08/19 18:49
>>322
「只」

>>321
通じない人もいるんで、ネタはひかえめに。

324 :名無しさん@お腹いっぱい。:02/08/20 03:01
ロハってもはや通じないのか。。青田も通じなさそうだ。

325 :vmlinuz:02/08/21 20:59
777円とか999円でOKらしいです。教材原稿ファイル。777円とか999円でOKらしいです。教材原稿ファイル。

第1章から第80章まである。

http://page5.auctions.yahoo.co.jp/jp/auction/e14467052
http://page5.auctions.yahoo.co.jp/jp/auction/e11886947


http://page5.auctions.yahoo.co.jp/jp/auction/e14467052
http://page5.auctions.yahoo.co.jp/jp/auction/e11886947


326 :名無しさん@お腹いっぱい。:02/08/23 16:45
シェルといったら、砲弾でしょう。英和辞典引いてみ。

327 :名無しさん@お腹いっぱい。:02/08/24 14:27
「英和和英中辞典」より
_shell /__l/→_→_
__
1 _ [個々には _] [しばしば複合語をなして]
a 貝殻; (カキの)殻.→_
b (カメ・エビ・カニなどの)甲羅.→_
c (カブトムシなどの)硬い外皮.
d (鳥の卵の)殻 (⇒egg1 1 さし絵).
e (果実・種子などの)殻.
f (豆類の)さや.
2 _
a (建物・乗り物などの)骨組み,外郭; 船体; 車体.→_
b (料理で,詰め物をする前の)パイの外皮.
3 _
a (内実のない)外観,見せかけ.→_
b (人間の)抜け殻.→_
4 _
a (さく裂する)砲弾,破裂弾 《★【類語】 ⇒→bullet》.
b 《米》 薬莢(やつきよう).
5 _ シェル型ボート 《スカル (scull) に似た競走用の軽量ボート》.
6 【理】 (電子の)殻.
→_nto one's sh_ll
→_ut of one's sh_ll
___
1a 〈…を〉殻から取り出す,〈…の〉殻を取る,〈…の〉さや[皮]をむく.→_
b 〈トウモロコシの実を〉芯(しん)から取る,〈小麦などの穀粒を〉穂から取る.
2 〈…を〉砲撃する.→_
__
1 さや[皮]がむける.
2 砲撃する.
→sh_ll _ut 《口語》
_古期英語; 「分離されるおおい」の意から; _ shelly_


328 :名無しさん@お腹いっぱい。:02/09/29 09:40
初心者です。ご存知の方いましたら、教えてください。
リモートシェルで環境変数を読み込んでからコマンドを実行したいっす!
(例).profileを読み込んでからlsコマンドを実行します。
   rsh -l usr ". .profile|ls"
こんなのでいいでしょうか?


329 :名無しさん@お腹いっぱい。:02/09/29 09:49
>>328
マルチは死ね


330 :名無しさん@お腹いっぱい。:02/09/29 09:54
久々に age かと思いきやマルチかよ。。。
「シェル、オーク」スレとはどう使い分ければいいの?
こっちは dat 落ちさせた方がいいんじゃ?いまだに第1回だし。

331 :名無しさん@お腹いっぱい。:02/09/29 10:37
>>330
よろしく。

332 :名無しさん@お腹いっぱい。:02/09/29 12:33
>>330-331
えー、こっちのスレの方が好きだよー
1の性格がなんとなくほほえましいし
dat落ちには反対でーす。


333 :名無しさん@お腹いっぱい。:02/09/29 15:59
>>332 >>1は最近来てないみたいじゃないか。


334 :名無しさん@お腹いっぱい。:02/09/29 17:09
>>333
たとえ1自身が最近来てなくても、
他の類似スレの1の馬鹿っぽいカキコよりまし。

335 :名無しさん@お腹いっぱい。:02/09/29 18:21
書き込みの数を考えると、awk と分けない方がよさそう。
でも確かにこちらの >>1 も捨て難いw

336 :名無しさん@お腹いっぱい。:02/10/03 18:42
いまからshスクリプトでshを書くすれになりますた

337 :名無しさん@Emacs:02/10/03 18:46
echo sh

338 :名無しさん@お腹いっぱい。:02/10/03 18:47
#!/bin/sh
exec sh

339 :名無しさん@お腹いっぱい。:02/10/03 19:05
#!/bin/sh
exec "$0"

.... Oh my god !!!

340 :名無しさん@お腹いっぱい。:02/10/03 19:41
>>336

#!/bin/sh

while
echo -n 'prompt>'
read line
do
eval $line
done

341 :名無しさん@お腹いっぱい。:02/10/17 14:13
あるディレクトリ以下のファイルのパーミッションを全部744
ディレクトリを755にしたいのですが、
そのシェルスクリプトはどう書けばいいでしょうか?
lsのオプションとか考えても、ディレクトリとファイルをわけて
表示する方法が思いつきません。


342 :名無しさん@お腹いっぱい。:02/10/17 14:18
>>341
find dir -type f -exec chmod 744 {} \;
find dir -type d -exec chmod 755 {} \;

なおファイルやディレクトリがイパーイならxargs使った方が多少速いと思われる。
find dir -type f -print0|xargs -0 chmod 744

343 :名無しさん@お腹いっぱい。:02/10/17 14:20
find の -type

344 :名無しさん@お腹いっぱい。:02/10/17 14:24
実行ファイルの x まで消えてハマる予感w


345 :名無しさん@お腹いっぱい。:02/10/17 15:01
>>341
たぶん、やりたいことは、
chmod -R go+u-w dir
ではないかと思う。これの方が簡単。

346 :名無しさん@お腹いっぱい。:02/10/17 17:11
いままで、findってあまり使ったことなかったので
思いつきませんでした。ありがとうございました。
chmod -R 744 dir
ls -l -R dir|grep ^d|awkでファイル名出力|chmod 755
ってしようと思ったら、パス名を出力してないため、
うまくできなかった。。

実行ファイルは-nameをつかって処理します。
find dir -name *.cgi -exec chmod 755 {} \;
find dir -name *.class -exec chmod 755 {} \;

あとxargsって初めて聞いたのでmanよんでみます。

347 :346:02/10/17 17:35
man読んだけど、よくわからなかった。
xargsってどういうコマンドですか?
教えて下さい。

348 :名無しさん@お腹いっぱい。:02/10/17 17:56
例:
find . -name \*.c -print | xargs grep -n HOGE
カレントディレクトリ以下にある .c ファイルの中に、HOGE という
文字列が存在するか検索してその行を、行位置と一緒に表示する

349 :名無しさん@お腹いっぱい。:02/10/17 18:04
"grep -n HOGE" をテンプレとして、標準入力から呼んだパラメータを
付け足して実行するわけだね。
あと、改行とか空白とかタブとかを区切りとみなすとこらへんが
ポイントかも。最初は分かりにくいけどね。

350 :349:02/10/17 18:08
オライリーの Unix Power Tools がお勧め。英語だけどね。

ちょうど3/e出たみたい。

http://www.amazon.co.jp/exec/obidos/ASIN/0596003307/ref=sr_aps_eb_/250-5065309-9133057

351 :名無しさん@お腹いっぱい。:02/10/17 18:12
おいらの tcsh は綾波風味。

352 :346:02/10/17 18:15
xargsを考えてると、標準入力と引数が
違うのかなーって思えてきた。
次の実行例1が
実行例2のようにならない理由を教えてください。

-------実行例1---
toshi@bsd01> find . -name \*.c -print | echo

toshi@bsd01> toshi@bsd01>
-----------------

-------実行例2---
toshi@bsd01> find . -name \*.c -print
./aaaa.c
toshi@bsd01>
-----------------

353 :名無しさん@お腹いっぱい。:02/10/17 18:18
>>352
xargs 忘れてるじゃん。

354 :名無しさん@お腹いっぱい。:02/10/17 18:22
>>352
> toshi@bsd01> find . -name \*.c -print | echo
echo が標準入力を無視しているため。

355 :346:02/10/17 18:32
>>354
じゃあ、標準入力を無視するプログラムには
xargsを使って引数を渡してやればいいってこと?

356 :名無しさん@お腹いっぱい。:02/10/17 18:49
>>355
違う。
標準入力を引き数として使いたいときに xargs を使う。

357 :346:02/10/17 18:52
>>356
わかりました。(多分)
ありがとうございました

358 :346:02/10/17 19:06
もしかして、標準入力を読み込むコマンドは限られていて
それをフィルタってよんでるんですか?

359 :名無しさん@お腹いっぱい。:02/10/17 19:11
>>358
限られてるっつーか。
読むのと読まないのがある、ってだけかと。

360 :名無しさん@お腹いっぱい。:02/10/17 19:14
grep smtp /etc/services
echo smtp /etc/services | xargs grep


361 :346:02/10/17 19:25
>>360
なるほど!

362 :名無しさん@お腹いっぱい。:02/10/22 06:12
FreeBSD であるスライスの使用容量を % の値で欲しいです。

df /hoge |tail -n 1 | cut -d'' -f5 | sed -e "s/%//"

こんなふうにしてみたのですが、取得できないです。
(''で囲まれている空白はタブです)
df の出力の 5 カラム目を取得するには awk を使わないと
だめでしょうか? awk は出来ないので困っています。

よろしくお願いします。

363 :362:02/10/22 06:15
あ、ちょっと調べたら簡単だった。スマソ。

df /data |tail -n 1 | awk '{print $5}' | sed -e "s/%//"


364 :名無しさん@お腹いっぱい。:02/10/22 06:38
>>363
df | awk '/\/data$/ {print sub("%", "", $5)}'


365 :363:02/10/22 07:19
もうひとつ。
hoge が 0〜50 の時 aa、51〜100 の時 bb を表示したいのですが

case $hoge in
"[0-50]") echo "aa" ;;
"[51-100]")echo "bb" ;;
esac

これだとうまくいきません。
0〜50 ってどう表せばいいのでせうか?

366 :名無しさん@お腹いっぱい。:02/10/22 08:14
>>365
if [ $hoge -ge 0 -a $hoge -le 50 ]; then
....
fi

367 :名無しさん@お腹いっぱい。:02/10/22 08:25
それってまったく意味不明な正規表現じゃないか。
caseって一つの値しかいけないんじゃないか?
だからcaseでやろうとすると100個かかないといけない。
if [ $hoge -ge 0 -a $hoge -le 50 ];then
echo "aa"
elif [ $hoge -ge 51 -a $hoge -le 100 ];then
echo "bb"
fi

368 :名無しさん@お腹いっぱい。:02/10/22 08:27
>365
[0-9]|[1-4]?|50) echo "aa";;


369 :名無しさん@お腹いっぱい。:02/10/22 12:10
sedで
ファイルの下から5行を削除する方法を教えてください。

370 :名無しさん@Emacs:02/10/22 12:26
>>369
wc -l でファイルの行数数えれ

371 :363:02/10/22 16:05
>>366-368
さんきゅ。出なおしてきます。

372 :名無しさん@お腹いっぱい。:02/10/22 17:32
>>369
#!/usr/bin/sed -n -f
H
6,${
g
P
s/[^\n]*\n//
h
}

#!/usr/bin/awk -f
{line[NR] = $0}
NR>5{print line[NR-5]; delete line[NR-5]}


373 :名無しさん@お腹いっぱい。:02/10/22 18:15
#!/bin/sh

url="http://www.hage.com/"
protocol=`echo $url | sed 's|^\([^:]\{3,5\}\)://.*|\1|'`

すいません。
sedで、シングルクオートでかこっているのに、何故 ( や { をエスケープしなきゃならんのですか?

374 :373:02/10/22 18:26
自己解決しました。jman grep を読んでたら以下のことが出てました・・・
何やってんだろ、俺・・
-----------------------
基本正規表現では、メタ文字 ?, +, {, |, (, ) は、その特殊な意味を失います。代わりに、バックスラッ シュ
を付けた ?, +, {, |, (, ) を使用してください。
-----------------------

375 :名無しさん@お腹いっぱい。:02/10/22 18:29
shの特殊文字は''でエスケープすれば解釈されないが、
''でくくってもsedの特殊文字は解釈されてしまう。

376 :名無しさん@お腹いっぱい。:02/10/22 18:48
>>373
' ' はシェルが解釈しないようにするため。
これで sed に ' ' の中身がそのまま渡る。
んで、sed が ( とか { を解釈しないようにするために
\ が必要。

377 :373:02/10/22 19:21
>>375,376
なんとなくわかった・・かな?(w
ありがとう。

378 :名無しさん@お腹いっぱい。:02/10/22 19:38
>>376
sed の場合、逆で、
( を解釈してもらうために \( とするんだけど・・

379 :名無しさん@お腹いっぱい。:02/10/22 23:15
sedって使う意味あるのか?文法わけわかんねえし、置換だったらperl -peでやれば
いいとおもう

380 :名無しさん@お腹いっぱい。:02/10/22 23:24
>>379
sed を使う意味は当然ある。
文法のわけがわからないと思うのは君の修行が足りない。
perl しか知らないのは恥ずかし過ぎる。

381 :名無しさん@お腹いっぱい。:02/10/22 23:42
sed無くても別に困らん。
perlのほうがいいんだったらperlでしょ。
まぁ、rubyに比べれば糞には違いないが。

382 :名無しさん@お腹いっぱい。:02/10/22 23:46
vid無くても別に困らん。
emacsのほうがいいんだったらemacsでしょ。
まぁ、秀丸に比べれば糞には違いないが。

383 :名無しさん@お腹いっぱい。:02/10/22 23:48
>>382
| vid無くても別に困らん。

vidとは?


384 :382:02/10/22 23:56
こういうときのtypoほど恥ずかしいものはない…

さあて、ちょっくら逝ってきますか

385 :名無しさん@お腹いっぱい。:02/10/23 00:07
KERNELよりもGHOSTのほうがナウい。

386 :名無しさん@お腹いっぱい。:02/10/23 07:14
>>381
じゃあ、rcスクリプトの中でも perl使うの?

387 :名無しさん@お腹いっぱい。:02/10/23 22:11
>>386 「消費者」ってやつが紛れ込んでいるようです。

388 :名無しさん@お腹いっぱい。:02/10/25 00:28
>>386
方法論は人それぞれじゃないの?

389 :名無しさん@お腹いっぱい。:02/10/25 07:28
>>388
人それぞれじゃなくて、
rcスクリプトでperl使ったらシステム的にハマります。

390 :名無しさん@お腹いっぱい。:02/10/25 11:36
なんで?

391 :名無しさん@お腹いっぱい。:02/10/25 12:45
/usr がマウントできなかったらエライことなるっしょ

392 :名無しさん@お腹いっぱい。:02/10/25 12:58
lr-xr-xr-x 2 root wheel 8 Oct 25 13:56 /bin/perl -> /bin/perl_static
-r-xr-xr-x 2 root wheel 5437689 Oct 25 13:56 /bin/perl_static

いやぁーーーーーーーーー!!

393 :名無しさん@お腹いっぱい。:02/10/25 13:11
/usr も / に入れちゃえ。

394 :名無しさん@お腹いっぱい。:02/10/26 13:29
macosx では /usr が分離できませんが何か?
ていうかlibc.so(に相当するやつ)が/usr/libにありますが何か?

395 :名無しさん@お腹いっぱい。:02/11/14 19:38
>>394
> macosx では /usr が分離できませんが何か?
できる。

396 :394なわけだが:02/11/15 00:02
聞いたことないよ。
% otool -L /bin/sh
/bin/sh:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 55.0.0)

どうやって回避するの?

397 :名無しさん@お腹いっぱい。:02/11/20 00:29
"ほげほげ"っていう文字列を mailコマンドの Subjectに使うために
"=?ISO-2022-JP?..."にするにはどのようなコマンドで符合化すれば良いのでしょうか?

↓"???"の部分が分かりません。"mimencode -u"でもないみたいですし...。
subject=`echo "ほげほげ" | nkf -j | ???`


398 :名無しさん@お腹いっぱい。:02/11/20 00:53
>>397
subject=`echo "ほげほげ" | nkf -M`


399 :397:02/11/20 01:14
>>398
Namazu用に バージョンを1.7に抑えていましたが、
1.9にあげたら出来ました。ありがと〜


400 :ふなむしさん:02/11/20 22:45
400もらった〜

401 :かやばちょう:02/11/27 15:11
シングルコーテーションとダブルコーテーションの違いって何?
変数の設定とかする時に使うんだけど、どの本みてもシングルコーテーション
又は、ダブルコーテーションを使用する。

って感じで、ちゃんとした説明が載ってないんです。
詳しい違いとかを知っている方教えてください。

402 :名無しさん@お腹いっぱい。:02/11/27 15:15
>>401
man は読んだ?

403 :名無しさん@お腹いっぱい。:02/11/27 15:19
>>401
echo "$PATH"
echo '$PATH'

404 :名無しさん@お腹いっぱい。:02/11/27 16:46
クォーテーションって書いてある本買え

405 :名無しさん@お腹いっぱい。:02/12/02 10:54
えーと、色々見つけたんでしおり代わりにはさんでおく

入門
http://www.d7.dion.ne.jp/~jin_n/index.html
http://homepage1.nifty.com/~tetsu/linux/cmd/sh.html
http://www.math.h.kyoto-u.ac.jp/~takasaki/edu/c/cshell.txt
http://freebooks.info.nara-k.ac.jp/archive/ShellProgramming/

読み物
http://www.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO.html
http://www-6.ibm.com/jp/developerworks/linux/000714/j_bash.html
http://www-6.ibm.com/jp/developerworks/linux/000714/j_bash2.html
http://www-6.ibm.com/jp/developerworks/linux/000714/j_bash3.html

リファレンス
http://www.linux.or.jp/JF/JFdocs/Bash-Prog-Intro-HOWTO.html
http://x68000.startshop.co.jp/~68user/unix/shell-variable.html

406 :名無しさん@お腹いっぱい。:02/12/19 03:59
FTPを自動実行させた際の
ファイル転送の結果をファイルに出力することは可能でしょうか?

407 :名無しさん@お腹いっぱい。:02/12/19 08:42
>>406
言ってることがよくわからん。

408 :名無しさん@お腹いっぱい。:02/12/19 10:37
ログじゃだめなの?(自鯖だった場合だが)

409 :名無しさん@お腹いっぱい。:02/12/19 14:15
dd if=/dev/acd0t1 of=track01.raw bs=2352
dd if=/dev/acd0t2 of=track02.raw bs=2352
dd if=/dev/acd0t3 of=track03.raw bs=2352
dd if=/dev/acd0t4 of=track04.raw bs=2352

上記のような作業をCD1枚分繰り返しているのですが
これをシェルスクリプトで楽にしたいのですが
どう書けばいいですか?

これさえわかれば関連する作業も楽になるので
ヒントだけでも教えて下さい。


410 :名無しさん@お腹いっぱい。:02/12/19 14:18
スレ違いながらあえて。負け犬とよばれてもよければ grip という
GUI インターフェース便利よ。 CDDB 対応。

411 :名無しさん@お腹いっぱい。:02/12/19 14:26
>>410
ゴメンナサイ、大変ありがたい情報なのですが
エンコードは鯖にさせてるんでGUIは使えないのです。
ddとgogoを使って一気にやってしまいたいのですが
スクリプトの事がよくわからないんで質問させて頂きました。


412 :名無しさん@お腹いっぱい。:02/12/19 16:17
for i in 1 2 3 4; do
dd if=/dev/acd0t$i of=track0$i.raw bs=2352
done


413 :406:02/12/19 22:37
>>407>>408
ftpでファイルをgetした時の
転送時間かスループットを
ファイルに書き出したいと思ったんですが
ftpとの対話中に表示される文字を取得することは
やはり無理なんですかね

414 :名無しさん@お腹いっぱい。:02/12/19 22:49
>>413
script(1) とかか?
ports/misc/screen あたりも試してみれ。

415 :414:02/12/19 22:51
あ、ごめん。
3行目を「screenも試してみれ。」に訂正。
ついでに

screenってどうよ
http://pc.2ch.net/test/read.cgi/unix/1001966406/


416 :名無しさん@お腹いっぱい。:02/12/19 23:14
>>413
SIGINFO シグナルを受けつけないかね?
FreeBSD の ftp ならできるけど。ftp(8) より引用:

>その時点での転送レートの統計情報が終了時の標準的なフォーマット
>と同じ形式で標準エラー出力に書き出されます。

lftp だと ~/.lftp/log に
[299] 開始。 Thu Jan 24 15:24:59 2002
[299] 完了。 Thu Jan 24 15:30:20 2002
といった感じでできたりする。スループットでないけどね。

417 :406:02/12/20 00:00
>>414>>415>>416
どうもありがとうございます。
ご助言頂いたことについて調べてみます。
またお聞きするかもしれませんが
その時はよろしくお願いします。

418 :名無しさん@お腹いっぱい。:02/12/22 02:40
ddって使ってないんでよく分かりませんけど、
gogoも使うってことは CDの曲を mp3に変換したいってこと?
それなら cdda2mp3っていうスクリプト作ったけど。


419 :名無しさん@お腹いっぱい。:03/01/04 20:50
そういや、cdda2mp3 って腐ってたよな
だれもなおさないんだな

420 :山崎渉:03/01/15 13:12
(^^)

421 :名無しさん@お腹いっぱい。:03/02/01 11:04
だれか教えてください。
シェルスクリプト中で変数の値にバックスラッシュを含む文字列を
代入できないの? 指定したディレクトリ以下のHTMLファイルのリスト
をWindows形式のパスに変換してCSVで出力するスクリプトだけど、
3行目と8行目でエラーがでます。
echo $relpath | sed -e 's/\/\\/g' なら画面上に表示されるのに
代入しようとしたらエラーが出ます。なぜ??

#!/bin/sh

export WINPATH="C:\HTML_List\"
export ofname=$2
for fname in `tree $1 | awk '/html/ {print $NF}'`
do
export relpath=`find $1 -name $fname -print`
export winrel=`echo $relpath | sed -e 's/\/\\/g'`
echo "$WINPATH$winrel, $relpath" >> $ofname
done


422 :名無しさん@お腹いっぱい。:03/02/01 11:11
>421
# man sedしる。

sed -e 's/\\/\\\\/g'

423 :421:03/02/01 13:23
>422
すみません。間違いです。スラッシュをバックスラッシュに変換しようと思い、
sed -e 's/\//\\/g'
としました。コマンドラインで実行するとエラーは起こらないのに、スクリプト中で
export winrel=`echo $relpath | sed -e 's/\/\\/g'`
と変数に代入しようとするとエラーが出ます。

ちなみに
export winrel=`echo $relpath | sed -e 's/a/b/g'`
のような a->b の変換ならうまくいきます。バックスラッシュを含んだ文字列
を代入することに問題があるように思えるのですが・・。


424 :名無しさん@お腹いっぱい。:03/02/01 14:23
>>421
tr '\\' /

425 :名無しさん@お腹いっぱい。:03/02/01 14:44
なんでexportしてんのかよく分からんけど、普通にこれで行けた。

#! /bin/sh
i=/foo/bar
j=`echo "$i"|sed 's,/,,g'`

426 :名無しさん@お腹いっぱい。:03/02/01 23:30
超初歩的な質問なのですが、
echo $$
echo filename_$$
とかででてくる $$ はなにを表しているのですか?
シェルスクリプトのサンプルででてきたのですが、分からなくて、、、

427 :名無しさん@EMACS21:03/02/02 00:45
>426

man csh



428 :名無しさん@Emacs:03/02/02 01:12
>>426
PID

429 :名無しさん@お腹いっぱい。:03/02/02 02:08
>>427
csh のマニュアルはありません。
といわれますた。

>>428
thanks
$$ は UFD と。

430 :名無しさん@お腹いっぱい。:03/02/12 02:27
ほしゅ!

431 :名無しさん@お腹いっぱい。:03/02/12 06:25
grep で、ファイル名と行番号 だけ を出力する方法って無い?

432 :名無しさん@お腹いっぱい。:03/02/12 06:31
grep -n EXPR *| cut -d: -f1,2

433 :名無しさん@お腹いっぱい。:03/02/16 05:25
>>432
それしかないんか・・・
処理的にはgrepは本文も出力してるわけで
ファイルが大量な場合その処理時間が惜しいと思うんだけど
grepにパッチあてるしかないのかな

とか思ってgrepのソース見たけど、全くわかんね

434 :名無しさん@お腹いっぱい。:03/02/16 12:40
grepで、と指定されたからわざわざgrep使ってみたんだと思われ。
処理時間が惜しいならCで望みのフィルタ書けばいいだろ。
それに文字列を最低一回以上スキャンしなきゃいけないんだから、最高でもO(n)だ。

435 :名無しさん@お腹いっぱい。:03/02/16 13:42
>>433
1) あまり美しくはないし「効率をケチりたい」という要求にはそぐわないが
$ perl -ne '
 $. = 1 if ($ARGV ne $prev);
 $prev = $ARGV;
 print "$ARGV:$.\n" if (/hoge/);
' fileA fileB..

2) (f)lexを使う
3) GNUのgrepなら、多分grep.cのprline()だよ。オプション化するなら
他もいじる必要が有るが。



436 :名無しさん@お腹いっぱい。:03/02/16 14:36
grepのソースをいじるぐらいの時間があるなら
cutの処理時間をガマンした方がマシと思われ。

DOSじゃないんだからパイプ処理にそんなに時間がかかるわけないだろ。


437 :名無しさん@お腹いっぱい。:03/03/08 01:41
sedを使って、ファイルの中にある改行をあるキーワードを元に削除する
スクリプトの書き方をを教えてください。
例えば、
○元ファイル(test.txt)
AAA = 123
BBB = 111
AAA = 987
BBB = 254
○実行結果
AAA = 123,BBB = 111
AAA = 987,BBB = 254
ってな感じなんですが。



438 :名無しさん@Emacs:03/03/08 05:01
>>437
sed '/^AAA/{N; s/\nBBB/,BBB/}'
by gnu sed 4.0.5

439 :名無しさん@お腹いっぱい。:03/03/09 16:38
Directory名を取り出すにはどうしたらよいの?
今はこうしているんだけれど、もっと簡便にできるよね。
DIR=`pwd`
cd ../
DD=`pwd`
cd "$DIR"
DN=`echo "$DIR" | sed "s|$DD/||"`

440 :名無しさん@お腹いっぱい。:03/03/09 16:50
dirname コマンドを使うのはダメ?

441 :名無しさん@お腹いっぱい。:03/03/09 17:10
おおう。そんなコマンドがあったのか。だとすれば、
DIR=`pwd`
DD=`dirname "$DIR"`
FN=`echo "$DIR" | sed "s|$DD/||"`
で済むってことですな。
THX!>>440

442 :名無しさん@お腹いっぱい。:03/03/09 17:13
>>439
やりたいことがわからんけど、
/usr/local/bin
なら、
bin
って文字列が欲しいってなら、
basename $PWD
でどーよ?


443 :名無しさん@お腹いっぱい。:03/03/09 17:21
>>442

それです。それが欲しかったのです。有り難うございます。

444 :名無しさん@お腹いっぱい。:03/03/13 03:27
あるディレクトリ以下にCVSというフォルダがいくつかあり(一階層下や二階層下...)
それを削除したいです。そこで
find . -name CVS -exec rm -r {} \;
というコマンドで消すことはできたのですが
「find: ./CVS: そのようなファイルやディレクトリはありません」
というエラーメッセージが出てしまいます。
どこで間違ってるのでしょうか?

445 :名無しさん@お腹いっぱい。:03/03/13 03:41
>>444
find . -type d -name CVS -print |xargs rm -rf

446 :444:03/03/13 06:25
>>445
ありがd。
うまくいきました。
でもどうしてその違いが出てくるのかわからないです・・・。

447 :445:03/03/13 07:31
>>446
rmの前にechoを入れて
find . -name CVS -exec echo rm -r '{}' \;
どんなふうにrmコマンドを実行していってるか見るよろし。

448 :444:03/03/13 14:56
やっぱりわからないです(´Д⊂

$ find . -name CVS -exec echo rm -r '{}' \;
rm -r ./CVS
rm -r ./a/CVS
rm -r ./b/CVS
rm -r ./b/b1/CVS
rm -r ./c/CVS

$ find . -type d -name CVS -print | xargs echo rm -rf
rm -rf ./CVS ./a/CVS ./b/CVS ./b/b1/CVS ./c/CVS

違うといえば違うんでしょうが前者で
「find: ./CVS: そのようなファイルやディレクトリはありません」
と出る理由がサパーリ。
結局同じ事に見えるです。

449 :名無しさん@お腹いっぱい。:03/03/13 16:11
find . -print
find . -depth -print
を見比べれ

450 :山崎渉:03/03/13 16:28
(^^)

451 :445:03/03/13 16:31
>>448 実はrmのフラグの違いだったりして

452 :444:03/03/13 18:09
>>449
$ find . -type d -name CVS -print
$ find . -type d -name CVS -print -depth
$ find . -name CVS -print
$ find . -name CVS -print -depth
全て
./CVS
./a/CVS
./b/CVS
./b/b1/CVS
./c/CVS
になりました。

>>451
試してみましたが違いました。

ところでエラーメッセージが出るのもしかして私のところだけなんでしょうか?(汗
$ mkdir -p CVS a/CVS b/CVS b/b1/CVS c/CVS
で作った環境でテストしてます。

453 :名無しさん@お腹いっぱい。:03/03/14 18:45
>>452
find が cd した directory を消しちゃって、 cwd がなくなっちゃった、とかなのかな…
とりあえず、 -prune 指定するとそういう error message はでないみたいだけど…

454 :ヒロ佐藤:03/03/18 18:44
readコマンドを使わないで、対話的にコマンドラインからの文字列を
変数に入力って、できますか?できませんか?できまセントーン?

455 :名無しさん@お腹いっぱい。:03/03/18 19:12
何でそんなことをしたいのかさっぱりわからんのだが。
read 使えばいいじゃねーの。とかいいつつ。

#!/bin/sh
tty=`tty`
a=`head -1 $tty`
echo $a

リダイレクトされてるとコケます。


456 :名無しさん@お腹いっぱい。:03/03/19 06:58
foo=`head -1 /dev/stdin`
echo Inputted $foo

とか…

457 :名無しさん@お腹いっぱい。:03/03/22 20:11
あるディレクトリにたくさんの以下のようなファイルがあります。
001_x001.html
001_x002.html
001_x003.html
001_x004.html
001_x005.html
............

これをスパッと一発で以下のようにリネームする方法を教えて下さい。

001_001.html
001_002.html
001_003.html
001_004.html
001_005.html
001_006.html


458 :名無しさん@お腹いっぱい。:03/03/22 20:38
>>457

こんな一行野郎でどう?

for i in *.html; do mv `echo $i | sed "s/\(.*\)_\(.\)\(.*\)/\1_\2\3 \1_\3/"` ;done


459 :458:03/03/22 20:40
あ、エラー処理してないんで(w


460 :名無しさん@お腹いっぱい。:03/03/22 20:44
本能で書くと
\ls -1 | awk '{print "mv " $0 " " gensub("x","","",$0)}'|sh

だいたいいつもは (for csh )
foreach f (*)
mv $f `echo $f|sed s/x//'
end

気が向いたら csh の変数置換(:) (今は気が向かない)

なにも考えたくなかったら editor でばさっと

461 :458:03/03/22 20:47
for i in *.html; do mv `echo $i | sed "s/\(.*\)_x\(.*\)/\1_x\2 \1_\3/"` ;done

の方が安全っぽい鴨。


462 :458:03/03/22 20:57
>>460
そうか、そういえばそれで済むか(苦笑

sh(bash)なら

for i in *.html; do $i `echo $i | sed "s/_x/_/"` ; done


463 :457:03/03/22 20:58
>>458-461
スペシャルサンクスです。

なるへそ、バッククォートを使うのですか〜。
これから精進致します。

464 :457:03/03/22 21:05
>>460
連カキだが、一生懸命にmanを読んで解決しようとしたのだが、
シェルの変数置換がちっと理解できませんでした(⊃д`)

これを使ったやり方も教えて欲しい。cshとbashの両方を。

465 :名無しさん@お腹いっぱい。:03/03/23 00:15
とりあえずshでやるとこんなもんかな。
for i in 001_x???.html
do
  mv -f $i 001_${i#*_x}
done


466 :名無しさん@お腹いっぱい。:03/03/25 20:59
シェルの勉強をしてるのですがfindでこういう事ってできますか?

find -name "*.htm"
というのでワイルドカード検索できるのは解ったのですが
たとえば JavaとEJBとhtmを順番は関係無しに含まれてるファイルを検出することはできるのでしょうか?


467 :名無しさん@お腹いっぱい。:03/03/25 21:55
意味不明
落ち着いて書くべし

468 :466:03/03/25 23:05
>>467
たとえば
HOGEabcFOOdef.cpp
とか特定のキーワードを複数含んだファイルを検索したいのです

findで行うと
find -name "HOGE*FOO*.cpp"とすると
HOGEabcFOOdef.cppはヒットすると思うのですが
FOOabcHOGEdef.cppはヒットしないですよね?

そういうキーワードを含んだファイルを検索したいのです



469 :名無しさん@お腹いっぱい。:03/03/25 23:11
-name "*HOGE*.cpp" -name "*FOO*.cpp"

470 :名無しさん@お腹いっぱい。:03/03/25 23:27
>>469
そりゃあ and だって。or にするには -o。

後は man の中の -o とか見れ。>>466

471 :470:03/03/25 23:29
>>470
しまった 468 良く見ると and でもいいじゃんか。

落ち着いて書くべし>俺

472 :466:03/03/25 23:42
>>469
サンクス!!

>>471
サンクス!!
そっちも試してみるっす

473 :名無しさん@お腹いっぱい。:03/04/01 00:38
if 10 < a then hoge.sh

変数って扱えるの?

474 :名無しさん@お腹いっぱい。:03/04/01 00:59
>>473
man [

475 :名無しさん@お腹いっぱい。:03/04/01 03:16
             ∩
        ∧_∧   | |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
       (  ´Д`)//  < 先生!こんなのを発見シマスタ!
      /       /    |
     / /|    /      \  http://saitama.gasuki.com/shinagawa/
  __| | .|    |         \
  \   ̄ ̄ ̄ ̄ ̄ ̄ ̄\     \_____________
  ||\             \
  ||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
  ||  || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
     .||              ||

476 :名無しさん@お腹いっぱい。:03/04/01 12:14
bashのプロンプトで、行の右端に時間表示するのってどうやるんですか。
PS1="[\u@\h \W] \e[s\e[80D\e[68C(\t)\e[u"
とかやってみたんですが、
なんかプロンプトの入力が行の最後まで行かず、
同じ行で復帰してって変になるのです。
aaser@host dir] aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (12:10:47)
↑こんな感じになっちゃう


477 :名無しさん@お腹いっぱい。:03/04/01 12:18
> bashのプロンプトで、行の右端に時間表示するのってどうやるんですか。
bashでこんなこと出来るの?zshじゃなくて?

478 :名無しさん@お腹いっぱい。:03/04/01 12:28
>476
ttp://www.linux.or.jp/JF/JFdocs/Bash-Prompt-HOWTO-10.html
ってのは参考にならないかな?

479 :名無しさん@お腹いっぱい。:03/04/01 12:45
連番のファイルを、あるファイル中でリストされてる名前にリネームしたい場合、
zsh 利用して
% for i in {01..10}; do mv *${i}* "`sed -ne ${i}p FILE`" ;done
で一応できるのですが、毎回 sed が起動されてたりして汚いです。

% i=01;cat FILE|while read l; do mv *${i}* $l; iを inc; done
みたいには出来ないでしょうか? (i が 1 からなら楽だけど、01 からなので)

480 :名無しさん@お腹いっぱい。:03/04/01 13:06
>>478
PROMPT_COMMANDっての使わないと駄目みたいですね。
↓でできましたありがとうございます。
PROMPT_COMMAND="echo -en '\e[s\e[69C'\(\$(date '+%H:%M:%S')\)'\e[u'"
PS1="[\u@\h \W] "

>>477
「カーソルが右端に届いたら時計をまとめて消す」、
というようなことはzshじゃなきゃできないかも。

481 :名無しさん@お腹いっぱい。:03/04/02 21:51
grep "^age" sage.txt | wc -l
この結果を変数に代入したいんですが、どうしたらいいですか?
その値を使って、条件分岐などしたいので

482 :名無しさん@お腹いっぱい。:03/04/02 21:54
>>481
HENSUU=`grep "^age" sage.txt | wc -l`

483 :名無しさん@お腹いっぱい。:03/04/02 23:00
grep -cなんてオプションがあったりなかったり

484 :481:03/04/02 23:27
>>482
これは、文字列か値どちらとして代入されるんでしょう?
聞いてばかりじゃなんなんで自分で試してみたいと思います。
どうもありがとう

>>483
grep "^age" sage.txt | wc -lとgrep -c "^age" sage.txt
で同じになるんですね。パイプでつないでやるよりスマートでイカシてます。
どうもありがとう

485 :名無しさん@お腹いっぱい。:03/04/03 02:54
>>484
単純なコマンド(or知ってる範囲のコマンド)をパイプでつないで
複雑な仕事を果たすやり方も悪いわけじゃないよ。
逆にその方が、コマンドにいろいろスイッチ(機能)を詰め込むより
UNIXぽいし。

そもそも昔は(今もシステムによっては)grepに-cなんてなかった。
だから>>483さんは「あったりなかったり」と書いたんだろな。

486 :名無しさん@お腹いっぱい。:03/04/03 06:27
hoge
ahya
hoge
foo
hoge
foo
と書かれたファイルを読み込んで
hoge 3
ahya 1
foo 2
と単語ごとの回数を数え上げたいのですが何かいい方法ありませんか?

487 :名無しさん@お腹いっぱい。:03/04/03 06:38
>>486
何も考えないで
sort txt | uniq | while read i; do echo -n "$i "; grep -c $i txt; done
ってやってみた。効率悪いけど小さいなら、いいんじゃないかな。


488 :名無しさん@お腹いっぱい。:03/04/03 10:00
>>486
perlと言痛いところだけど、それじゃシェル講座にならないからawkで
awk '{count[$1]++} END{for (word in count) print word, count[word]}'
でどうよ。

489 :名無しさん@お腹いっぱい。:03/04/03 10:03
ふつーに sort | uniq -c でええやん。

490 :名無しさん@お腹いっぱい。:03/04/03 10:04
>>487
uniq の -c はどこでもあるんじゃないか?

491 :名無しさん@お腹いっぱい。:03/04/03 17:09
sort | uniq -c は常套手段だろ。たしか「UNIXプログラミング環境」にもあったはず

492 :名無しさん@お腹いっぱい。:03/04/06 04:19
while read {変数リスト}
do
{処理}
done < hoge.txt

hoge.txtに沢山レコードがあってその最後の奴だけ取り出したいんだけど、
馬鹿正直にレコードの数だけ変数を書かないと無理ですか?
shiftさせればいけるかなと思ったんだがreadで入れるとshiftの対象にならないようだし。

493 :名無しさん@お腹いっぱい。:03/04/06 05:42
>>492
awk じゃだめ? とってもシンプルに書けるのだけど
% awk '{print $NF}' hoge.txt

494 :名無しさん@お腹いっぱい。:03/04/06 05:58
shell が bash だったら、 read -a で配列に読んで最後の要素とか。

495 :名無しさん@お腹いっぱい。:03/04/06 06:10
tail -1 じゃだめなの?


496 :名無しさん@お腹いっぱい。:03/04/06 13:38
read a
set -- $a
eval last=$"$#"
echo $last

>>495 題意を取り違えておるようです。


497 :名無しさん@お腹いっぱい。:03/04/06 21:02
>>493,494,496
できたー。ありがとう

498 :山崎渉:03/04/17 12:00
(^^)

499 :山崎渉:03/04/20 06:18
   ∧_∧
  (  ^^ )< ぬるぽ(^^)

500 :名無しさん@お腹いっぱい。:03/04/23 03:26
cat
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >_Λ∩
  _/し' //. V`Д´>/
 (_フ彡        / ←>>山崎渉 

とすると、山崎渉というファイルに追加書きされます。
そして500ゲッツ。

501 :名無しさん@お腹いっぱい。:03/04/29 20:26
シェルスクリプト中で su や telnet 等のコマンドを使うと、パスワード入力の
箇所で止まってしまいます。これを回避する方法は無いでしょうか?
password が root のパスワードだとして、以下の方法では駄目でした。

#! /bin/sh
echo password | su

#! /bin/sh
su `echo password`

502 :名無しさん@お腹いっぱい。:03/04/29 20:44
>>501 expect を使いなされ。

根本的にはスクリプト中で su や telnet を使う設計をどうにかした方がいい。

503 :名無しさん@お腹いっぱい。:03/04/29 21:59
>502
ありがとうございます。
expect は標準では入ってませんでした。どのマシンでも実行出来るスクリプトを
作るのは難しいのですね。

504 :名無しさん@お腹いっぱい。:03/04/29 23:17
こういう方法もある

#!/bin/sh -
(sleep 5; echo "username"; sleep 5; echo "password"; sleep 5; echo "who"; sleep 5 ) | telnet hostname


505 :名無しさん@お腹いっぱい。:03/04/29 23:37
>>504
telnet は運が悪いとそうやってもコケることがあるし、
そもそも su ではその手は使えない。

506 :名無しさん@お腹いっぱい。:03/04/29 23:48
>504
凄い!!
出来ました。サブシェルは使った事無かったのですが、そういう風にも使える
のですね。どうもありがとうございました。

(sleep 3; echo "password"; sleep 5; echo id ) | su


507 :名無しさん@お腹いっぱい。:03/04/29 23:52
>>502 に同意。
root 権限が必要なら始めから root で実行すればいい。
sudo とか rsh/ssh とか便利な道具は他にもある。

508 :名無しさん@お腹いっぱい。:03/05/08 00:11
あれ?
telnetって.netrcにpasswordの設定しとけば、
password聞いてこなかったような。。。
ちなみにtelnetをshellの中で使ってもシェルはそこで止まってしまうのでは?
シェルで遠隔操作したければ、.rhostsの設定してから、rshを使うのが
上等手段かと。

509 :508:03/05/08 00:17
自己レス・・・
そういえば、telnetでも、
telent  host <<!
処理
・・・
!
で、できたかな?

510 :名無しさん@お腹いっぱい。:03/05/08 00:43
>>508 .netrc で自動ログインできるのは ftp だ。
>>509 上のレス読んでる?

511 :508:03/05/08 01:23
>>508 .netrc で自動ログインできるのは ftp だ。
たしかにftpだ。
>>509 上のレス読んでる?
読んでない。

もちつけ>俺

512 :山崎渉:03/05/22 02:05
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―

513 :座敷荒氏:03/06/17 23:42
はじめまして。
新卒未経験で運用に携わる事になったのですが
いきなりシェルとPerlをつかってファイルの存在確認を
することができるようにと言われて困っています。

perlでファイルの存在を確認して
結果を子シェルに渡し、
子シェルから親シェルへさらに結果を渡し…
というような形になるのが正しいでしょうか?

なきそ…

514 :名無しさん@お腹いっぱい。:03/06/18 00:14
>>513 perldoc -f -f

515 :名無しさん@お腹いっぱい。:03/06/18 00:32
…はあはあ。なるほど。

「引数で指定したファイルが存在すれば読み込んで画面に表示、存在しなければ“Cannot find ファイル名 !”と表示」

とかいう動作するシェルスクリプト&Perlスクリプト1個づつ作って持ってけ。
両方の基礎を勉強すればできる。
Perlやシェルスクリプトを今後も仕事で使いそうならそれぞれ本買え。

516 :名無しさん@お腹いっぱい。:03/06/18 00:35
あー、「両方ともそれぞれの基礎を勉強すれば」、だね。
シェルスクリプトやPerlスクリプトだけでできる。

スクリプティングの世界へようこそ。

517 :座敷荒氏:03/06/18 01:23
よくわからないのは
なぜ親シェル⇔子シェル⇔Perlを使うのか。
それぞれなにをするのかがわからないのです。

全部ひとつのシェルでやればいいのに…
情報系のお勉強をしてなかった文系エンジニアなので…

でもがんばりまする。

ちなみにどちらの本も買ってきてあります。
しかし、ゆっくり読んでる暇もない…

518 :名無しさん@お腹いっぱい。:03/06/18 01:30
(しばらく考えて)その親シェルだとか子シェルだとかの要らん知識は誰から聞いたんだ?

519 :座敷荒氏:03/06/18 01:38
あ、実はAJS上でおこなうので
一定の条件でエラー番号を変えることができるように
こんなふうにしているのだとおもいます。

なのでほかのジョブも
みんな親シェル⇔子シェル⇔Perlとなっています。

520 :名無しさん@お腹いっぱい。:03/06/18 08:35
>>519
君に必要なのは人と話をして業務の引き継ぎをする能力です。
聞く相手を間違っています。

521 :名無しさん@お腹いっぱい。:03/06/18 23:54
shell script をシェルと言う >1 は市ね

522 :名無しさん@お腹いっぱい。:03/06/19 11:55
>.>521
同意同意。
あと、Warning をワーニングというヤツも市ね

523 :名無しさん@お腹いっぱい。:03/06/19 11:59
市ねとか言う香具師も

524 :ヤシ:03/06/19 12:00
香具師とかいう椰子も

525 :名無しさん@お腹いっぱい。:03/06/19 12:19
1年以上前の>>1にマジレスしてる椰子も。

526 :名無しさん@お腹いっぱい。:03/07/06 11:57
パスの最後を取りだすにはどうしたらいいんでしょう?

例えば$AHOが
    /usr/local/bin/aho
だったら, ahoだけが取りだしたいです

527 :名無しさん@お腹いっぱい。:03/07/06 12:02
>>526
basename

528 :名無しさん@お腹いっぱい。:03/07/06 14:54
>>526
${AHO##*/}


529 :名無しさん@お腹いっぱい。:03/07/08 00:35
echo a b | read c d
echo $c $d

の出力が、
a b
にならないシェルで、こういう出力を得るには、一旦ファイルに
落とさなければならないのでしょうか

530 :名無しさん@お腹いっぱい。:03/07/10 17:18
>>529

どんなシェルぢゃい?

分割については、sh 系なら set コマンドでできるぞ。

(記憶があいまいだが、set -- 文字列で、
$1〜$9 に分割されたような…)

531 :名無しさん@お腹いっぱい。:03/07/11 00:45
>530 ってどういう事?

532 :名無しさん@お腹いっぱい。:03/07/11 10:32
>>530
>どんなシェルぢゃい?

うちの手元ではパイプから read で代入できるのは
ksh と zsh だけのようだが。sh, bash, (t)csh では不可。
FreeBSD で man sh すると「標準入力が端末の場合」と明記されてる。

>>531
set -- a b
c=$1
d=$2
echo $c $d


533 :名無しさん@お腹いっぱい。:03/07/11 12:31
$ echo a b|(read c d; echo $c $d)

pipeがあるとsubshellが起動してしまうから
readと同じsubshellじゃないとechoできないのデス


534 :名無しさん@お腹いっぱい。:03/07/12 16:34
>532
あぁ、文字列が文字に分割される訳じゃないのね。

535 :山崎 渉:03/07/15 11:24

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

536 :名無しさん@お腹いっぱい。:03/07/31 17:49
#!/bin/sh
trap "exit 0" 2
sleep 100d
このファイルをtrap.shとします。
%trap.sh
と起動して、ctrl-cを押すと終了するのですが、
kill -2 (trap.shのpid)
としても終了しません。
kill -TERM (trap.shのpid)
trapしていないTERMでも終了しません。
なぜでしょうか?

537 :あぼーん:あぼーん
あぼーん

538 :_:03/08/02 06:16
http://homepage.mac.com/hiroyuki44/hankaku09.html

539 :_:03/08/02 06:39
http://homepage.mac.com/hiroyuki44/

540 :_:03/08/02 08:10
http://homepage.mac.com/hiroyuki44/jaz10.html

541 :名無しさん@お腹いっぱい。:03/08/02 20:26
☆ ☆ ☆ http://www.gals-cafe.com ☆ ☆ ☆

りさちゃんですっ☆みんな元気ぃ?夏だねっ!

あたしね、今アメリカにいるんだけど、、、えへっ(*>▽<*)

アナタに逢いたくて、こんなバイト始めちゃったヨ♪
りさに逢いに来てくれたら、7日間も会費無料サービスしちゃうし、
さらにさらに10分間も無料なんだよ! Σ(@o@)!!
アナタにだけの特別大っサービス♪絶対来てね!
二人っきりでたっくさん楽しいことしようよ♪まってるよ(^.^)/
☆ ☆ ☆ http://www.gals-cafe.com ☆ ☆ ☆

542 :名無しさん@お腹いっぱい。:03/08/14 00:43
1よ。俺のちんぽは昔から曲がっていた。
だから根性だけは曲がらないよう努めてきた。
しかしこのご時世には負けそうだ。
ちんぽは立たないし、根性が曲がりそうで怖い。
どうすれば良いかな?



543 :犬厨:03/08/14 13:25
このスレ読んではじめて
export HOGE=sage
ってのがbashやashでの拡張だと知ったよ。
普段から
HOGE=sage ; export HOGE
と書いていたから気づかなんだ。

544 :名無しさん@お腹いっぱい。:03/08/14 17:44
変数が数値かどうかテストするコマンド無いかしら?

if isnum $param; then
  pinsert to man co
fi
みたいな。

545 :名無しさん@お腹いっぱい。:03/08/14 17:55
>>544
つくれ

546 :544:03/08/14 18:06
>>545
そうか、ありがとよ。

547 :名無しさん@お腹いっぱい。:03/08/14 18:48
if expr "$param" : '\([0-9]*$\)' > /dev/null; then
echo $param is number
fi


548 :名無しさん@お腹いっぱい。:03/08/15 04:27
>>544
ちゃんと試してないけど、こんなのどうかな。

[ $parm -eq 0 ]
if [ $? -ne 2 ]; then
pinsert to man co
fi

549 :名無しさん@お腹いっぱい。:03/08/15 08:45
if [ "$a" = "$((a))" ]

550 :名無しさん@お腹いっぱい。:03/08/15 14:14
>>548
[ 3 -eq 0 ] = 1
[ a -eq 0 ] = 0でした。

551 :sage:03/08/15 18:06
sage() { sage; }; sage

552 :名無しさん@お腹いっぱい。:03/08/15 20:17
while read line
do
echo $line
done

というスクリプトを実行して、
bashのプロンプトのように
Control-Pでヒストリを表示するようなこと
はできますか?


553 :名無しさん@お腹いっぱい。:03/08/15 21:11
>>552
できません。

554 :名無しさん@お腹いっぱい。:03/08/15 21:53
まじっすか?

555 :あぼーん:あぼーん
あぼーん

556 :あぼーん:あぼーん
あぼーん

557 :名無しさん@お腹いっぱい。:03/08/29 12:09
cshで、foo.bar.comという文字列からbar.comだけを
とりだしたいときはどうしたらよいのでしょうか。
`hostname -s`の逆をやりたいのです。
domainnameてのは役目が違いますよね。


558 :名無しさん@お腹いっぱい。:03/08/29 12:26
>>557
hostname --domain

559 :名無しさん@お腹いっぱい。:03/08/29 12:50
% hostname --domain
hostname: ホスト名を `--domain' に設定できません: 所有者ではありません。

% expr foo.bar.com : '[^.]*\.\(.*\)'
bar.com


560 :名無しさん@お腹いっぱい。:03/08/29 15:14
>557
なるほど、exprはそうやって使うものですか。ありがとうございました。


561 :名無しさん@お腹いっぱい。:03/08/29 15:20
というか、:演算子があるんなら、
自分のマシンがbar.comに属しているかどうかは
expr `hostname` : '^.*bar.com'
で判別できるんですね。勉強になったです。


562 :名無しさん@お腹いっぱい。:03/08/29 15:35

でも私が書くとこんな感じになってしまう。動くことは動きますが、いかにも
おかしい感じです。
添削おねがいします。

set h = `hostname`
set tmp = `expr $h : '^.*bar.com'`
if ($?tmp && $tmp) then 〜


563 :名無しさん@お腹いっぱい。:03/08/30 13:32
hostname | cut -d. -f2-
しか思い付かんかった…

564 :名無しさん@お腹いっぱい。:03/09/01 19:06
すまんが、アホな質問にさせてくれ。
いくつかのスクリプトに共通する部分を(仮に)basic.shとまとめたいのだが、

## basic.sh
#!/bin/sh
VAL="hello world"
export VAL

## test1.sh
#!/bin/sh
../basic.sh
echo $VAL

test1.shから、basic.shの変数VALを読み込むにはどうしたらいい?
perlでのrequireに相当するやつが欲しいのだけど。

565 :名無しさん@お腹いっぱい。:03/09/01 19:32
.

566 :名無しさん@お腹いっぱい。:03/09/01 21:31
. /path/basic.sh
相対パスではできないと思う。

567 :名無しさん@お腹いっぱい。:03/09/01 21:46
>>564
.(ドット)コマンドを使って読みこめばよい。

## test1.sh
#!/bin/sh
. /path/to/basic.sh
echo $VAL

尚、この場合basic.shの一行目の"#!/bin/sh"は必要ではない。

568 :567:03/09/01 21:52
ついでにいえば、その場合はbasic.ahの最後の行のexportも不要だな。

569 :564:03/09/01 22:23
>>565-568
ありがとう。
ちょうど痒いところに手が届き無茶苦茶すっきりしました。

>>565
最初せっかくレスしてくれてるのに気がつかなんだよ(w

570 :名無しさん@お腹いっぱい。:03/09/03 16:20
下記のスクリプトについてなのですが。
テキストファイルを読みこませて、延々とゆっくり標準出力に吐かせようとしてます。

最初は^Cや^\で終了しなかったので、二行目を追加して終了するようにはしたのですが、
それでも子プロセスの終了を待ってからの終了になります。#送るシグナルを9番にしても同じでした。
どのようにすれば即座に終了するように出来ますか?

--------
#!/bin/sh
trap "/bin/kill -15 $$" 1 2 3
while :
do
cat $@ | awk '{ line = $0
  while ( length(line) > 0 )
  {  printf substr(line, 1, 1)
    line = substr(line, 2)
    system("sleep 0.1s") }
  printf "\n" }'
done

571 :名無しさん@お腹いっぱい。:03/09/03 16:54
初歩的質問で申し訳ないです・・。

#!/bin/csh -x
@ data_num = 1
while ( $data_num < 300 )
 set F1=`awk "NR=="$data_num" {print}" datalist.txt`

ftp -n -i 123.45.6.789 <<"END"
user hoge hage
prompt
cd /aa/
bi
get $F1
bye
END

@ data_num++
end

実行すると$F1というファイルを探してしまいます。
datalist.txtの中のファイル名のものをgetしてほしいのですが。
どなたかご教授を。

572 :名無しさん@お腹いっぱい。:03/09/03 16:58
>>571
<< "END" を << END にする(ダブルクォートやめる)といいんじゃないの。
でもそれ以前に csh スクリプトやめれ。

573 :名無しさん@お腹いっぱい。:03/09/03 17:10
シェル講座じゃなくてシェルスクリプト講座だよねw

574 :名無しさん@お腹いっぱい。:03/09/03 17:38
>>571
それだとファイルの1行ごとに ftp セッションを張ることになるので、
すんげー迷惑なんですが…。

#!/bin/sh
awk 'BEGIN{print "user hoge hage\nprompt\ncd /aa/\nbi\n"}
NR<300{print "get", $0}
END{ print "bye"}' datalist.txt | ftp -n -i 123.45.6.789


575 :571:03/09/04 14:04
とても参考になりました。
皆さんありがとうございました。
結局、ファイルに命令書き出してそれをリダイレクション入力しました。

576 :名無しさん@お腹いっぱい。:03/09/05 10:54
shループ内の読み込みを一つ先に進ませるってどうすればできますか?
例えば、
./exec.sh -f filename
とオプションに応じて実行される処理を変えたいのですが、

#!/bin/sh
for i in $*; do
case $i in
-f)
# この部分でfilenameを読み込ませたい
# filename=$i
esac
done

どうかご助言くださいませ。

577 :名無しさん@お腹いっぱい。:03/09/05 11:05
>>576
% env PAGER='less -p getopts' man sh
% man getopt


578 :576:03/09/05 11:50
サンクス。
$1とshiftの組み合わせでできました。

579 :not 577:03/09/05 12:34
>>578
つまり、>>577 の方法は使わなかったということですか?

580 :名無しさん@お腹いっぱい。:03/09/05 13:00
説教好きなご隠居さんですか?

581 :579:03/09/05 13:07
>>580
ちがうよ。俺もgetopts何か使うよりshiftしながら$1読む方を選ぶ。
でも578の「サンクス」が妙におかしかったので聞いてみただけ。
こういう場合は「サンクス・エニウェイ」でよろしこ。

582 :576:03/09/05 13:29
>>579
えーと、getoptの使用は全く思いつかなかったので、
とりあえずサンクスと書かせていただきました。

スクリプト元のC++プログラムの方でgetoptは使わせていただきます。
こんな便利そうな関数があるのに、
車輪の再発明に陥っているじゃないか!Σ( ̄ロ ̄ll)ガーン
てな感じで参考になりました。

thanks anyway!

583 :hoge:03/09/08 14:27
[0-9]{8}\_[0-9]\.jpgというファイルたちを
[0-9]{9}\-[0-9]\.jpgという風にリネームしたいのですが,
どうやったらいいですか?



584 :hoge:03/09/08 14:29
ごめんなさい.ちょっとわかりにくかったですね.
しかも2行目の{9}は{8}の間違いです.
たとえば20030501_1.jpg
というファイルを
20030501-1.jpg
という風に替えたいのです.

よろしくです.

585 :hoge:03/09/08 14:31
ついでにいうと,
20030501-1.jpgというファイルを
./2003/200305/20030501/
というディレクトリに入れたりもしたいです

586 :名無しさん@お腹いっぱい。:03/09/08 15:40
echo *.jpg | sed -n 's/\(....\)\(..\)\(..\)_\(.\)\.jpg/mv & \1\/\1\2\/\1\2\3\/\1\2\3-\4.jpg/p' | sh


587 :hoge:03/09/08 15:51
>>586
サンクスコ! そうか,sedを使うんですね.なんかgrepで躓いていました.
ありがとうございます.
それにしても,「小さいツールを組み合わせて使う」って素敵ですね.



588 :名無しさん@お腹いっぱい。:03/09/08 16:04
echo *.jpg じゃなくて ls *.jpg だな。


589 :名無しさん@お腹いっぱい。:03/09/08 16:47
>>587
perlでもでくるよ。awkでもtrでも。pythonでも。CでもC++でもでくる。COBOLはちょっときびしい。


590 :名無しさん@お腹いっぱい。:03/09/08 17:54
>>586
カコイイ。惚れました。

591 :hoge:03/09/09 15:22
>>589
sedでできるものはsedでしたほうがいいね.
せっかく果物ナイフがあるのだから,わざわざ牛刀を使わなくてもいい.
環境によっては牛刀をおいていないところもあるだろうし.

592 :名無しさん@お腹いっぱい。:03/09/09 15:56
sedが果物ナイフ...

593 :名無しさん@お腹いっぱい。:03/09/09 16:06
もはや awk や perl は果物ナイフ扱い

594 :名無しさん@お腹いっぱい。:03/09/09 16:56
じゃあPythonはレーザーメスかな

595 :名無しさん@お腹いっぱい。:03/09/09 17:16
awkってV7からあるよな。

596 :名無しさん@お腹いっぱい。:03/09/09 17:18
Coherent とか XINU には載ってないでしょ。

597 :名無しさん@お腹いっぱい。:03/09/09 17:21
Ruby最高!黄色人種の恥さらし!

598 :名無しさん@お腹いっぱい。:03/09/09 17:27
pythonでできるものはpythonでしたほうがいいね.
せっかくレーザーメスがあるのだから,わざわざ果物ナイフを使わなくてもいい.
病院によっては果物ナイフをおいていないところもあるだろうし.

599 :名無しさん@お腹いっぱい。:03/09/09 18:21
>>598
果物を食うのにレーザーメスを使う馬鹿はいない

600 :名無しさん@お腹いっぱい。:03/09/09 20:44
>>599
果物ナイフがなかったときは?

601 :名無しさん@お腹いっぱい。:03/09/09 20:53
>>600
みみかきを使う

602 :名無しさん@お腹いっぱい。:03/09/09 22:31
果物を食うのにレーザーみみかきを使う馬鹿はいない

603 :名無しさん@お腹いっぱい。:03/09/11 14:50
みみかきを食うのに果物レーザーを使う馬鹿はいない

604 :名無しさん@お腹いっぱい。:03/09/18 16:19
telnetでサーバーにログインしたいのですが
下のように書くと結果を全部サーバーの方に送ってしまいます
コマンドを実行した結果をローカル側?に出したい時はどうしたらいいのでしょうか

#!/bin/sh
(
while true
do
tail -n 1 buff.txt | awk '{print $1}' >a
read B=<a
if [ B = "Login:"] ; then
...
fi
done

) | telnet $SERVER $PORT > buff.txt


605 :名無しさん@お腹いっぱい。:03/09/27 23:58
>>599-602
手で食えよw

606 :名無しさん@お腹いっぱい。:03/09/28 16:28
最後の文字を落とす方法は?
perlのchopみたいなの。


607 :名無しさん@お腹いっぱい。:03/09/28 17:15
chop呼べば?

608 :名無しさん@お腹いっぱい。:03/09/28 20:46
>>607
bash: chop: command not found
と出ますた。


609 :名無しさん@お腹いっぱい。:03/09/28 20:54
>>608
お〜い」って呼ばなきゃ駄目

610 :名無しさん@お腹いっぱい。:03/09/28 21:01
>>609
ツマンネ

611 :名無しさん@お腹いっぱい。:03/09/29 01:14
>>604
hoge | (mona > giko) と
(hoge | mona) > giko と
hoge | mona > giko の違いを述べよ。

612 :名無しさん@お腹いっぱい。:03/09/29 01:20
初歩的な質問ですみません。
あるディレクトリとその回のディれくとにあるすべての*~なファイルを消すにはどうしたらいいですか?
rm だけでは出来ないようだし,sedを使うのでしょうか?

613 :名無しさん@お腹いっぱい。:03/09/29 01:39
>>612
「その回のディれくと」ってのが何だかわからんが
ヒントは find とか xargs とか。

614 :名無しさん@お腹いっぱい。:03/09/29 02:27
>>613
「下位のディレクトリ」じゃないかな

615 :612:03/09/29 02:33
>>613
ヒントありがとうございます
find ./ -name '*~' | rm
でできました

616 :612:03/09/29 02:37
間違えた
rm `find ./ -name '*~'`
でした

617 :名無しさん@お腹いっぱい。:03/09/29 03:47
>>616
find . -name '*~' -exec rm {} \;


618 :名無しさん@お腹いっぱい。:03/09/29 03:48
>>612-617
スレ違い


619 :名無しさん@お腹いっぱい。:03/09/29 12:14
いや、せっかくだから なぜそうなのか 616と617に説明していただきたい


620 :名無しさん@お腹いっぱい。:03/09/29 15:04
>>619
くだ室へ逝け


621 :名無しさん@お腹いっぱい。:03/10/02 19:58
初心者質問ですいません
root以外のユーザで
シェルを呼んだ時にシェル内容だけはroot(su)扱いで実行するように
記述することって可能でしょうか?


622 :名無しさん@お腹いっぱい。:03/10/03 00:42
>>621
setuid


623 :名無しさん@お腹いっぱい。:03/10/03 11:04
>>622
ありがとうございます
試してみます

624 :名無しさん@お腹いっぱい。:03/10/08 15:00
#! /bin/sh

ftp -nv ***** <<EOF
user user
hash
bin
get ****
EOF

上のシェルでゲットの部分を引数で渡された回数だけ実行するには
どうすればよいでしょうか?
EOF〜EOFの間にはループ分とか記述できないので困っています・・

625 :名無しさん@お腹いっぱい。:03/10/08 15:31
ヒアドキュメントを使わなければいいだけの話では。

626 :名無しさん@お腹いっぱい。:03/10/08 15:33
目的がよくわからんが
wget とか curl を使った方がよいのでは。

627 :名無しさん@お腹いっぱい。:03/10/11 16:40
here document のところをプログラムで生成すればいいんじゃ?


628 :名無しさん@お腹いっぱい。:03/10/11 22:42
echo 嵐 マンセー

629 :名無しさん@お腹いっぱい。:03/10/17 21:24
コンパイルして
ttp://www.geocities.co.jp/SiliconValley-SanJose/5706/files/zusa.c.gz

630 :名無しさん@お腹いっぱい。:03/11/10 11:31
hoge.txt に

fuga = foo

という行があるとしますよね.

シェルスクリプトでシェル変数 $FUGA に,
この foo を設定してやるにはどうしたらいいのですか?

631 :名無しさん@お腹いっぱい。:03/11/10 11:35
FUGA=`awk '{ print $3 }' hoge.txt`

632 :名無しさん@お腹いっぱい。:03/11/10 13:47
>>630
eval $(echo 'g/^\([^ ][^ ]*\) *= *\([^ ][^ ]*\)$/s//\U\1\e=\2;/p' | ex - hoge.txt)

633 :名無しさん@お腹いっぱい。:03/11/10 22:15
FUGA=`awk '$1 ~ /fuga/ { print $3 }' hoge.txt`

634 :名無しさん@お腹いっぱい。:03/11/11 13:18
>>633
FUGA=hoge

635 :ナミ:03/11/13 10:57
ある実行ファイルにパスが通っているかどうかで
if 文で処理を分けたいんですけどどうすればいいのですか?

例えば, awk にパスが通ってるかどうかで分岐させるには?

636 :名無しさん@お腹いっぱい。:03/11/13 11:06
>>635
sh 系なら type か?

637 :名無しさん@お腹いっぱい。:03/11/13 14:11
シェルスクリプトの中で,
ユーザ定義函数を使おうとして,
以下のように書きました

#!/bin/bash
question 'Hello World!!'

function question()
{
echo $1
}

ところが,「question なんか知らない」というエラーが出ました

何が悪いんでしょう?

638 :ヽ(´ー`)ノ:03/11/13 14:17
>>637
先に定義しておかないと使えないヲカン

function question()
{
echo $1
}

question 'Hello World!!'


639 :名無しさん@お腹いっぱい。:03/11/13 16:05
関数を定義するときに
function を使うなんて初めて知った・・・

hoge()
{
hage $@
}

が正式な文法だとばかり思ってた・・・(恥

640 :名無しさん@お腹いっぱい。:03/11/13 16:31
>>639 bash拡張じゃない?

641 :名無しさん@お腹いっぱい。:03/11/13 18:06
>>640
調べてみたらfunctionを使うのはbashの拡張みたいですね。
やっぱりなるべく使わないでおこ。


642 :名無しさん@お腹いっぱい。:03/11/15 01:17
>>641
ほんとに?
POSIX標準(1003.2)で、そういう形式もOKって決まってなかったっけ?

643 :名無しさん@お腹いっぱい。:03/11/17 12:13
シェルスクリプトから他のシェルスクリプトファイルを
include することはできます?
もしできるなら,どうやってやるんですか?

644 :名無しさん@お腹いっぱい。:03/11/17 12:28
>>643
.

645 :名無しさん@お腹いっぱい。:03/11/17 20:42
>>644
ディスプレイの汚れかとおもった・・・


646 :名無しさん@お腹いっぱい。:03/11/20 10:28
$ bash hoge.sh *

としたら,現行ディレクトリの
すべてのファイルの先頭行に,

//hoge

という行が追加されるようなシェルスクリプトはどう書くの?

647 :名無しさん@お腹いっぱい。:03/11/20 10:51
#!/bin/sh
tmpfile="/tmp/hoge.$$"

for d in "$@" ; do
if [ -f "$d" -a -w "$d" ]; then
echo "//hoge" > $tmpfile
cat "$d" >> $tmpfile
cp $tmpfile "$d"
fi
done


648 :646:03/11/20 11:16
>>647

すばらしい!

649 :ごんた:03/11/20 15:22
shシェルスクリプトにて、
PATH_INFO="/home/test/image/abc.jpg"
であるとき、
eval `echo $PATH_INFO | sed /^(.*\/)([a-z]+)\.([a-z]+)$/{
$Path=$1
$FileName=$2
$Ext=$3
}`
としたら、根本的に違うらしい。
 どうしたらパターンマッチさせて、任意の文字列を取り出せるのでしょう
 

650 :名無しさん@お腹いっぱい。:03/11/20 16:07
>>649
正規表現は悪くないんだけど perl っぽかったり、
変数を使えない sed で代入しようとしてたりですごいことになってるねw
さらには sed の置換処理部分をクオートしてないんで
シェルが解釈しようとしてエラーになるはず。

Path=`dirname $PATH_INFO`
FileName=`basename $PATH_INFO | sed 's/\(.*\)\..*/\1/'`
Ext=`basename $PATH_INFO | sed 's/.*\.\(.*\)/\1/'`


651 :ごんた:03/11/20 17:12
なるほど、置換した結果を拾う。

ただ、
test.sh________________
#!/bin/sh
Path=`dirname $PATH_INFO`
FileName=`basename $PATH_INFO | sed 's/\(.*\)\..*/\1/'`
Ext=`basename $PATH_INFO | sed 's/.*\.\(.*\)/\1/'`
echo 'Content-type: text/plain'
echo
echo \PATH_INFO = $PATH_INFO
echo \$Path = $Path
echo \$FileName = $FileName
echo \$Ext = $Ext
exit 0
では、実行してみても
bash$ sh ./test.sh
$Path =
$FileName =
$Ext =
bash$


652 :ごんた:03/11/20 17:13
それで、

・・・値が無い。それで

PATH_INFO="/img/src/eee.jpg"
Ext=`echo $PATH_INFO | sed 's/.*\.\(.*\)/\1/'`
Path=`echo $PATH_INFO | sed 's/\(.*\)\/[^\/]*\..*/\1/'`
FileName=`echo $PATH_INFO | sed 's/.*\/\([^/]*\)\..*/\1/'`
echo 'Content-type: text/plain'
echo
echo \PATH_INFO = $PATH_INFO
echo \$Path = $Path
echo \$FileName = $FileName
echo \$Ext = $Ext
exit 0
としてみた。
 なんとなくカッコ悪いような・・

653 :名無しさん@お腹いっぱい。:03/11/22 18:17
>>652
test.sh呼ぶ前にPATH_INFOをexportしてるのかと問い詰めたいところだが、

#拡張子が必ず存在するなら、このほうが見やすいかも。
export Ext
Path=`dirname "$PATH_INFO"`
Ext=`basename "$PATH_INFO" | sed 's/.*\.//'`
FileName=`basename "$PATH_INFO" $Ext`

#evalだとこんな感じ?途中にスペースがあるとダメだけど。
set `echo $PATH_INFO | sed 's|^\(.*\)/\([^/]*\)\.\([^.]\)|\1 \2 \3|'`
Path=$1
FileName=$2
Ext=$3

#拡張子が存在するかどうかもアヤシイんだったら、こんなのとか。
Path=`dirname "$PATH_INFO"`
FileName=`basename "$PATH_INFO" | sed 's/\.[^.]*$//'`
Ext=`basename "$PATH_INFO" | sed "s/^$FileName\.//"`

654 :名無しさん@お腹いっぱい。:03/11/23 16:00
もっと気楽にいこーよ!
awk -F/ '{ print $NF }' とか
awk -F. '{ print $NF }' とか



655 :名無しさん@お腹いっぱい。:03/11/24 23:54
LIST="a b c"
HOGE="hoge."
から、
"hoge.a hoge.b hoge.c"を生成するにはどうしたらいいのかな。

656 :名無しさん@お腹いっぱい。:03/11/25 00:00
for i in $LIST
do
RESULT="$RESULT $HOGE$i"
done


657 :名無しさん@お腹いっぱい。:03/11/25 00:01
>>655
% export LIST="a b c"
% export FOO="foo."
% for i in `echo $LIST`; do echo $FOO$i; done
foo.a
foo.b
foo.c

do echo を do touch にする。

658 :名無しさん@お腹いっぱい。:03/11/25 00:21
>>656
なるほど。${bar#word}系の類いに気がいってて思い付かなかったよ。

>>657
例示した文字列が紛らわしくてスマソ。

659 :名無しさん@お腹いっぱい。 :03/11/27 16:42
unix(solaris)で使っていたシェルがRedHatでつかえません。
どうしてでしょうか?


660 :名無しさん@お腹いっぱい。:03/11/27 16:53
>>659
shellってなんだか理解してからがんばれ


661 :名無しさん@お腹いっぱい。:03/12/02 20:03
/usr/bin/env の挙動が理解できません.例えば,

#!/usr/bin/env /usr/bin/clisp
(format t "Hello, world.~%")

このようなファイルに chmod u+x して実行するとします.
1 行目が上のときにはうまく動作しますが,可搬性を考えて
1 行目 を #!/usr/bin/env -i PATH=/usr/bin clisp とすると

env: オプションが違います --
詳しくは `env --help' を実行して下さい.

と言われてしまい,#!/usr/bin/env PATH=/usr/bin clisp とすると
メッセージが出ないまま固まります.
可搬性のある書き方で正しく動作させるには,どうしたらいいのでしょうか?

662 :名無しさん@お腹いっぱい。:03/12/02 20:48
>>661
それは俺も悩んだことがある。
どうやら引数がまとめられて1つになるらしい。
#!/bin/ls -l -a
/bin/ls: オプションが違います --
この場合ls '-l -a'となってしまう。

#!/usr/bin/env clisp
というか、普通はこうじゃないか?


663 :661:03/12/02 21:25
>>662
うちのマシンではそれでいいのですが,
CGI として使いたいところが,PATH=/usr/bin という素敵なシステムなんです.

664 :名無しさん@お腹いっぱい。:03/12/02 21:45
ますます #!/usr/bin/env clisp でいいと思うのだが

665 :名無しさん@お腹いっぱい。:03/12/02 22:03
>>663
#!/usr/bin/clisp
でいいじゃないか。

666 :661:03/12/02 22:34
説明不足スマソ.

>>664-665
非常に残念なことに,その某大学のシステムでは (大学名を foo とします),
PATH=/bin:/usr/bin:/usr/foo/bin:/usr/foo/gnu/bin:
/usr/foo/pub/bin:/usr/foo/pub/lib/teTeX/bin:/usr/ucb:
/usr/foo/X11/bin:/usr/foo/bin/isc:/usr/ccs/bin の他にも,
/opt 以下に多数の bin を加えてはじめて実用になるシステムなのであります.

#! の行は,なるべく書き換えたくないものです.
どうか一人前の env 使いにしてください.お願いします m(_ _)m

667 :661:03/12/02 22:36
連続スマソ./usr/foo/pub/bin/clisp にあるので PATH の追加無しには使えません.

668 :名無しさん@お腹いっぱい。:03/12/02 22:47
#! の後には実行ファイルと引数1つまでしか書けないと思った方が良い。
特に可搬性を求める場合は。

PATH を変えたいといった場合は、シェルスクリプトにするとかしか無いと思う。
#!/bin/sh
PATH=/bin:/usr/bin/:...
clisp filename


669 :661:03/12/02 23:00
>>668
どうもありがとう.悲しい index.cgi になりそうです...

670 :名無しさん@お腹いっぱい。:03/12/02 23:18
引数は「ひきすう」と読むのだぞ(w

671 :名無しさん@お腹いっぱい。:03/12/02 23:50
.htaccess で SetEnv PATH ... とすればいいのでは?


672 :名無しさん@お腹いっぱい。:03/12/03 09:43
(´-`).。o(…Solaris か…あればイイ OS だ…)

>>671
.htaccess 禁じられてそうなヲカン。



673 :名無しさん@お腹いっぱい。:03/12/06 12:11
>>670
他にどう読む

674 :名無しさん@お腹いっぱい。:03/12/06 14:17
>>670
俺は昔「いんすう」と読んでいた。
ちなみに返値のことを「へんち」とも読んでいた。うはは

675 :661:03/12/06 15:45
>>671-672
.htaccess は使えますが,cgiwrap は必ずしないと実行できないんです.
そのせいか,cgi で呼ばれると .htaccess を無視しているようです.

676 :名無しさん@お腹いっぱい。:03/12/06 17:36
>>674
俺は「いんかず」「かえち」だった

677 :名無しさん@お腹いっぱい。:03/12/06 18:14
                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< かえちかえち!
                 \_/   \_________
                / │ \
                    ∩ ∧ ∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \( ゚∀゚)< いんかずいんかずいんかず!
いんかず〜〜〜!  >( ゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」
               ̄     / /


678 :名無しさん@お腹いっぱい。:03/12/07 21:25
引き吸うも返り血も漏れには適当な命名とは思えない。
意味的、日本語的に。一体どんなDQNの思いつきだよ..
さらに
>>670
みたいなタイプが助長していて最悪だな。


679 :名無しさん@お腹いっぱい。:03/12/07 21:34
・食わせ値
・戻り値(現行)
に汁


680 :名無しさん@お腹いっぱい。:03/12/07 21:38
不特定多数の数なんぢゃないの?<引数の数


681 :名無しさん@お腹いっぱい。:03/12/07 21:45
>>678
引いて、吸って、返り血なんだよ。日本語的には
筋が通ってるがな


682 :名無しさん@お腹いっぱい。:03/12/10 20:00
シェルスクリプトの中で,
例えば,$SQL というシェル変数に,
ある sql 文の文字列をもっているとします.

この sql を(シェルスクリプトの中で)
psql を使って,database という名前のデータベースに
かましてやるにはどうしたらいいのでしょうか?

683 :名無しさん@お腹いっぱい。:03/12/10 20:33
>682
echo $SQL | psql database


684 :676:03/12/10 22:58
>>677
喜んでもらえて光栄ざます。

685 :名無しさん@お腹いっぱい。:03/12/11 11:38
バイナリの置換はをする方法はありますか?

具体的には,あるテキストファイルの
0x0D というバイトをすべて削除したいんですけど


686 :名無しさん@お腹いっぱい。:03/12/11 11:39
>>685
tr か?

687 :名無しさん@お腹いっぱい。:03/12/11 15:14
ありがとうございます

cat hoge.txt | tr -d '\015'

で解決しました.


688 :名無しさん@お腹いっぱい。:03/12/11 17:02
>>687
catいらんやろ。trの入力をredirectすりゃ済むやん。

689 :名無しさん@お腹いっぱい。:03/12/11 20:17
もれ、grep を使うときでさえも

cat hoge.txt | grep fuga

とかやるよん。経験的にこのように書いておくと、あとで修正・改造が楽なのだ。

690 :名無しさん@お腹いっぱい。:03/12/11 23:30
>>689 たとえばどのように楽なの?

691 :名無しさん@お腹いっぱい。:03/12/11 23:49
>>690
>>689 じゃないけど、自分の経験では、

% cat hoge.txt | grep fuga
% cat hoge.txt | grep -i fuga
% cat hoge.txt | grep -i "fuga|foo"
% cat hoge.txt | grep -i "fuga\|foo"

みたいに続けて入力する時に、
カーソル移動が少なくて済む。

まぁ、カーソルを一字づつ移動させんな、とか
正規表現くらい一発で書け、とか
「% <hoge.txt grep fuga」でいいじゃん、とか
言われれば、そのとおりだが。


692 :名無しさん@お腹いっぱい。:03/12/12 00:40
>>691
$ grep fuga < hoge.txt
$ grep -i fuga < hoge.txt
$ grep -i "fuga|foo" < hoge.txt
$ grep -i "fuga\|foo" < hoge.txt
とやってもカーソル移動は同じですが。
もしかしてDOSシェルかなんか使ってる?

693 :名無しさん@お腹いっぱい。:03/12/12 00:57
>>692
% head hoge.txt
% ^head^cat
% cat hoge.txt | grep fuga
% cat hoge.txt | grep -i fuga

とか、いきなり grep じゃない事は多い(例がいけてないな・・・)。

694 :名無しさん@お腹いっぱい。:03/12/12 10:57
grep | sort | uniq みたいな多段パイプを
いろんなファイルに対して繰り返しやるときは、
最初を grep RE hoge.txt とか grep RE fuga.txt とかにするよりも
cat hoge | grep RE にしておいた方がラク。

そんなことよりも、grep | awk とやってる奴をどうにかしてほしい。


695 :名無しさん@お腹いっぱい。:03/12/12 10:58
たしかに。
まず最初にファイルの中身を確認してから、grep 操作をするじゃん。

$ less hoge.log
$ less hoge.log | grep fuga
$ less hoge.log | grep fuga | cut -f 1 -d " " | sort | uniq -c

とか。

696 :名無しさん@お腹いっぱい。:03/12/12 11:03
less からパイプで渡すのはなんかヤだな。

697 :名無しさん@お腹いっぱい。:03/12/12 11:22
grep | awkってなんかまずいの?

698 :名無しさん@お腹いっぱい。:03/12/12 12:13
grep pattern | awk '{action}'
awk '/pattern/{action}'

意味ないでしょ。

699 :名無しさん@お腹いっぱい。:03/12/13 00:31
>>694
> cat hoge | grep RE にしておいた方がラク。
はあ。なにが楽なんかよくわからない。
シェルに何を使っているかとかにもよるだろうし。
viモードなのかemacsモードなのかにもよるだろうしなあ。

700 :名無しさん@お腹いっぱい。:03/12/13 00:40
標準入力と標準出力でインターフェースを共通化しておくことのメリットが分からないなんて
>>699はUnixをあまり使わない人間だと思う。


701 :名無しさん@お腹いっぱい。:03/12/13 00:43
vi モード使ってるやつっているの? 一々 "^[" 押すのは面倒じゃないかな。
エディタは vi 愛用してるけど、コマンドラインのキーバインドは emacs 風だな。

702 :名無しさん@お腹いっぱい。:03/12/13 03:00
好きなように使えばいいさ。

703 :名無しさん@お腹いっぱい。:03/12/13 03:06
そうだね、スナフキン。
vi キーバインドは、コマンドが長くなった時にちょと便利かなと思ってたよ。
ところで emacs キーバインドで、ワード単位でジャンプする方法無いかな?


704 :名無しさん@お腹いっぱい。:03/12/13 03:13
ごみん。M-f, M-b ででけた。

705 :名無しさん@お腹いっぱい。:03/12/13 17:14
>>701
は〜い。俺tcshでもzshでもviのキーバインドだよ。
f,t,で目標の文字まで飛べたりとか、ct}なんかで括弧のなかを全書き換えとか
便利だと思うんだけどな。
でもさすがにhistoryは入力モードの^P,^Nに割り当ててます。
#でも厳密にキー叩く回数数えたら、
#emacsバインドに比べて少なくはないなと思いますが慣れました。

706 :名無しさん@お腹いっぱい。:03/12/13 17:15
>>700
それがコマンドラインの編集にも適用できると思っているのって
なんだかあれですね

707 :名無しさん@お腹いっぱい。:03/12/13 17:19
つかシェルあんまし使ってないんじゃないかな.>700は。
知識はあるんだけど現実に応用できないよくいるUnix馬鹿。
一番ダサい。

708 :名無しさん@お腹いっぱい。:03/12/13 17:42
699 == 706 == 707 は具体的な例を挙げてみてよ。UNIX 使った事が
あるならだけど。

709 :名無しさん@お腹いっぱい。:03/12/13 17:45
>>708
すんませんが日本語しゃべってください。
何の具体的な例ですか?

710 :名無しさん@お腹いっぱい。:03/12/13 17:45
699=706=707=709はLinuxを使いはじめて1年目の厨房なんだから。反抗期なんだよ。

711 :名無しさん@お腹いっぱい。:03/12/13 17:53
>>709
取りあえず cat を噛まさない方がキー入力回数が減るところからだな。

712 :699 692:03/12/13 18:21
>>711
とりあえず 'cat ' 、'|' という最初にいれる文字列分はキー入力が少ないですね。

本人かどうかわからんけど(つうかそもそも2ちゃんねるではそれを推測したりする
のはナンセンスだが)

>>700 とか >>708 ってなんか空疎なんだよな。

>>691からはじまる薀蓄は「どっちが楽か」という現実の使用に直結した
話なんですが、

>>700
「標準入力と標準出力でインターフェースを共通化しておくことのメリット」
(これ自体もかなり意味不明だが)

これが今の話題にどう関係しているのかが示されてないんだよ。
もしよければ ***具体的*** にシェルでのコマンドライン編集とどう関係するのか
教えてくれ。

俺が書いたUnix馬鹿ってのは「インターフェイスが共通化できる」とか
「直交性が…」という言葉と辞書的意味は知っているが実際にそれがどう便利
なのかが分かっていないやつのことで>>700はまさによい標本なわけだす。



713 :名無しさん@お腹いっぱい。:03/12/13 18:26
以上、必死な反抗期のオコチャマの反論でちた。

714 :名無しさん@お腹いっぱい。:03/12/13 18:26
ksh でかつ vi モードだと
ファイル名が最後にあると Esc + _ が使えて便利だね。

715 :名無しさん@お腹いっぱい。:03/12/13 18:28
>>712
煽りはスルー。
もれは>>695を書いた人間だけど、これってひとつの答えになっていないかな?


716 :名無しさん@お腹いっぱい。:03/12/13 18:28
>>713
はいはいご苦労さん。
内容に一言も言及できないってことは理解できてないってことですな。

2ちゃんねるとはどういうところなのか勉強しなおしてください。
ちなみに君のレスは「禿同」と書いたのとほぼ等価ですw

717 :名無しさん@お腹いっぱい。:03/12/13 18:29
>>715
なってない

718 :名無しさん@お腹いっぱい。:03/12/13 18:30
>>712
それがスレの流れを無視して、煽り文句書いていた理由ですか?

719 :名無しさん@お腹いっぱい。:03/12/13 18:31
>>717
どこらへんが答えになってないかな?

720 :名無しさん@お腹いっぱい。:03/12/13 18:32
あおる訳じゃないが、をれ的には
cat hoge.txt | grep foo
cat -n hoge.txt | grep foo
とかよく切り替えるからってのがある・・・


721 :名無しさん@お腹いっぱい。:03/12/13 18:36
>>720 の例はあんまりよくないかも。。。
grep にも -n オプションがあるぞ、とか突込まれそうだし。

722 :名無しさん@お腹いっぱい。:03/12/13 18:50
>>720
そういう時はこうしてる。cat ではあまり使わないけど。

% cat foo.txt | grep bar
% ^ ^ -n
cat -n foo.txt | grep bar

723 :名無しさん@お腹いっぱい。:03/12/13 20:54
レスがあると思ったらこれかよ・・・

724 :名無しさん@お腹いっぱい。:03/12/13 21:19
おまいは何を期待してるんだ?

725 :名無しさん@お腹いっぱい。:03/12/14 00:15
>>718

どの辺が「スレの流れを無視して、煽り文句書いていた理由」にみえまっか?
指摘は具体的によろしく。

726 :名無しさん@お腹いっぱい。:03/12/14 00:18
>>712
> >>700
> 「標準入力と標準出力でインターフェースを共通化しておくことのメリット」
> (これ自体もかなり意味不明だが)

単に「UNIXにはパイプがあって便利だね」といってるようにしか読めないよな。

727 :名無しさん@お腹いっぱい。:03/12/14 00:20
コマンドラインの操作性を語るときは、どのシェル使っての話か書いたほうがよいね。

728 :名無しさん@お腹いっぱい。:03/12/14 00:47
(なんか粘着されてるっぽいな・・・。)

729 :名無しさん@お腹いっぱい。:03/12/14 01:06
あるスクリプト x があって、x の中身は下のような感じです。

#!/bin/sh
コマンドA
コマンドB
コマンドC
exit 0

スクリプト x を、

$ cat hoge.txt | ./x

としたとき、このスクリプトへの標準入力をCに食べさせたいのですが、
どうすればよいでしょうか。

AとBが標準入力を食べないプログラムならCが食べてくれるようですが、
AとBが標準入力を食べるプログラムだとCに回ってきませぬ。

730 :名無しさん@お腹いっぱい。:03/12/14 01:24
>>729
コマンドA,B,Cをリストにして

for i in $list ; do
cat hoge | $i
done

でいけないかな・・・。

731 :名無しさん@お腹いっぱい。:03/12/14 01:32
>>730
レスありがとうございまする。
標準入力から入るのは無限長のデータの可能性もあるので

% uuencode /dev/urandom hoge | ./x

のような感じで実行しても動作して欲しいなぁ、と考えています。


732 :名無しさん@お腹いっぱい。:03/12/14 01:46
>>728
言い訳探しをしても有益ではないと思うよ

733 :名無しさん@お腹いっぱい。:03/12/14 01:47
#!/bin/sh
コマンドA < /dev/null
コマンドB < /dev/null
コマンドC
exit 0

じゃあかんの?

734 :名無しさん@お腹いっぱい。:03/12/14 01:58
>>732
まともな返事をしても、応えを期待出来る相手じゃないじゃん。
何時まで続けるの?

735 :名無しさん@お腹いっぱい。:03/12/14 02:04
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
 | >>734      |
 |  馬鹿は放置!  l
 |_________|
   ∧∧ ||
   ( ゚д゚) ||
   /  づΦ


736 :名無しさん@お腹いっぱい。:03/12/14 02:11
そだね。スマソ。

737 :名無しさん@お腹いっぱい。:03/12/14 15:26
>>734
また言い訳ですな。正直になったほうがよいとおもいまつよ。

738 :名無しさん@お腹いっぱい。:03/12/14 15:27
>>735
翻訳:「理解できないものにはフタをしよう」

739 :名無しさん@お腹いっぱい。:03/12/14 15:28
質問です。

「標準入力と標準出力でインターフェースを共通化しておくことのメリット」
とはどういう意味ですか?

740 :名無しさん@お腹いっぱい。:03/12/14 17:15
>>739
いきなり宿題丸投げみたいなこと聞かれても(以下略

741 :名無しさん@お腹いっぱい。:03/12/15 08:07
シェルのコマンドを
$ date
のようにするのではなく
$ { date ; }
のように { ... ; } で挟むとどういった違いがあるのですか?

742 :名無しさん@お腹いっぱい。:03/12/15 09:00
コマンドリストを一括りにする。その例では違いはでないね

743 :名無しさん@お腹いっぱい。:03/12/15 21:59
>>742
thx
なぞがとけました。

744 :名無しさん@お腹いっぱい。:03/12/20 18:08
「標準入力と標準出力でインターフェースを共通化しておくことのメリット」
というのを先日聞いたのですが、Unix関係の文書とか書籍とかでも見聞きした
ことがないセンテンスなんですが、これってUnixのどの特徴を指して言ってるの
でしょうか?


745 :名無しさん@お腹いっぱい。:03/12/20 18:25
宿題の丸投げ禁止。
先生の意図していることを汲み取って回答してあげないと単位はもらえないよ(w

746 :名無しさん@お腹いっぱい。:03/12/21 00:05
>>745
>>700

747 :モナBERT:03/12/21 02:52
シェルスクリプトが一番多く書かれて技巧の研究が進んだ時代は
perl出現以前の1980年代だと思うけど、当時は>>689,691のような
方式を見た記憶ないし、>>700のような主張もされなかったはず。
(スクリプト内での話ね。他人のコマンドライン操作はよく見てない。)

もちろん、当時はtcshのコマンドライン編集なんてなかったとか、
大きく状況が変化したから、21世紀の今は今なりでいいよ。

個人的には、>>700のメリットはやっぱわからん。結構考えたけど。

748 :名無しさん@お腹いっぱい。:03/12/22 01:20
>>700 は都合が悪くなったのです

749 :名無しさん@お腹いっぱい。:03/12/23 00:53
>>748
あなたはもしかして AranSK さん?
FP が理解出来なくてシェルスクリプトスレに来たの??

750 :名無しさん@お腹いっぱい。:03/12/23 14:54
>>739=>>744=>>747=>>748 は必死なジサクジエンと言うことでよろしい?

昔話をしてもいいのなら、昔の方が「一つのコマンドの機能は必要最小限に」
というポリシーが強かったよ。複雑なことをするときは複数のコマンドの組み
あわせでやる(そして組み合わせにはパイプをつかう)、というのがUnixという
もののポリシーだと思われていたしね。

たとえば tar とかは、今時の GNU tar なら単独で tar.gz の展開もできるように
なっているけど、昔は gzip で展開してから tar に渡す、ということをしなくちゃ
いけなかった。

GNUツールは確かに便利だけれど、コマンドラインでのオプションが増えて
増えて、いわゆる昔の「Unix的」でなくなってきたような気がするなぁ。

751 :名無しさん@お腹いっぱい。:03/12/23 15:48
>>750
自作自演ではないと思いますが。(つうかそんなこと推測するのはそもそも無意味)

でですね>>700のようなことを書いた文献とか一切見当たらないのですよ。
だから単なる脳内妄想なのか、他のことと間違えて覚えているのか…


752 :751:03/12/23 15:51
あ、>>739>>744は私です。

753 :名無しさん@お腹いっぱい。:03/12/23 15:57
>>751
パイプに関する資料を調べれば?
プロセス間通信手段としてのパイプは古典的ながらも依然優れた手法だよ。

標準入力で読み込んで標準出力に吐出すタイプのプログラムは、そのパイプの
メリットを享受できるよね。

754 :名無しさん@お腹いっぱい。:03/12/23 16:09
というわけで宿題の解答としては、

「複雑な処理をさせるプログラムを1つのプログラムとして記述することは、
デバッグするときや、後に一部の機能を使い回すときに作業効率が悪い。

例として信号のパワースペクトルを求める場合をあげる。
この場合、
* wavファイルをcsv形式に変換するプログラム(wav2csv)
* csvを読込んでそれを離散フーリエ変換するプログラム(fft)
* 読込んだ値の絶対値を求めるプログラム(abs)
にわけ、
$ cat test.wav | ./wav2csv | ./fft | ./abs > test.pow
と処理させる。
すると、wav2csv , fft , abs は他の場面でその機能が必要なときに使い回す
ことができる。

このように入力と出力を標準入力と標準出力で統一しておくことにより、
プログラムを機能にわけて部品化させることができ、
後にその部品を再利用することが可能になる。
パイプはこのようなプロセス間通信を実現する手段として最も容易であり、
かつ高速である。」

というようなことを書けば良いのではないかと。

755 :名無しさん@お腹いっぱい。:03/12/23 16:11
って、宿題、というわけではないのか。。。。ごめん。

756 :名無しさん@お腹いっぱい。:03/12/23 16:23
どうもまだわかってないようだな

757 :名無しさん@お腹いっぱい。:03/12/23 16:38
>>754
ここでの議論はcatを使うことのメリットは何かってことだろ。
cat test.wav| ./wav2csv
>>688はcatのかわりにリダイレクトすればよいと言っている。
./wav2csv < test.wav
>>700はcatを使うと
>標準入力と標準出力でインターフェースを共通化
と言っているのだが、これが意味不明。

758 :名無しさん@お腹いっぱい。:03/12/23 16:49
>>757はプログラムを書いたことがないんかな?

> ここでの議論はcatを使うことのメリットは何かってことだろ。

プログラムを書く側からすれば、プログラムの入力インターフェースとして
stdin だけ見ていればいいのは非常に楽だな。cat を使ってデータを stdin
にいれてくれるのならプログラムは書きやすい。

>>688はcatのかわりにリダイレクトすればよいと言っている。
> ./wav2csv < test.wav

それでどうやって多段パイプをする?


759 :名無しさん@お腹いっぱい。:03/12/23 16:52
あぁ、誤解。すまん。 >>758 は読み違えていた。

760 :名無しさん@お腹いっぱい。:03/12/27 15:09
結局>>700は都合が悪くなったのです。

761 :名無しさん@お腹いっぱい。:03/12/29 01:01
死んだ馬にムチ打つのは少々気が引けるが…

「標準入力と標準出力でインターフェースを共通化しておくことのメリット」
でググッてみたらこのスレしかヒットしなかったよ。

762 :貝バンドのアンナ:04/01/09 18:07
シェルでpsqlコマンドを使いたいのですが、
下記の様にSQL文内の'の所はどの様に記述するのでしょうか?
sh-2.05b$ psql -c 'select to_char(update,'yyyy/mm/dd') from user;' database;
実行結果
ERROR: Attribute "yyyy" not found
となってしまいます。

763 :名無しさん@お腹いっぱい。:04/01/09 19:01
>>762
一旦quote(')から抜けて、escapeした'を挿入し、再びquote(')に入ると
よいにゃん。例えば、「abc'def」をシェルに与えることを考えるなら、
echo 'abc'\''def'
とか試してみると原理がわかるにゃん。
escapeじゃなくdouble quoteで'をかこってもいいにゃん。
echo 'abc'"'"'def'
とか試してみると前のやつと同じ結果が見えるワン。

764 :名無しさん@お腹いっぱい。:04/01/09 19:57
shell に展開されちゃうような記述がなければ、全体を double quote すればよさそうな気がする。
psql -c "select to_char(update,'yyyy/mm/dd') from user;" とか。

765 :名無しさん@お腹いっぱい。:04/01/09 22:52
>762
ヒアドキュくわせればいーだろ。


766 :名無しさん@お腹いっぱい。:04/01/10 00:02
すいめせーん。
bashスクリプトで、引数のリストを配列として扱うにはどう書けば良いですか?

${@[0]}
↑これだとbad substitutionって言われちゃいます。。

767 :名無しさん@お腹いっぱい。:04/01/10 03:11
元々配列じゃないものを無理矢理配列として扱う事はできません。

768 :名無しさん@お腹いっぱい。:04/01/10 14:23
どこに書くべきかわからないので, ここに書かかせてください.
tcsh の補間機能を使って screen -x の後にプロセスIDの一覧を出そうと
しています. 今こんな感じです.
complete 'n/-x/`screen -ls | awk ' "'" '{print $1}' "'" '`/'
で, awk でマッチする行を絞るのに,
complete screen 'n/-x/`screen -ls | awk ' "'" '$1 ~ /^[0-9]+\./ {print $1}' "'" ' `/'
としたのですが, 以下のエラーが出てうまくいきません.
Missing separator '/' after completion "`screen -ls | awk '".
これはどう修正すればいいのでしょうか ? screen -ls 以下を
別のシェルスクリプトにしておかないとだめですか ?

769 :名無しさん@お腹いっぱい。:04/01/11 00:58



770 :名無しさん@お腹いっぱい。:04/01/11 01:10
while文の中でrshを使うと1回実行されてループから抜けてしまいます。
正しくループさせる方法教えてください。

例)
『HOST_LIST』にはrshを許可したホスト名の一覧が含まれています

set -x
cat HOST_LIST|while read a;do
rsh $a date
done


771 :名無しさん@お腹いっぱい。:04/01/11 02:12
>>768
tcsh を使わくなって暫くなるけど、クオートその他の代替表現は用意されていないのかな。
ネストできないのがつらい。解読するのが面倒なので自分の好きなように書くと
complete screen 'n@-x@`screen -ls | awk -F "\t" '\''/^\t/{print $2}'\''`@'
こんな感じだろうか。

>>770
read は一行しか読込まない。こんな風でいいのでは。
set -x
for h in `cat HOST_LIST`; do
rsh $h date
done

772 :名無しさん@お腹いっぱい。:04/01/11 02:27
>>770
ごめんボケけてた。それで別に構わんよね。何故成功した時点で打ち止めに
なるのかはよくわかりません。

773 :名無しさん@お腹いっぱい。:04/01/11 03:10
ああ、入力を取りあうことになるからか。
rsh $a date </dev/null
とでもすればいいのかな。

774 :名無しさん@お腹いっぱい。:04/01/11 03:37
>>771
ありがとうございます. >>771 の書き方でも, >>768 の書き方でも
セパレータを @ にすることでうまくいくのを確認しました.
いつも vi を使ってるのに, complete でもセパレータを変えられるかもとは
全然思いつきもしませんでした.
あと >>771 のクォートの書き方も, 私のより綺麗に見えて勉強になります.

775 :名無しさん@お腹いっぱい。:04/01/13 20:10
bashであるプロセスが終了してたらそのプロセスを起動するスクリプトを
cronに登録したいのですが、

もし"ps aux | grep プロセス名"が空なら"プロセス実行"

をどうやってスクリプトで書いていいかわかりません。
どうやって書けばいいでしょうか?

776 :名無しさん@お腹いっぱい。:04/01/13 21:47
>>775
俺だったら、cronよりも、プロセスが終了したときに再起動する
wrapperを書くかな。↓こんなの

#!/bin/sh
while true
do
"常に立ち上げておきたいプロセス"
適当なエラー処理とかログとか。場合によってあきらめてexitとか。
done

777 :名無しさん@お腹いっぱい。:04/01/14 18:34
サブシェルで設定した変数の値を取得したいのですが
例)
 #! /bin/ksh
 export st=0;
 (st=1)
 echo $st


778 :名無しさん@お腹いっぱい。:04/01/14 22:57
>775
ps aux|grep /usr/bin/hogehoge > /dev/null 2>&1
if [ $? != 0 ]
then
/usr/bin/hogehoge
fi

gnu grep だったら
ps aux|grep -q /usr/bin/hogehoge


779 :名無しさん@お腹いっぱい。:04/01/14 23:02
>777
サブシェルが短いなら、
st=`(st=1;echo $st)`
複雑なことしてるなら、一旦ファイルにおとして、
親シェルで読み込む。
でもこれってそもそも、盲点チックな方法だから
用途はかんがえたほうがいいんじゃ。


780 :775:04/01/15 03:53
>>778
ありがとうございました。
grepが見つからない時エラーを返すってところと、$?という変数があるところが
勉強になりました。

781 :名無しさん@お腹いっぱい。:04/01/25 05:03
テキストファイルから、全角2バイトの文字列を検出(grep?)させるには、
どうしたらよいでしょうか?




782 :名無しさん@お腹いっぱい。:04/01/25 13:56
>781

漢字コードに依存してしまうけど、
ぼくだったら、
nkf -e <hoge.txt|grep "ほげ"
みたく、一旦eucにしてしまう。


783 :名無しさん@お腹いっぱい。:04/01/25 15:11
>>782
マルチですよ。

784 :782:04/01/25 19:44
いートシして、マルチにひっかかってしまった!
ぎゃふん


785 :名無しさん@お腹いっぱい。:04/01/25 23:25
とあるフォルダの中にあるファイルすべての名前を変更しようと思っている。

123あひゃ.txt
1234あひゃ.txt

ファイル名先頭の数字をすべて4桁で統一しようと思った。
そこで俺が書いたスクリプトは

mv $filename `echo $filename | sed 's/^[0-9][0-9][0-9]^[0-9]/0&/'`

これでめでたくフォルダの中身は

0123あひゃ.txt
1234あひゃ.txt

に統一された。
だがあらたな問題が生じた。
ファイル名の先頭に数字以外の文字が来ているのだ。

A123あひゃ.txt
B1234あひゃ.txt

これらを

A0123あひゃ.txt
B1234あひゃ.txt

に統一したいんだがどんなスクリプトを書けばいいんだろうか?

786 :名無しさん@お腹いっぱい。:04/01/26 00:03
>785
むりくり一行にするんだったら、これ。
mv $filename `echo $filename | perl -ne 's/^(\D+)(\d+)(\D+)$/printf("%s%04d%s",$1,$2,$3)/e'`


787 :名無しさん@お腹いっぱい。:04/01/31 19:56
>>785
一度4桁以上にしてから減らすのがミソ
mv $filename `echo $filename | sed 's/\([^0-9]*\)\([0-9]*\)\(.*\)$/\10000\2\3/;s/0*\([0-9]\{4\}\)/\1/'`


788 :名無しさん@お腹いっぱい。:04/02/22 02:22
>>757

亀レスだが…最初の入力リダイレクトの前にフィルタを一つ追加する際の
手間が変わってくるということではないだろうか。

  cat ファイル名 | sort | uniq | wc -l
に対し、最初のフィルタに「grep HOGE」と思った時
  cat ファイル名 | grep HOGE | sort | uniq | wc -l
とすればよい。この場合、修正は
 (1) 「 | grep HOGE| 」挿入
のみ

だが
  sort < ファイル名 | uniq | wc -l
と直接書いていると
  grep HOGE < ファイル名 | sort | uniq | wc -l

 (1) 先頭に grep HOGE |」を挿入
 (2) sort の後の「< ファイル名」をカット
 (3) grep の後にペーストする
と3操作が必要となる。

これが面倒と言っているのでは?(それ以外、思いつかん)

789 :名無しさん@お腹いっぱい。:04/02/22 03:02
長過ぎるスクリプトって読みづらいしメンテしたくないと
思うのですが、もともと構造のなさげなもの、どうやって
整理するのが正しいのでしょうか?


790 :名無しさん@お腹いっぱい。:04/02/22 08:41
>>788
なるほど。それはありますね。
>>789
関数にするとか。

791 :名無しさん@お腹いっぱい。:04/02/22 12:44
cat 云々よりも
>標準入力と標準出力でインターフェースを共通化
ケチが付いてたのはこっちの方。でも、もういいだろこの話は(w

792 :788:04/02/22 16:56
>>791

たしかに(藁

793 :名無しさん@お腹いっぱい。:04/02/23 07:55
>>788
>>691にもあるけど、これだと修正の手間が同じだ。
<ファイル名 sort | uniq | wc -l

794 :名無しさん@お腹いっぱい。:04/03/24 00:50
ご教授ください。
別のスレに以下のような書き込みがあったんですが、

> "2001050202:20:26" (もしくは"20010502022026")
> みたく変換する関数をshellで定義すれば、
> この文字列は時系列的に大小比較可能

これは、「yyyymmddhhmm」の並びの文字列を、
指定された時間内か否かを、以下のような条件式で
判定できることを言っている?

 200403011200 < &NOW < 200404011200


795 :名無しさん@お腹いっぱい。:04/03/24 01:03
[ 200403011200 \< $NOW -a $NOW \< 200404011200 ]

796 :名無しさん@お腹いっぱい。:04/03/24 07:59
>>795
\<って使えるのか? -gtじゃないの?

797 :名無しさん@お腹いっぱい。:04/03/24 11:46
それを言うのなら -lt じゃないのか。bash とかの組み込みコマンドでは、
< や > は文字列の比較に使うようだ。

798 :ヽ(´ー`)ノ ◆.ogCuANUcE :04/03/24 14:11
「使い方が Perl と逆」で覚えてる。きっと俺だけじゃないハズだ。< or -lt

799 :名無しさん@お腹いっぱい。:04/03/24 14:47
>>797
-ltでしたスマソ。zshではだめだったが、bashは使えた。

800 :794:04/03/25 00:27
皆さん、いろいろありがとうございました。
こんな感じ↓でもできました!

#必要な時間部分をファイルから抽出(":"区切りのファイル)
cut -c45-56 tmp1.txt > tmp2.txt
#第二フィールドの値をSTART_TIMEとEND_TIME内かどうか比較し、別ファイルに出力
awk -F: '{if( '$START_TIME' <= $2 && $2 <= '$END_TIME' ){ print $1 }}' tmp2.txt > tmp3.txt


801 :794:04/03/25 00:38
また別件で質問があります。
trコマンドで、ファイル内のNULL文字を、半角スペースに置換
しようとして、以下のようにコマンドを実行しました。

# tr '\000' '\020' < input.txt > output.txt

しかし、NULLが半角スペースに置換されるのではなく、
NULL文字部分が削除されて出力されました。
半角スペースに置換させたいのですが、この使い方は
間違っているのでしょうか。
ちなみに、Solaris8、コードはEUC、Bシェルを使用してます。

802 :名無しさん@お腹いっぱい。:04/03/25 01:42
>801
Solaris8がどうなのかは分からないけど、tr が \0 を食ってしまうのは
ありえるような。
tr 以外で頑張ってみたら?

803 :名無しさん@お腹いっぱい。:04/03/25 02:19
#!/bin/sh
tmpsrc=/tmp/junk$$.c
tmpbin=/tmp/junk$$
cat > $tmpsrc << END
#include <stdio.h>
int main(void) {
    int ch;
    while ((ch = getchar()) != EOF)
        putchar(ch ? ch : ' ');
    return 0;
}
END
cc -o $tmpbin $tmpsrc > /dev/null
$tmpbin
rm $tmpsrc $tmpbin > /dev/null

804 :名無しさん@お腹いっぱい。:04/03/28 21:14
すいません、初心者なんでくだらない質問しますが

シェルを使ってテキストファイルに書きこんだり、読みこんだりするにはどうすれば良いですか?

805 :名無しさん@お腹いっぱい。:04/03/28 21:25
>>804
http://www.tsden.org/takamiti/shText/shText000.html

806 :804:04/03/28 21:43
>>805
ありがd

漠然とした質問でスマンカッタ

ちょと調べて見ます

807 :名無しさん@お腹いっぱい。:04/03/28 23:10
うーん書き込みは分かったのだけれども
桁数を指定してシェル内変数に読み込むにはどうすれば良いのでしょうか…



808 :名無しさん@お腹いっぱい。:04/03/28 23:16
read使えばいいんでない?

809 :名無しさん@お腹いっぱい。:04/03/28 23:28
>>808
うーん、でもreadだと桁数の指定できないんじゃないですか?


810 :名無しさん@お腹いっぱい。:04/03/28 23:49
>>807
適当なツール(sedとか)で加工すりゃいいだろ。
お前、その頭の固さじゃshellプログラミング向いてない。

811 :名無しさん@お腹いっぱい。:04/03/29 00:11
>>809
readで、無駄に変数たくさん作ってみる。

read a b c d e f g h i j k

必要な桁だけ使えばいい。
echo $c $f $k

812 :名無しさん@お腹いっぱい。:04/03/29 00:22
>>810
組み込みコマンドだけでやりたいってことじゃないの?

813 :名無しさん@お腹いっぱい。:04/03/29 08:05
組込みコマンドだけでシェルスクリプトが書けるはずがない。

814 :名無しさん@お腹いっぱい。:04/03/29 16:56
すみません。対話式のコマンドをシェルスクリプトで実行することは
できるのでしょうか?

例えばあるコマンドにおいて、パラメータですべてを指定できるなら
シェルで実行できるのですが、パラメータには用意されていない
ものを、コマンド実行中に入力しなければいけない場合、
どのように記述すればいいか分かりませんでした。

できない場合はその旨を教えていただけると幸いです。
よろしくお願いします。

815 :名無しさん@お腹いっぱい。:04/03/29 17:09
>>814
command <<EOF
parameter1
parameter2
EOF
で無理な場合は
expect
俺は使ったことないけど。

816 :名無しさん@お腹いっぱい。:04/03/29 17:14
>>814

#!/bin/sh
read d
echo $d


817 :814:04/03/29 18:15
>>815
ありがとうございます。eofでは無理だったのですが、
expectではできそうです。ありがとうございました。

818 :名無しさん@お腹いっぱい。:04/03/30 01:31
>>814
autoexpect使えば簡単。
勝手にシェルスクリプトができていく。

819 :名無しさん@お腹いっぱい。:04/03/30 15:54
すみません、シェルスクリプトで、

set res = `cat test.txt`
echo "$res"

としても、test.txtの中身が取得できていません。
何が悪いのでしょうか?

820 :819:04/03/30 16:16
すみません、自己解決しました。
スペースをあけてはいけなかったんですね。
res=`cat test.txt`
でなりました。

821 :名無しさん@お腹いっぱい。:04/03/30 16:18
test.txtが空とか?

822 :名無しさん@お腹いっぱい。:04/03/30 21:30
>>819
cat test.txt | ......処理..............

でいいだろうに。

823 :名無しさん@お腹いっぱい。:04/03/31 07:58
>>822
>>687

824 :名無しさん@お腹いっぱい。:04/04/03 10:48
おせーて下さい

Linuxのbashなんですが

echo "aa bb cc"| read dd ee

でdd,eeがNULL何ですが、これってダメなんですか?

もう一つ
cat aa |while read aa
do
if [ $aa = "hoge" ]
then
bb=1
fi
echo $bb
done

echo $bb

ループ内のecho $bb は1が表示されますが
一番最後の echo $bb は値が表示されません

ループ内で定義した変数をループの外で使うことは出来ないのですか?


825 :名無しさん@お腹いっぱい。:04/04/03 11:12
>>824
>echo "aa bb cc"| read dd ee
read はサブシェルで実行されるので、サブシェルが終了すると dd, ee は忘れられる。

>cat aa |while read aa
while はサブシェルで実行されるので(ry

ksh だとこれでもうまくいったような記憶が。

826 :名無しさん@お腹いっぱい。:04/04/03 11:14
>>824,825
サブシェルで実行されるのはシェルスクリプト内でパイプを使って while に渡したときのみ。

-- fuga.sh --
#!/bin/bash
while read aa
do
if [ $aa = "hoge" ]
then
bb=1
fi
echo $bb
done

echo $bb

としておいて、

$ cat aa | ./fuga.sh

とすれば望み通りになる。

827 :名無しさん@お腹いっぱい。:04/04/03 11:27
>>825-826

ありがとさんです。
そうなんですよ、Solaris/kshで動いてたスクリプトを
Linux/bashにコピーしたら動かないんで悩んでました
(Linux初体験)

それまでkshでしかスクリプト書いたことが無かったもんで、
組み込み関数とかは同じようなものみたいだったんで
いけるかな、と思ったんですが、甘かった。

まぁ、そんなに複雑なスクリプトじゃないんで
ご助言を生かして、ぼちぼち改修していきます。

828 :名無しさん@お腹いっぱい。:04/04/03 17:15
cat で渡さなくてもリダイレクトでいいのでは

#!/bin/bash
while read aa; do
if [ $aa = "hoge" ]; then
bb=1
fi
echo $bb
done < aa

echo $bb

829 :名無しさん@お腹いっぱい。:04/04/04 14:36
>>824
826とほとんど同じだけど、パイプの後ろを単純に括弧で括ってしまうのが
簡単だと思います。元のスクリプトをほとんど変更しなくて済むし。

cat aa | ( while read aa
##echo $bbまで
)

>>825,826
パイプに参加しているものはすべてサブシェルになるので、その解説を読んで
「パイプの後ろだけサブシェルになるのか」と誤解する人がいそうな希ガスる。
実際、後輩でそう信じてたのがいたから。kshって結構違うんだよね。

>>801
trでNULLは使えなかったような。perlでも使った方が簡単で高速だと思います。
まあ、シェルのスレなんで、スレタイ的にこんなのどーですかw

od -v -t o1 | sed 's/^[0-9]* *//;s/ *$//' | egrep -v '^$' |\
sed 's/000/040/' | tr ' ' '\n' | sed 's/./& /g' |\
awk '{printf("%c",($1*64+$2*8+$3));}'

830 :名無しさん@お腹いっぱい。:04/04/08 16:07
>>586
>echo *.jpg | sed -n 's/\(....\)\(..\)\(..\)_\(.\)\.jpg/mv & \1\/\1\2\/\1\2\3\/\1\2\3-\4.jpg/p' | sh
これってどういう仕組みで動いてるの?
sedの置換コマンドの中に入ってるmvがどういう処理をするのかわからない。
&はバックグラウンドで実行するということはなんとなく分かるけど。
元のファイル名はechoから受け取って、移動先のファイル名はsedから
受け取ってるのかな?
だれか教えてください

831 :名無しさん@お腹いっぱい。:04/04/08 16:25
>>830
''でかこってるから、&はsedに渡されると思うけど。

832 :名無しさん@お腹いっぱい。:04/04/08 16:26
>>830
うしろの | sh をはずして試してみるべし。
あとでフォローされてるように echo は ls の間違いなので注意。

>sedの置換コマンドの中に入ってるmvがどういう処理をするのかわからない。
どういう処理もしない。ただの文字列。

>&はバックグラウンドで実行するということはなんとなく分かるけど。
違う。man をよく読むべし。


833 :830:04/04/08 16:48
>>831
& の意味を man を読んで理解しました。

>>832
教えてもらったとおり echo を ls に変えて、
後ろの | sh を外してやってみたら...
おー!こういうことだったのか!
こんな方法考えもつかなかった。

>>831-832
ありがとうございました

834 :名無しさん@お腹いっぱい。:04/04/09 10:30
#!/bin/sh
i=1
while [ $i -le 100 ]; do
echo $i
i=`expr $i + 1`
done

これで1〜100まで表示されるんですが、
頭をそろえて
001
002
と表示したいのですが、どうやればいいのか教えていただけないでしょうか?

835 :名無しさん@お腹いっぱい。:04/04/09 10:37
>echo $i

expr 00$i : '.*\(...\)'


836 :名無しさん@お腹いっぱい。:04/04/09 10:38
>>834
for i in `seq -f %03g 1 100`
zshなら
for i in {001..100}

837 :名無しさん@お腹いっぱい。:04/04/09 10:53
>>835-836

ありがとうございます。
勉強になりました。

838 :名無しさん@お腹いっぱい。:04/04/09 12:33
いまどきだとprintf(1)なんてのもあるよ。



839 :名無しさん@お腹いっぱい。:04/04/20 23:41
djb スレよりこっちの方が適切かな?

qmail や daemontools の起動スクリプトの例を見ると、
csh -cf '/var/qmail/rc &'
のように、csh 経由でバックグラウンド起動させてます。
ttp://man.qmail.jp/jinstall/install3.html
ttp://www.emaillab.org/djb/tools/daemontools/svscan.html

これは SIGHUP を受けたときの sh と csh の挙動の違いを利用してると思うんですが、
そうじゃなくて nohup /var/qmail/rc & でいけない理由はあるんですか?

csh -cf 'nohup .... &' としてる例まで見つかるんですが、
わざわざ csh を使わなければならない理由があるんでしょうか。
ttp://www.unixuser.org/~euske/doc/daemontools/myfaq/faq-3.html#8


840 :名無しさん@お腹いっぱい。:04/04/23 08:43
新しい職場で、Solaris5.6上で動くcshスクリプトの山がorz

ttp://www.math.h.kyoto-u.ac.jp/~takasaki/edu/c/cshell.txt
以外に、「ここ読んでおけ!」的解説ページはありますか?
csh-whynotは、前任者に渡して小一時間問い詰めたい気分

841 :名無しさん@お腹いっぱい。:04/04/24 15:39
>>840

csh は「たのしい UNIX」のせいで、利用者が増えてしまったからなぁ。
お世話になった人もいると思うが、結果的に見ると、悪所になって
しまったような気がする。

842 :名無しさん@お腹いっぱい。:04/04/26 16:02
Bシェル系で、printfってどのぐらい実装されてます?
portability低いなら、使わないんですけど…

今使っているのはzsh-3.0.5-nt-beta-0.75 というものです。
http://unxutils.sourceforge.net/ で拾ったものなのですけど…

843 :842:04/04/26 16:09
typeコマンドで見たら、printfは外部コマンドでした…失礼

844 :名無しさん@お腹いっぱい。:04/04/28 00:10
まずはposixを参照のこと

845 :名無しさん@お腹いっぱい。:04/04/29 13:21
このスレいいっすね。「へー知らんかった」ということ多々あり。
ところで私もシェルスクリプトには非常にお世話になっていて、仕事でも
cygwin入れていろいろやっています。で、できたスクリプトを人にあげたり
いじってもらったりしたいという局面が出てきているのですが、今の職場では
シェルスクリプトは殆ど認知されておらずちょっと無理そうです。
で、代替を探しているんですが Java でシェルスクリプト感覚の文字列処理を
行える環境ってありませんか?あればそいつを ant 込みで配布してイイ感じ
に使えると思うんですが。。。みんなJavaはできるので。
具体的にはパターンや簡易なオプションでのファイル名取得やイテレート処理、
comm,sort,diffやらの文字列処理があればいいのかな。

ちなみに職場に受け入れられるかどうかを置いておくとベストソリューションは
Rubyかな、って思っています。日本語ファイル名もへっちゃらで
機能豊富、とっつきやすいから。#自分がRuby使えないんだけど。。。

偉大なシェルスクリプトマスターの皆様は私のような環境におかれたら
どうしますか??



846 :名無しさん@お腹いっぱい。:04/04/29 13:23
python

847 :名無しさん@お腹いっぱい。:04/04/30 01:04
>Java でシェルスクリプト感覚の文字列処理を
>行える環境ってありませんか?

Java っぽくて Java とシームレスに使えるスクリプト言語としては pnuts とか。
でも Java で文字列処理って明らかに無駄な労力のような気がする。

848 :名無しさん@お腹いっぱい。:04/04/30 01:07
そんなこといったらサーブレットやJSP(まぁ文字処理が主な目的じゃないけども)、
1.4で導入された正規表現はどうなるんだ。

849 :761:04/04/30 03:18
>>847
ほしいのは UNIX の shell utility の「機能」といっても
いいかもしれません。sort, sed, awk, find, comm などの
洗練された入力、出力のフォーマット、機能などが Unix に拒否反応を
持っている人達に受け入れやすい環境で適用できたら、と思っているのです。
perl のモジュールにそんなのがあったような、なかったような。
個人的には perl や cygwin を入れさせたいんですがそれも一苦労だし
日本語関係でトラブルが予想されるのがちょっと…なのです。

850 :761:04/04/30 03:22
>>847
pnuts 見ました、こんなのがあるんですね。
http://www.ogis-ri.co.jp/otc/hiroba/technical/pnuts/

クラスを繋ぐ環境が手に入るのはいいのですが、文字列処理のために
繋ぎたいクラスがない、って感じですね。shell util のコードを
Java に移植する…うーん、難しいとは思わないがなんか無駄っぽい。

pnuts ですが bsh のほうが同様の環境としてはメジャーな
感じですね。何かいいとこあるんでしょうか。

851 :名無しさん@お腹いっぱい。:04/04/30 03:23
WSH ってそういうやつじゃなかったっけ

852 :761:04/04/30 03:23
>>846
python は日本語ファイル名でこけませんか?
日本語の含まれるファイルの文字列処理は大丈夫ですか?

853 :名無しさん@お腹いっぱい。:04/04/30 06:07
その調子じゃ布教は無理だろう

854 :名無しさん@お腹いっぱい。:04/04/30 14:09
Perlでいいんじゃないの?

855 :名無しさん@お腹いっぱい。:04/04/30 14:34
同感

856 :名無しさん@お腹いっぱい。:04/04/30 23:44
javaやる人が日本語のファイル名なんか使うの?

857 :846:04/05/01 00:33
>>852
もち大丈夫です。

858 :761:04/05/01 13:52
>>863
まさに布教するどころかこちらが宗旨変えしたほうがよいのではないか、
という状況です。手順書作って「手でやれ」文化なんですよ。バッチ化は少し
時間がかかるから最初の2回ぐらいは手でやるほうがコスト安ですし。
ちょっとした処理はみなさんエクセルとか使ってその度手でやっているようです。

私自身は日本語ファイル名は使わない、とかいろいろ束縛を作ってその中で
作業してきたので、いざ何でもありの現場に入ってみるといろいろ試すのが
怖くなってます。CVS に日本語ファイルが突っこまれていたこともあって
自分が cygwin で作ったスクリプトがこけました。

859 :761:04/05/01 14:03
>>364
やっぱ perl になるんですかね。
日本語を含むファイルに正規表現使うと変なことになった記憶が
あるんですが回避策(jperl 以外)はありますか、ここらへんに
関して安心させてくれるドキュメントがありましたら教えてくださいませ。

Web開発をやっている職場なので Perl なら使ってもあまり
批難は受けずにすみそうです。これまで「シェルスクリプトで
できるからいっかー」と避けてきた Perl をやることに
しようと思います。心の中の声は「今さらPerl? Ruby とか Python とか
もっと洗練されているものを使えば〜」と言ってますが (^^;

860 :名無しさん@お腹いっぱい。:04/05/01 14:24
もはや板違い
アンカーがグダグダ
>>853の意図を誤読?
洗練?
釣り?
黄金?

とりあえず上司に「もっと洗練されている社員を使えば〜」と言っておいて下さい。

861 :名無しさん@お腹いっぱい。:04/05/01 16:23
>>860
>とりあえず上司に「もっと洗練されている社員を使えば〜」と言っておいて下さい。
Web開発なんて職場にそんな事考えられる上司すら居ないんじゃないかと思われ(ry

862 :名無しさん@お腹いっぱい。:04/05/01 16:30
rubyもいいよ

863 :761:04/05/01 16:30
>>860
853の意図は存じておりますよ♪アンカーずれてごめんね。
混沌状態を飛ばしてひとあしとびに洗練された社員にはなるのは
難しいんですよ。うちも人的リソースは厳しいんで私が
頑張って洗練された社員になる予定です(w

おかげさまで考えがまとまりました、とりあえず UNIX shell 環境は
一時おさらばします。


864 :名無しさん@お腹いっぱい。:04/05/01 16:35

>>849 >>850 >>852 >>858 >>859
このレスは全部 >>845 なんだろ?
なんで 761 なんだ? >>761 と同一人物なのか?
仮にそうだとしても分かりにくいぞ。

==
From: [859] 761 <>
Date: 04/05/01 14:03

>>364
やっぱ perl になるんですかね。
==
>>364 は awk について書いてくれてるんじゃないのか?


とりあえず少し落ち着いて整理してくれ。
コメントができない。



>>860 ももう少し優しくしてやれよ…
確かにイケテナイけど、せっかく聞いてくれてるんだからさ



865 :860:04/05/01 16:50
はいな。

866 :845 as 761:04/05/01 19:30
>>864
>>865
やばっ 761 を詐称してしまった…、それにアンカーも酷い…。
厳しいお言葉をいただくのもごもっともです。失礼すました。

867 :名無しさん@お腹いっぱい。:04/05/01 19:44
>>866
どうしたらそこまで間違えれるのか。

868 :名無しさん@お腹いっぱい。:04/05/07 11:19
コマンドラインの結果を1行ずつ読んで細工する方法で
綺麗なのってないでしょうか?

例えば、あるディレクトリのファイルに .txt って拡張子をつける場合、

for i in `ls -1`
do
mv $i $i.txt
done

でいけそうですが、スペースもセパレートされてしまうので、
スペースを含むファイル名があると対応できません。
それで、こんなのを考えてみましたが、無駄が多すぎます。。
j=`ls -1 | wc -l | awk '{print $1}'`
c=0
while [ $c -lt $j ]
do
c=`expr $c + 1`
i=`ls -1 | head -${c} | tail -1`
/bin/mv "$i" "$i.txt"
done


869 :名無しさん@お腹いっぱい。:04/05/07 11:29
確かこんなだったような。
一応自分で動作確認してくれ

set "*"
for i in $@
do
mv "$i" "$i.txt"
done

870 :名無しさん@お腹いっぱい。:04/05/07 12:06
>>868
ディレクトリにファイルしかないというのなら、

ls | while read file ; do
mv "$file" "$file.txt"
done


871 :868:04/05/07 12:27
>>869-870
どちらもいけました。ありがとうございました。

209 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)