[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 02/10 13:03 / Filesize : 248 KB / Number-of Response : 977
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト相談室



1 名前:デフォルトの名無しさん [2005/04/04(月) 03:43:03 ]
シェルスクリプトに関する質問・回答や議論等を行う相談室スレッド。 


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



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

732 名前:デフォルトの名無しさん mailto:sage [2007/12/05(水) 00:36:45 ]
シェルってゆうな。クズ。

733 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 20:46:08 ]
>>732
やっぱりフルネームで言わなきゃ駄目なのか?

734 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 21:02:25 ]
まあそれ抜きにしてもアレだろ

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

736 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 18:29:03 ]
# crontab
*/10 0-1 * * * ping toTarget

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

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

738 名前:735 [2007/12/07(金) 18:35:34 ]
>>737さま
ありがとう!



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

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

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

741 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:04:22 ]
ホントによろず相談室だなぁ……

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

742 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 20:19:44 ]
>>740
対話的処理をしたいときは expect

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

744 名前:740 mailto:sage [2007/12/23(日) 00:02:58 ]
>>742
で以下のようにしてみたのですが
#!/bin/sh

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

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

745 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 00:32:51 ]
cronから起動されるときのPATHがどうなるかmanで勉強する。

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

あと、expectの使い方って

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

じゃなかったっけ?


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

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

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

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

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




749 名前:747 mailto:sage [2007/12/29(土) 12:23:18 ]
>>748
なるほど,標準入力のかわりだったのですか。
ということで

read list <<EOT #--> A

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


750 名前:747 mailto:sage [2007/12/29(土) 12:38:15 ]
とりあえず
while read line; do list="$list $line";done <<EOS
A
B
C
EOS
echo $list


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

751 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 13:21:26 ]
そりゃぁ、echoすれば改行は消えるね。

752 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 21:26:09 ]
>>750
ダブルクォートをつけてみな。

echo "$list"


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

list='A
B
C'


753 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:50:43 ]
zshとbashじゃそこの挙動違うんだな

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

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

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


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

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


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

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

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

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


758 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:11:50 ]
>runruby.shに


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



759 名前:757 mailto:sage [2008/02/09(土) 17:18:29 ]
>>758 申し訳ございません 間違いました
./runruby.sh -e 'puts "Hello"'でした

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

760 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:22:54 ]
なんで"$@"にしないの?

761 名前:757 mailto:sage [2008/02/09(土) 17:31:24 ]
>>760
できました!!
ありがとうございます

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

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

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

764 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:42:01 ]
3つ目、
x "${cmd} $@" -> "ruby -e" "puts \"Hello\""
o "${cmd} $@" -> "ruby\ -e" "puts \"Hello\""

765 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 17:59:05 ]
よく見たら、 "$@" じゃなくて " $@" なのかよ。


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

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

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




769 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 01:38:48 ]
変数をクォートしないとこうなるけど、この場合は関係ないか

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


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

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

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


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

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

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



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

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

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

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

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

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

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

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



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

cd $PATH$1

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

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

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

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

780 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:51:29 ]
PATHは使っちゃだめよ

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


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

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

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

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

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

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


785 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:26:00 ]
mount nosuid されてるとか。

786 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 13:38:28 ]
>>784
別に cd する必要ないんじゃないか?

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

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

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

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


788 名前:779,784 mailto:age [2008/02/19(火) 01:49:15 ]
>785-787
ありがとうございます。

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

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

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

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

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



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

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

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

790 名前:779,784 [2008/02/20(水) 04:11:45 ]
さっき本屋で分かっちゃいました。

CentOS徹底入門 第2版
www.amazon.co.jp/dp/4798114626/
に書いてありました。
>787さんの通りでした。

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


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

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

792 名前:779,784 [2008/02/20(水) 14:07:08 ]
>791
ありがとうございます。

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

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

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

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


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

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

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

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

795 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 15:19:20 ]
>>792
今日より以前を削除とは?

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

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

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

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

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


797 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 17:15:22 ]
>>796
日本語で

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



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

