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


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

シェルスクリプト総合 その10



1 名前:名無しさん@お腹いっぱい。 [2008/02/11(月) 19:21:07 ]
シェルスクリプトの総合スレです。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずは注意点、リンク、地鎮祭など(>>1-6くらい)をご覧ください。


□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashなので特に注意。
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
 manや参考リンクを見ましょう。
 aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルスクリプトのことをシェルってゆーな
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)

□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
 RubyやPerlの方が適した仕事には素直にそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。

前スレ
シェルスクリプト総合 その9
pc11.2ch.net/test/read.cgi/unix/1187130302/

566 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:31:00 ]
>>564-565
アフォか。
makeだって mtimeで比較するよ。
ctimeでの比較が必須なら make使ったって問題は解決しない。

(ctimeの意味を誤解していて、実はmtimeでもOKなら話は別だが)


567 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:37:06 ]
>>563
>リダイレクトでファイルを作るから、ctimeでないと
>ファイルの作成時刻を比較できない

は誤解してるようだね。

だとすると mtimeで比較して問題ないことになる。
とすると、>>559 のスクリプトでうまく動いているはず。
うまく動いているのに、>>557 で --time=ctime で見ているもんだから、
うまく動いていないと思い込んでいるだけ、というオチ。


568 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:39:24 ]
汚いシェル関数だなぁ。echo消せ。引数使え。

569 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 16:50:19 ]
[ ] と [[ ]] が同居するスクリプトを初めて見た。どっちかに統一しろよ。
[ ] の方推奨だが。
testの -nt は純正シェルでは使えない。
${i} なんて書くくらいなら "$i" って書け。
{ } 付けただけじゃスペース入りファイル名とかの問題回避できないぞ。

570 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 17:28:49 ]
純正シェル(笑)

571 名前:553 [2008/04/02(水) 17:52:14 ]
>> 567
誤解してました。
>> 568
shell関数まで添削してもらえるとは恐縮です。
>> 569
ありがとう。[[ ]]ではなく[ ] を使います。

あと、"$i"の記法はshellの本を注意深く読んだらちゃんと書いてありました。
下記のように直して、実行したら意図どおりに動いてます。m(_"_)m
==========================================
#/bin/bash -x
do_iconv(){
mv $1 "$1".old
/usr/bin/iconv -f euc-jp -t utf-8 < "$1".old > $1
touch "$1".old
}
for i in *.html
do
if [ -e "$i".old ]
then
if [ "$i" -nt "$i".old ]
then
do_iconv "$i"
fi
else
do_iconv "$i"
fi
done
======================================


572 名前:553 mailto:sage [2008/04/02(水) 17:52:54 ]
bash -x の実行例
+ for i in '*.html'
+ '[' -e SandBox.html.old ']'
+ '[' SandBox.html -nt SandBox.html.old ']'
+ do_iconv SandBox.html
+ mv SandBox.html SandBox.html.old
+ /usr/bin/iconv -f euc-jp -t utf-8
+ touch SandBox.html.old
+ for i in '*.html'
+ '[' -e Travel.html.old ']'
+ '[' Travel.html -nt Travel.html.old ']'
+ for i in '*.html'


573 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 19:12:56 ]
>>554の言うように、
"$i".oldの方を編集しない限り、
必ず"$i"の方が新しいのに、(iconvの結果)
> if [ "$i" -nt "$i".old ]
してる。逆に"$i".oldを編集したら何も行われない。

仕様を日本語で書いたらどうか?

たぶん.iconvedを作って、
"$i"と時間比較して新しいものだけiconv、
最後に必ずtouch .iconved、
これでやりたいことに合うんじゃないか?


574 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 19:43:56 ]
>>573
その問題は、

>>557
>touch ${i}.old をiconvの後にしてみましたが

で解決済。

というか、>>571 で、「実行したら意図どおりに動いてます。」
ですべて解決済なんだから、これ以上言うことはない。




575 名前:名無しさん@お腹いっぱい。 [2008/04/02(水) 20:00:06 ]
カレントディレクトリが
/abc/def/ghi/jkl/mno/pqr/stu/
とフルパスであったときに一番最後の部分(stu)を取り出したいのですが
どのように書けばよいのですか


576 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 20:18:40 ]
basename /abc/def/ghi/jkl/mno/pqr/stu/

577 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 20:19:16 ]
basename `pwd`

578 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 21:33:15 ]
>>551
はいはい、それがお前が出した唯一の根拠ね。
で、それが何かの標準になってるのか?

ところで、>>516ので試みた捏造に関しての弁明はどうした?

579 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/02(水) 21:49:00 ]
まだやってんのかw

580 名前:sage [2008/04/05(土) 16:40:16 ]
リナックス等の研究やってます。
www.ine.sie.dendai.ac.jp/homepage/
www.ine.sie.dendai.ac.jp/wiki/index.php?FrontPage

581 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 07:37:45 ]
シェルスクリプトから以下のようなテキストを呼びだして、
環境変数を展開した上で、位置変数に set したいのですが、
お知恵を拝借したく、どうかよろしくお願いします。

$ cat test.txt
$HOME/doc/

いまは、シェルスクリプト内部で、 sed -e 's/\$HOME/$HOME/g' のようにしています。


582 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 07:40:42 ]
>>581
eval set `cat < test.txt`

583 名前:581 mailto:sage [2008/04/10(木) 08:20:51 ]
>>582
どうもありがとうございます!

eval を使ってもう一度、$HOMEを変数展開をするのですね。
独力では全く思いつきませんでした。
本当にありがとうございました。


584 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 08:25:30 ]
>>582
catが無駄です。



585 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 08:28:30 ]
>>584
catなしでどう書くの?

586 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 08:29:07 ]
eval set `< test.txt`

587 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/10(木) 09:30:12 ]
はいはい。bash依存。

588 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 08:28:49 ]
質問です!
timeコマンドの結果をファイルに出力したいのですが、
どうやっても0バイトで出力されます。

以下、やってみたことを記載します。
$ time sleep 1
real 0m1.004s
user 0m0.000s
sys 0m0.001s
$ time sleep 1 > hoge.dat
real 0m1.439s
user 0m0.000s
sys 0m0.001s
$ cat hoge.dat
$ time sleep 1 > hoge.dat 2>&1
real 0m1.009s
user 0m0.000s
sys 0m0.001s
$ cat hoge.dat

やってみたこと以上です。

なぜ出力されないのでしょうか?どのようにすれば出力されますでしょうか?


589 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 08:32:44 ]
>>588
bash使ってるだろ。
timeはbashの特殊な内部コマンドで、リダイレクトできない。
解決するには一旦サブシェルを通す。

$ (time sleep 1) 2> hoge.dat

590 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 11:19:02 ]
>>588
/usr/bin/timeならファイルに出力できるよ。

591 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 11:37:22 ]
>>590
>>589

/usr/bin/time は表示書式が違う

592 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:39:52 ]
\time


593 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:40:30 ]
bashってtimeが内部コマンドなのかw


594 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:44:15 ]
正確には shell keyword



595 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:50:22 ]
あれ?
マニュアルではtimeじゃなくて、timesになっているけど?

596 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:51:30 ]
>>595
ぉぃぉぃ、timesとtimeは全く別のコマンド

597 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 14:58:21 ]
times Print the accumulated user and system times for the shell and
for processes run from the shell. The return status is 0.

ごめん。マニュアル読んだだけでは何が違うのか分からん。
それに、timeの項目自体が見つからんし。


598 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 15:05:56 ]
bash なら help time

599 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/11(金) 15:06:37 ]
man bash なら Pipelines の節。

600 名前:名無しさん@お腹いっぱい。 [2008/04/12(土) 00:11:45 ]
しぇるすぷりくとでHTML書いて
ボタン押したらhoge.shを実行したい

ヒントください><;

601 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 01:02:36 ]
>>600
実行環境を限定しなさい。
OSは? httpサーバは? 使用可能なCGIは? CGI実行時のセキュリティ要件は?

602 名前:名無しさん@お腹いっぱい。 [2008/04/12(土) 01:29:51 ]
OS: FreeBSD 6.3-RELEASE-p1
http: Apache HTTP Server 2.2.8
CGI: This is perl, v5.8.8 built for i386-freebsd-64int
セキュリティ要件: 無し

603 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 01:40:48 ]
>>600
すみません、日本語でお願いします。

604 名前:名無しさん@お腹いっぱい。 [2008/04/12(土) 02:00:52 ]
日本語で書いたつもりなのに文字化けしてるんですか?><



605 名前:>>588 mailto:sage [2008/04/12(土) 06:09:32 ]
>>589
ありがとうございます。


606 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 06:21:07 ]
これシェルスクリプトの話か・・・?

607 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 07:16:24 ]
>>601
答えられないくせに実行環境だけ聞くなよ。
実行環境あまり関係ないだろ。

608 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 07:24:57 ]
>>600
エスパーすると、Webのフォーム入力でシェルスクリプトを入力して
[送信]ボタンを押すと、そのシェルスクリプトが実行されて、
実行結果がWeb上に表示される、って感じのものを作りたいのかな?

609 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 09:21:01 ]
エスパーじゃなくてもシェルスクリプトでCGIプログラム作りたいという事はわかる、>>601が無能なだけ。
>使用可能なCGIは?
この質問に至っては噴飯ものだ。 CGI/1.1と答えればいいのだろうか?

>>600
CGIというサーバー上でプログラムを動かす仕組みがあるから、検索してわからない事があったらまた来なさい。

610 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 09:52:37 ]
>>609
「シェルスクリプトでCGIプログラム作りたい」のじゃなくて、(さすがにそれは知ってるだろ)
ユーザーがWeb上で入力したシェルスクリプトを実行してくれるような
CGIを作りたいんじゃないのか?

611 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 10:26:00 ]
まぁまぁ、ここは有能な>>609に任せておいたらどうだ

612 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 10:38:47 ]
>>610
>>600からそこまで読み取れるなんて想像力がたくましいな。
でも俺に聞かれても困る。元質問者に聞いてくれ(そして、板違いだからwebprog行け)
それとも「CGIを作る? CGI/1.2とかいう新しい規約でも作りたいのか?」と突っ込んで欲しいのか?

>>611 == >>601だな。無能という事実を突きつけられて悔しかったのか?
> 使用可能なCGIは?
この質問で意図した事を答えてみろ。

613 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 10:43:06 ]
hoge.sh は実在します。例示には example.com 等を使いましょう。

614 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 10:51:55 ]
>>612
> >>611 == >>601だな。
違うよ。



615 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 11:11:59 ]
>>602 読むと、CGI自体はperlで作るらしいから、
>>610 の解釈が正しそうだな

616 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 11:53:43 ]
saryのように高速でかつgrep並みの正規表現検索ができるユーティリティってありませんかね?
libstreeとか使って誰か作ってそうな気がするんですが、ぜんぜん見つかりません

617 名前:名無しさん@お腹いっぱい。 [2008/04/12(土) 21:54:43 ]
hoge.sh はドメインじゃなくて スクリプト名では・・・

618 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 22:01:28 ]
ネタにマジレス

619 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/12(土) 23:54:44 ]
実際にwhoisしてみると、空いているらしい。>hoge.sh


620 名前:600 mailto:sage [2008/04/13(日) 00:33:33 ]
>>602
|しぇるすぷりくとでHTML書いて
$create.sh > /usr/local/www/html.html

$cat create.sh
#!/bin/sh
echo \<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\>
echo \<HTML LANG=ja\>
echo \<HEAD\>
echo \<meta http-equiv=\"content-style-type\" content=\"text/css\"\>
echo \<META HTTP-EQUIV=Content-Type CONTENT=\"text/html\; charset=EUC-JP\"\>
echo \<META name=\"generator\" content=\"shell script\"\>
echo \<LINK REV=made HREF=\"mailto:yourmailaddress@your.mail.domain.com\"\>
echo \<LINK REL=contents HREF=\"./index.htm\"\>
echo \<LINK REL=stylesheet HREF=\"./default.css\" TYPE=\"text/css\" TITLE=\"./default.css\" MEDIA=\"screen,tv\"\>
echo \<TITLE\>sample\</TITLE\>
echo \</HEAD\>
echo \<BODY\>
echo \<FORM ACTION=\"/cgi-bin/hoge.cgi\" METHOD=\"POST\" ENCTYPE=\"text/plain\" LANG=\"ja\"\>
echo \<div\>\<INPUT TYPE=\"submit\" TABINDEX=\"0\" ACCESSKEY=\"S\"\>\</div\>
echo \</FORM\>
echo \</BODY\>
echo \</HTML\>

|ボタン押したらhoge.shを実行したい
セキュリティ要件:なしなら、perlスクリプト内に以下のように書けば...
$list[0] = "hoge.sh"
system "/bin/sh", @list;


621 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 07:32:30 ]
>>620
お前 >>600 じゃなくて >>601 だろ。
echoが無駄です。echoは1個だけでできます。
perlのsystemでも、一旦listに入れるのが無駄です。
あと、そもそも >>600 の質問意図とは違うと思います。