800 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:11:01 ]
バカみたいにawk使えばいけそうじゃない?
実行して試してないけど下みたいな感じで。

DATE=`date +"%m/%d"`

M=`echo ${DATE} | awk 'BEGIN{FS="/"};{print $1}' `
D=`echo ${DATE} | awk 'BEGIN{FS="/"};{print $2}' `

while read LINE;do

if [[ `echo ${LINE} | awk '{print $1}'` = [*][〜][*] ]] ;then
MM=`echo ${LINE} | awk 'BEGIN{FS="〜"};{print $2}' | awk 'BEGIN{FS="/"};{print $1}'`
DD=`echo ${LINE} | awk 'BEGIN{FS="〜"};{print $2}' | awk 'BEGIN{FS="/"};{print $2}'`
else
MM=`echo ${LINE} | awk 'BEGIN{FS="/"};{print $1}'`
DD=`echo ${LINE} | awk 'BEGIN{FS="/"};{print $2}'`
fi

if [[ ${M}=<${MM} && ${D}=<${DD} ]] ;then
echo ${LINE} >> ${OUT_FILE}
fi

done < ${IN_FILE}

みたいな。



801 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:14:11 ]
あ、dateコマンドで出てきた数値の頭に0がついてたらだめかも。
そのへんは0区切りで$2を取るとか適当にやってください。

802 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:51:41 ]
bashで数値を10桁程の数値をカンマ区切りにしたいのですが、どのような書き方をしたらできるでしょうか?

803 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 23:57:06 ]
>>800
それはOneLinerとは言えないんじゃ……と突っ込もうと思ったら
OneLinerを腐るほど呼んでたのねw

804 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 05:18:51 ]
>>802
標準のコマンドで何かありそうなきもするし、
awk とか sed とか perl とかなら OneLiner で済みそうだが
あえて bash 限定で書いてみたぞ。
expr 使えば bourne sh でも動くようになると思う。

#! /usr/bin/env bash
num=$1
result=''
figure=$[ ${#num} % 3 ]
(( figure > 0 )) && read -n "$figure" result <<< "$num"
while read -n 3 i ; do
 [[ -n "$i" ]] && result="${result},${i}"
done <<< "${num:$figure}"
echo "${result#,}

805 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 20:41:18 ]
expr使っていいんだったらexpr $num : '.*\(...\)'で済んじゃうだろ。
以下1行に詰め込めないこともないawk解。
{
    out=""
    for (l=length(src=$0) - 3; l>0; l-=3) {
        out="," substr(src,l+1,3) out;
        src=substr(src,0,l);
    }
    print src out;
}

806 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 21:28:47 ]
>>804
>>805
なるほど、さまざまな方法があるんですね。
とても参考になりました、ありがとうございました。

807 名前:デフォルトの名無しさん [2008/03/04(火) 17:15:40 ]
cシェルについて質問させてください。
/(スラッシュ)一文字にマッチさせるには
どのように記述すれば良いでしょうか。
以下のようにやりましたが、うまくいきません。
よろしくお願い致します。


#!/bin/csh -f

set etc = /
echo $etc

if ($etc =~ ^/$) then
echo ok
else
echo ng
endif


808 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 17:24:54 ]
sh系みたいにtestコマンドを使って、if [ -$etc == -/ ] then としたらどうだろう。



809 名前:デフォルトの名無しさん [2008/03/04(火) 17:36:26 ]
>>808
即レスありがとうございます!
出来ました<(_ _)>

810 名前:デフォルトの名無しさん [2008/03/10(月) 15:02:33 ]
while read lineでファイルを読み込んで
その行にABCと言う文字があるかないか判定して
あれば 処理1
なければ 処理2という if文での書き方教えてください

811 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 21:33:37 ]
case $line in
*ABC*)
処理1
;;
*)
処理2
;;
esac

ってif文でかよ!



812 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:20:20 ]
grepと組み合わせないと無理か。
1行ごとにgrepなんか起動したくないが。