622 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 10:30:33 ]
echo1つで済むつーか、catとヒアドキュメントの出番じゃね?


623 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 10:37:58 ]
ヒアドキュメントはテンポラ作るから嫌い。echo 1つがスマート。

624 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 11:44:04 ]
テンポラリ作るとまずいことでもあるんですか?



625 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 11:51:04 ]
>>623
どこにできるんだ?

626 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 12:16:26 ]
>>624
意味もなくHDDに書き込むのが無駄。

>>625
教えて欲しければ「教えてください」と家。
普通は /tmpにできる。シェル側からすぐに unlinkされるから
lsでは見えないけど。トレースすればわかる。

627 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 12:57:52 ]
>626
実装による?

Linuxのzshとbashで
strace cat <<HOGE
hoge
HOGE
としてみたけど別にテンポラリファイル作ってなかった。
fd3番以降を開いてるのは共有ライブラリのリンク時くらい。
"hoge¥n"のreadは0から。
dupとかなかったから、ファイル開いてリダイレクト処理をしたわけでもないな。


628 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 13:18:32 ]
>>627
トレースが下手だな

catをstraceしてもしょうがないだろ。
bashやzshをstraceすること。
catに渡される時にはすでにunlinkされてるから、
catをstraceしても見つからないはず。

629 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 13:35:53 ]
(bashの場合)

$ strace -f bash -c 'cat << EOF
hoge
EOF
'

(中略)
:
[pid 11486] open("/tmp/sh-thd-1208089889", O_RDONLY|O_LARGEFILE) = 4
[pid 11486] unlink("/tmp/sh-thd-1208089889") = 0

テンポラリファイル作ってるね。


(zshの場合)
$ strace -f zsh -c 'cat << EOF
hoge
EOF
'

(中略)
:
open("/tmp/zsh6MaAd3", O_RDONLY|O_NOCTTY|O_LARGEFILE) = 3
unlink("/tmp/zsh6MaAd3") = 0

テンポラリファイル作ってるね。

630 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 13:36:32 ]
$ strace -o bash.log bash
bash-3.1$ cat <<HOGE
> hoge
> HOGE
hoge
bash-3.1$ exit
$ egrep '(creat|unlink)' bash.log
(なにもなし)

だめか。どうやって確認すればいいか、正しいやり方を教えてけろ。


631 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 13:37:09 ]
あああ、-fか。理解。



632 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 16:38:06 ]
/tmpの日付見ればいいんじゃないの?

633 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 16:59:54 ]
catだとすぐ終了しちゃうから、tail -fを使うと良い。

$ tail -f << EOF
hoge
EOF

ってやっておいて、別のxtermから、

$ lsof | grep tail

ってやると、(deleted)って表示されてる /tmp以下の一時ファイルがあるのがわかる。

634 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 17:23:23 ]
>>632
それだけだと、無関係のプロセスが/tmpをいじくった可能性が残る。




635 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 17:33:54 ]
忙しくないマシンで何回かやれば可能性は実用上0になるだろ

636 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 17:36:00 ]
それで満足ならいいんじゃね?


637 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 17:59:36 ]
>>633 がもっといい方法示してるじゃないか。

638 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 19:53:17 ]
>>626
礼儀知らずで申し分けありませんでした。テンポラリファイルを作るというこ
とは、シングルユーザーモードなどで、リードオンリーファイルシステムだと
here doc を使ったシェルスクリプトは動かないということでしょうか?


639 名前:名無しさん@お腹いっぱい。 [2008/04/13(日) 20:15:12 ]
エディタの置き換えでも出来る事なのですが良ければ教えてください

わるs
わるk
わるi
わりこn
わりこm
わりあt
じょうち
じょうちょう
じょうなん
のように語尾にアルファベットが付いているのと付いてないのがあるんですけど
アルファベットを削除する方法とかってSEDではどのようにするのでしょうか?


640 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 20:20:09 ]
>>639
sed 's/[a-z]$//'

641 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/13(日) 20:56:04 ]
>>586-587
bash依存じゃないだろ。kshでも使えるから、標準で使っていいんじゃないの?

642 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 02:04:22 ]
>>641
読まずにりぷらい、まあ、もちつけ共通拡張かも知れないだろ。
POSIXに規定されているか読みなおすんだ。

643 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 13:18:12 ]
配列の値の設定ってバックスラッシュか何かで
複数行にまたがって書くことはできないのでしょうか?

644 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 13:36:12 ]
>>643
できる。シングルクォートを使うのがいい。

$ hoge=('aaa
aaa
aaa'
'bbb
bbb
bbb')
$ echo "${hoge[0]}"
aaa
aaa
aaa
$ echo "${hoge[1]}"
bbb
bbb
bbb




645 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 14:56:04 ]
>>644
どうもありがとうです

646 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 15:00:53 ]
はいはい、バッシュ依存。

647 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/14(月) 21:22:58 ]
kshでも使えるからデファクトだろ?

648 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 13:24:12 ]
Solaris8上でBourne Shellを用いてスクリプトを書いています。
dateコマンドを整形する際にシングルクォートで括りますが、
$ echo `date '+%H%M`
などとしても通ってしまうのは何故なんでしょうか?

649 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 13:54:55 ]
>>648
Solarisのバグです。シングルクォートはちゃんと閉じましょう。

650 名前:名無しさん@お腹いっぱい。 [2008/04/15(火) 20:40:12 ]
シェルを始めたのですが、変数でいきなり詰まりました ><
$i = 123;
=: command not found
もしかしてシェルでは = は外部コマンドなんでしょうか?

651 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 20:47:30 ]
何シェルかくらいかこうぜ・・・

i=123

652 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 20:49:37 ]
>>651
今度はこうなります
i = 123
i: command not found

653 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 20:57:39 ]
>>651のをコピペしな

あと、何シェルかくらいかこうぜ・・・

654 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:03:03 ]
>>653
この場合何シェルか関係あるか??



655 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:24:30 ]
関係有るから指摘している。
が、cshだったら他所へ行ってくれ。

656 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:26:27 ]
cshだったらエラーメッセージが違うじゃん。回答者はそれくらい見抜かないと。

657 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:27:17 ]
>□お約束
>・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
> bash/zsh/ksh/ashなどに依存する場合は明示しましょう。


658 名前:650 mailto:sage [2008/04/15(火) 21:30:24 ]
#!/bin/shです。
i = 123;
ってやっても、やっぱり
i: command not found
と出ます><

659 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:31:33 ]
650はネタなのかマジなのか。

660 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:50:24 ]
シェルでは = は比較を表す (例: [ $i = 123 ] )
代入は := で。

661 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 21:50:27 ]
i = 123でなくてi=123です。スペースを入れてはいけません。

662 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/15(火) 22:08:02 ]
ネタはほっとけ。

663 名前:名無しさん@お腹いっぱい。 [2008/04/16(水) 08:48:00 ]
質問させて下さい。

あるディレクトリ以下の、特定の拡張子(.tig)をもつファイルの(find ./ -name "*.tig")
名前を変えて( hoge.tig -> hoge_org.tig)
その二つの名前を与えたコマンドを実行したいです。( hoge -t hogu hoge_org.tig hoge.tig)

for org_name in `find ./ -name "*.jpg"`
do
$name = $org_name + "_org";
echo $org_name; echo $name;
done

と言うのを考えてみたのですが、エラーでうまく行きません。
あと、拡張子の前に名前を追加したいのですが、実現方法が分かりません。

もしよろしければ、教えて頂けると助かります。
よろしくお願いします。


664 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/16(水) 08:53:43 ]
>>663
とりあえず、
$name = $org_name + "_org";
の部分のみに回答。
まず、perlみたいな書き方の癖はやめろ。

name=`basename $org_name .jpg`_org.jpg


あと、質問が、最初は .tigと言ってるのに下のfor文は .jpgで、矛盾してるぞ。



665 名前:663 mailto:sage [2008/04/16(水) 08:58:21 ]
ありがとうございます。
それがわかれば、なんとかできそうです。

.jpgなのは、ローカルな環境でテストをしたため違うファイルを使っていました。



666 名前:名無しさん@お腹いっぱい。 mailto:sage [2008/04/16(水) 13:41:14 ]
findでやってるから'/'含みのpathnameになる。
しかしbasenameは最後のコンポーネントだけ切り出してしまう。

name=`echo $org_name | sed 's/.jpg$/_org.jpg/'`

の方が良いと思われ。あるいは、

dir=`dirname "$org_name"`
org=`basename "$org_name"`
new=`basename "$org_name" .jpg`_.org.jpg
orgpath="$dir/$org"
newpath="$dir/$new"






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

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

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