813 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:24:46 ]
line2=${line%%ABC*}${line##*ABC}
# で削って
if [ ${line} = ${line2} ]; then
# 処理1
else
# 処理2
fi
# とか?

814 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:49:58 ]
if [[ $line =~ ABC ]]; then
echo matched
else
echo did not match
fi
こういうこと?

815 名前:デフォルトの名無しさん [2008/03/12(水) 23:35:10 ]
1レコードのXMLを、シェルを使って字下げなどを自動で行って表示させたいのですが、
なにかうまい方法はないでしょうか?

---------------------------
<all><a>123</a><b><c>456</c><d>789</d></b></all>



<all>
<a>123</a>
<b>
<c>456</c>
<d>789</d>
</b>
</all>
------------------------

というような感じで・・・

816 名前:デフォルトの名無しさん [2008/03/12(水) 23:37:16 ]

すいません、4タブで字下げされてると思ってください。


817 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:48:55 ]
整形式XML全般を扱うというのは、かなり難しいんじゃないか?
perlとかrubyとか使うべき。
よほど単純化されてるんなら、まずはタグ1個が1行になるように改行して、
開始タグなら字下げを増やして、終了タグなら字下げを減らして、って感じか。
ただこれでは <c>456</c> とか無理だが。

818 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:26:53 ]
>>815
おおざっぱに手順を考えてみた。
めんどくさそうなので実装はまかせた。

1. 行の最初にあるタグとその閉じタグの間に他のタグがあれば、タグの頭で改行する。
  この時にインデントの深さをタブ幅文プラスしてタグ名を記録する。
2. インデントの深さが 0 以上ならインデントする
3. タグの間にタグが無いなら閉じタグで改行
4. 記録したタグの閉じタグを見つけたらインデントの深さを減らして記録から削除。
5. 1-4 繰り返し



819 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:29:03 ]
xmllint --format に食わせればおk

820 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 13:13:44 ]
cron などによってある時刻に自動的に起動させるプロセスで、
実行開始から xxxx秒 とか経過してもまだ終了しない場合
強制的に終了させる方法にはどんな方法があるでしょうか?

そして、その方法で注意しておかなければならない
点とかあれば教えてください


821 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 15:00:29 ]
起動したいプロセスをバックグランドで起動して、
必要な秒数sleepしたら問答無用でkillするとか。
そのプロセスが、適切な後処理のために特殊なシグナルを利用できるのなら、
killでそのシグナルを指定すればいい。

822 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 16:33:55 ]
>>820
ロックファイルを作るタイプはプロセスだけ殺しちゃうと
困った事になるかもしれない。

823 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 16:44:02 ]
だからそういうプロセスは適切なシグナルハンドラを用意するべきなんだよね。

824 名前:デフォルトの名無しさん [2008/03/25(火) 22:12:46 ]
Cシェル(ソラリス)について教えてください。
test.txtに、helloが入っていたら、OK、
無ければ、NGと判定させたいのですが、
以下のようにしてもIF文が不正ですと言われます。
Bシェルでは、うまくいくのですが、Cシェル用の記述方法等
ありましたらアドバイスください。

if ( cat test.txt | grep "hello" ) then
    echo OK
else
    echo NG
endif

825 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:14:58 ]
$status

826 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 00:19:08 ]
>cat test.txt | grep "hello"
なんでgrep "hello" test.txtにしないんだ?

827 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 08:23:26 ]
B shell 使えばいいじゃん。

828 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:06:37 ]
ファイル 1.txt 2.txt 3.txt test.bash が存在するディレクトリで以下の
内容を実行するとなぜ1が返ってきますか?4になぜならないのかわかりません。

--test.bash--
#!/bin/bash
current_files=$(ls)
echo ${#current_files[@]}



829 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:32:48 ]
for で current_files の中身を見てみると分かるかと。

for file in "${current_files[@]}"; do echo "[[[$file]]]"; done

830 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:59:01 ]
>>828
× current_files=$(ls)
○ current_files=( $(ls) )

空白入りのファイル名があると期待通り動かないから気をつけろ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<248KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef