こんにちは。
シェルスクリプトで謎の現象が起こりまして悩んでいます。

現在、
#!/usr/bin/sh
var='foo'
if [ $? - eq - 0 ]; then
mv xxx.bz2 xxx.old.bz2
echo $var | bzip2 -z >xxx.bz2
fi
といった感じのシェルスクリプトを動かしています。
これを手作業で、
foo | bzip2 -z >xxx.tmp.bz2
とやると、xxx.tmp.bz2は1.2MB程度のファイルとなるのですが、
上記のシェルスクリプトで実行すると8KBほどにしかなりません。

シェルスクリプトの変数のサイズの制限かと思い、調べてみましたが、
特に制限があるとの資料はみつかりませんでした。
fooの出力がバイナリなので、そのせいかとも思ったのですが、unix系列の場合、windowsと違ってテキスト/バイナリの区別はないはずだしということで、理由がわかりません。

シェルの変数には、やはり制限があるのでしょうか?それとも他の理由でしょうか。ご存知の方がいらっしゃいましたら、ご教示お願いします。

環境はsolarisです。バージョンは、
$ cat /etc/release
Solaris 10 8/07 s10s_u4wos_12b SPARC
Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
Use is subject to license terms.
Assembled 16 August 2007

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

このQ&Aに関連する最新のQ&A

A 回答 (4件)

変数と言うより、シェルのコマンドライン長の制約の気がします。


圧縮して1.2MBということはfooの出力は数十~数百MB?
外部コマンド起動の場合は、Linuxだと128KBが上限のようですが、echoは組み込みコマンドなので、もっと上限は大きいはずです。
変数に200MBいれてみると、入りましたけど、echoしてみるとbashが落ちました。SolarisだとOSが違うので、上限も異なると思いますが。

やはり変数に入れない方がいいでしょうね。

foo | bzip2 -z >xxx.tmp.bz2
ただ、ステータスを調べるのは面倒。パイプのステータスはパイプの最終段のコマンドつまりbzip2のステータスになります。

bashだと、${PIPESTATUS[0]} でfooのステータスが取れるのですが、shだとちょっと細工が要ります。

status=`((foo ; echo $? >&3) | bzip2 -z >xxx.tmp.bz2) 3>&1`
if [ $status = 0 ]
then mv xxx.bz2 xxx.old.bz2; mv xxx.tmp.bz2 xxx.bz2
else rm xxx.tmp.bz2
fi

この回答への補足

うまくいきました。ありがとうございます。

補足日時:2009/05/15 14:07
    • good
    • 0
この回答へのお礼

なるほど、ありがとうございます。
どうやら変数に入れないほうがいいのは確かなようですね。

>ただ、ステータスを調べるのは面倒。パイプのステータスはパイプの最終段のコマンドつまりbzip2のステータスになります。
はい、ステータスを調べる必要があるので・・。必要なければ素直に
foo | bzip2 -z >xxx.tmp.bz2
で、よかったのですが。
>status=`((foo ; echo $? >&3) | bzip2 -z >xxx.tmp.bz2) 3>&1`
>if [ $status = 0 ]
>then mv xxx.bz2 xxx.old.bz2; mv xxx.tmp.bz2 xxx.bz2
>else rm xxx.tmp.bz2
>fi
参考になります。試してみます。

お礼日時:2009/05/15 10:08

んー。

fooの出力結果をbz2で保存したいというのが目的でよいのかな?

Solaris は、時々コマンドが微妙に違っていたりするのであまり自信ないですけど
シェルでは、基本的にクォーティングする癖をつけた方がよいですよ。

#!/usr/bin/sh
var="$(foo)"
if [ $? -eq 0 ]; then
mv xxx.bz2 xxx.old.bz2
echo "$var" | bzip2 -zc >xxx.bz2 || echo error
fi

としてみたら、どんなです?
もしうまくいったとしたら、$varに0x0dが混ざっていたのでしょう。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。
テストコードを書いてみました。
$ cat test.sh
#!/usr/bin/sh
var0="\0015"
var=12345${var0}A
echo $var
echo "$var"

$ test.sh
A2345
A2345

と、なりましたので、どうやら改行が原因ではないようです。
他、
var0="\0042"
としても試してみましたが、結果、
12345"A
12345"A
と、なりましたので、バイナリであることはおそらく問題がないのかなと思います。
いずれにせよ、あまり大きなデータを変数に入れるのは問題があるようなので、変数に入れない方向で考えてみます。

お礼日時:2009/05/15 11:19

echo は文字列しか処理できないんじゃない?


シェルにも
echo $var | bzip2 -z >xxx.bz2
じゃなくて
foo | bzip2 -z >xxx.tmp.bz2
って書けばどう?
    • good
    • 1

この場合


echo $var = echo foo
だから, 「コマンド foo の出力を bzip2 で圧縮する」んじゃなくて「文字列 foo を bzip2 で圧縮してる」んだよ.

この回答への補足

すみません、間違えました。
var='foo'
じゃなくて、
var=`foo`
でした。申し訳ないです。

補足日時:2009/05/14 19:10
    • good
    • 0
この回答へのお礼

重ねてすみません。
間違えたというのは、転記ミスということです。
うまく動かないスクリプトに書いてあるのは、
var=`foo`
です。

お礼日時:2009/05/14 19:15

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字列型の一般的な変数名は?

おはようございます。

サンプルコードで
数値型の変数名は
Dim i As Long
のようにiをよく見かけます。

ただ、私が勉強不足のため
文字列型の変数名の一般的な文字に何が使われているのかわかりません。
(str?moji?など?)

サンプルコードを書くときに使用する
文字列型の変数名を教えてください!

Aベストアンサー

こんにちは。私の場合は自己流ですが、ネットなど見て他の方を
参考にして今日に至っています。

ルールは簡単で変数に何を(何の型)格納するかによって変えています。
・長整数の数字を格納する場合:Dim lngXXX as Long
・文字列を格納する場合:Dim strXXX as String
・ワークシートを格納する場合:Dim Wsh as WorkSheet

などです。「変数の型」を「変数の名前」に使います。
これで時間が経過した後にプログラムを読み返した時に
思い出しの助けとなります。
「XXX」の部分も同様で変数を使う目的の名前を含ませると、
後で読んだときにさらに助けになると思います。
例えばString型で何からの「名前」を格納するときには
Dim strName as String
などXXX→Nameとすると可読性が上がると思います。
他の方の回答でもあるように日本語の変数は使わないように
しています。

なお、変数名でアルファベット大文字、小文字混在を使うことで
変数を入力時にすべて小文字で入力したときに変数を打ち間違えていると
気づきやすくなりこれも小さい便利です。

こんにちは。私の場合は自己流ですが、ネットなど見て他の方を
参考にして今日に至っています。

ルールは簡単で変数に何を(何の型)格納するかによって変えています。
・長整数の数字を格納する場合:Dim lngXXX as Long
・文字列を格納する場合:Dim strXXX as String
・ワークシートを格納する場合:Dim Wsh as WorkSheet

などです。「変数の型」を「変数の名前」に使います。
これで時間が経過した後にプログラムを読み返した時に
思い出しの助けとなります。
「XXX」の部分も同様で変数を使う目的...続きを読む

QRuby インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶ

#!/usr/bin/ruby

def foo(arg)
arg.upcase
end

def bar(arg)
arg.upcase
end

class Foo
attr_reader :foo
def initialize(arg)
@foo = foo(arg) #@foo = bar(arg)とすれば期待した結果が得られる
end
end

f=Foo.new("hoge")
puts f.foo

上記実行するとエラーになります。

Class Fooの中のでfooといえば、インスタンス変数@fooであって、関数のfooではないって事なのでしょうか。
インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶことはできないのでしょうか?

Aベストアンサー

クラス Foo の中で attr_reader :foo した際にメソッド foo() が定義されます。
その後 Foo の中で foo と言えば Foo.foo() です。

最初に定義した、大文字にするバージョンの foo は Kernel.foo() として明示的に呼び出すしかないでしょう。

Q【Java】参照型で宣言された変数名の抽出

現在、Javaを学習中の大学生です。

Javaのソースコードを解析し、その中で宣言されている変数名を抽出して、
変数表のようなものを作成するJavaプログラムを書いているのですが、
参照型(クラス型)で宣言されている変数名を抽出する方法が思いつきません。
よろしければ、何かアイディアをいただけないでしょうか。

プリミティブ型の変数については、StreamTokenizerクラスを利用しています。
コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
するという、単純な方法を使っています。こちらも、改良すべき点などあれば、
アドバイスいただけるとありがたいです。

デバッガを使えば出来ないことはないようですが、
出来ればデバッガは使わない方法でお願いします。

Aベストアンサー

ひとまず
>コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
この方法だとローカル変数も抽出してしまうと思いますが
ローカル変数も抽出の対象にするんでしょうか?

ローカル変数を対象としないなら、alice_asahina様の回答にある様にリフレクションが楽でしょう。
ただし、その場合は抽出元がソースコードでは無くクラスファイルになる事に注意して下さい。

あくまでソースコードを対象として処理するのであれば、
>コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
でしなければならない事の概要としては間違っていないと思いますが、
実装の上ではjavaがフリーフォーマットである事に注意して下さい。
型名の途中にホワイトスペースが挟まる事はありませんが、配列の場合こんな書き方も出来ますので。

int a
[
];

また、その際にローカル変数を抽出の対象にしないのであれば、
更に宣言スコープ等を考慮する必要が出てきますし、
これに内部クラスや匿名クラスのフィールドも混ざってくると非常にややこしい事になると思いますが、不可能ではありません。
がんばってください。

ひとまず
>コードをトークンに分解して、型名の次に来るワードトークンを変数名として抽出
この方法だとローカル変数も抽出してしまうと思いますが
ローカル変数も抽出の対象にするんでしょうか?

ローカル変数を対象としないなら、alice_asahina様の回答にある様にリフレクションが楽でしょう。
ただし、その場合は抽出元がソースコードでは無くクラスファイルになる事に注意して下さい。

あくまでソースコードを対象として処理するのであれば、
>コードをトークンに分解して、型名の次に来るワードトークン...続きを読む

QUNIXシェルプログラミング ${@+"$@"}

「入門UNIXシェルプログラミング」という書籍に以下のような記述がありました。
どうも矛盾しているようで、理解できないのですが、シェルに詳しい方、解説をお願いできないでしょうか。よろしくお願い致します。

以下の文章が、もし「"$@"は""に、"$*"はNULLに置き換わります。」なら理解できるんですが・・・
誤植では、ないですよね…?

(以下引用)--------------------------------------------------------
$*をダブルクウォートで囲むと、1つの文字列になります。$@をダブルクォートで囲むと、それぞれ別々の文字列であると解釈されます。
それならいつでも、「"$@"」を使えば混乱がなくていいじゃないか、と思われるかもしれません。
ところがこれにはこれで落とし穴はあるのです。
位置パラメタに何の値もセットされていない場合、つまり、渡すべきパラメタが何もない状態のときには、"$@"はヌルに、"$*"は""に置き換わります。
ヌルの場合はパラメタとして処理しませんが、""は「何もないパラメタがある」として処理します。どちらを選択しなければならないかは、状況によって判断しなくてはなりません。
一般的には、前節で説明した${variable+value}の形式を使うのが最適でしょう。
${@+"$@"}
こう書くことで、位置パラメタに何もセットされていない場合には何もしない、という条件を作れます。

「入門UNIXシェルプログラミング」という書籍に以下のような記述がありました。
どうも矛盾しているようで、理解できないのですが、シェルに詳しい方、解説をお願いできないでしょうか。よろしくお願い致します。

以下の文章が、もし「"$@"は""に、"$*"はNULLに置き換わります。」なら理解できるんですが・・・
誤植では、ないですよね…?

(以下引用)--------------------------------------------------------
$*をダブルクウォートで囲むと、1つの文字列になります。$@をダブルクォートで囲むと、それ...続きを読む

Aベストアンサー

この記述は、パラメータ無しの時の "$@" の展開が昔と今では違っていることを踏まえて無いので一部意味不明になってます。

例えば、引数が、a "b c" d という3つの文字列のとき、"$1" は a, "$2" は "b c", "$3" は d になります。
"$@" は、a "b c" d の3つの文字列になり、"$*" は、"a b c d" と1つの文字列になります。引用符で囲まず、単に $@ や $* と書くと、a b c d という4つの文字列になります。

で、引数の個数がゼロのとき、"$*" は "" (空文字列) という1つの文字列、つまり "$*" は引数の個数に関係なく常に1つの文字列になります。これに対して、"$@" は「空」つまりゼロ個の文字列に展開されます。

つまり、シェルスクリプトの引数をできるだけそのまま子供のコマンドに伝えるときには、"$@" を使えばいい訳です。これで、引数の個数がゼロ個であれ、たくさんであれ、引数が引用符で囲まれていても常に、親スクリプトの引数と同じ物、同じ個数が子コマンドに渡ります。

ところが、昔の/bin/shでは、引数がゼロ個の時の "$@" は空でなく "" という1つの空文字列に展開されるという仕様でした。このため、「できるだけそのまま子供のコマンドに伝える」という場合には、${@+"$@"} と書く必要がありました。現在のほとんどのshでは、"$@" でOKです。もしかすると古い仕様のままのshがあるかもしれませんが。

この記述は、パラメータ無しの時の "$@" の展開が昔と今では違っていることを踏まえて無いので一部意味不明になってます。

例えば、引数が、a "b c" d という3つの文字列のとき、"$1" は a, "$2" は "b c", "$3" は d になります。
"$@" は、a "b c" d の3つの文字列になり、"$*" は、"a b c d" と1つの文字列になります。引用符で囲まず、単に $@ や $* と書くと、a b c d という4つの文字列になります。

で、引数の個数がゼロのとき、"$*" は "" (空文字列) という1つの文字列、つまり "$*" は引数の個数...続きを読む

QC言語のfloat型変数の値代入と表示について

float型変数の値代入と表示について質問があります。

#include <stdio.h>

int main(void)
{
 float flVal = 50.456;
 printf("float型変数:%f", flVal);
 return 0;
}

上記を実行すると、「float型変数:50.456001」と表示されました。
また、float flVal = 50.1; と変えて実行すると、「float型変数:50.099998」と表示されました。

それぞれ期待していた結果は、
「float型変数:50.456000」、「float型変数:50.100000」だったのですが
代入した値と結果が微妙に異なる理由は何でしょうか。よろしくお願いします。

Aベストアンサー

IBMのページから
http://www-06.ibm.com/jp/domino04/lotus/support/faqs/faqs.nsf/all/729933
基本的に小数点以下の数値を含むものは(0.5,0.25、0.125などを除き)、誤差が生じるため。

実際の浮動小数点演算プログラムでは、許容できる範囲であれば一致しているとみなして処理を行うことが多い。

irb(rubyの対話型インタプリタ)やpythonのプロンプトで
irb> 0.1 +0.2 == 0.3 (Enter) とすると
falseが返る。

金額計算などでは単位未満(日本での銭単位とか)を扱う場合はこれでは困るので、小数点以下でも有効桁数内では誤差が生じない固定小数点型が用いられる。

COBOLが何のかんのと言われながら、勘定系取引でシェアが高かったのも基本が固定小数点型を採用していた事が大きい

SQLでも整数型、浮動小数点型、固定小数点型みんなあります。
(Oracleは長いこと、固定小数点型で全部こなしてましたが)

JavaではBigDecimalクラスが固定小数点です。ただ、Java演算子のオーバーロードが出来ないので、いちいちadd、sub、multiply、divideメソッドを使わなければならないのがちょっと面倒。

.Net Framwork( VB.NET、C# )のdecimalクラスの方が直感的かもしれない。

ちなみにrubyにもあります。
http://www.ruby-lang.org/ja/man/html/BigDecimal.html

IBMのページから
http://www-06.ibm.com/jp/domino04/lotus/support/faqs/faqs.nsf/all/729933
基本的に小数点以下の数値を含むものは(0.5,0.25、0.125などを除き)、誤差が生じるため。

実際の浮動小数点演算プログラムでは、許容できる範囲であれば一致しているとみなして処理を行うことが多い。

irb(rubyの対話型インタプリタ)やpythonのプロンプトで
irb> 0.1 +0.2 == 0.3 (Enter) とすると
falseが返る。

金額計算などでは単位未満(日本での銭単位とか)を扱う場合はこれでは困るので、小数点以下でも...続きを読む

QBourne Shellでネストした上位シェルに$?を返す方法

Bourne Shellでは$?で直前のコマンドのステータスを確認できるようですが、これとは逆にネストした上位シェルに$?を返す事はできますか?

aaaa.sh から bbbb.sh を呼び出しているとして、その呼び出した直後に$?でステータスを確認する場合、
bbbb.sh 側ではどのように戻り値をセットすれば良いですか?

Aベストアンサー

話が込み入っているようですが・・・

単純に子プロセス(下位シェル)で、

exit 4

とすれば、親プロセス(上位シェル)で参照できます。

Q 日付型なら変数の先頭になんてつけてますか?

変数名で、
文字列型なら
Dim str組織名 As String
数値型なら
Dim intNo As Long
としてるのですが、
日付型なら変数の先頭になんてつけてますか?

Dim date月日 As Date
にしようかなと思ったのですが
なんかくどいかなって感じます。

Aベストアンサー

 ご質問のカテゴリが [デジタルライフ] - [ソフトウェア] - [Office系ソフト] ですので「VBA(Visual Basic for Applications)」でのお話しとして回答いたします。

 Office 系の解説で有名な「インストラクターのネタ帳」に
●変数のプレフィックス一覧
http://www.relief.jp/itnote/archives/001268.php
というページがありますが、ここに、

'-- ここから引用------------------------------------------------------
対象:Visual Basic for Applications

変数名にデータ型がわかるようなプレフィックス(プリフィックス)をつける記述スタイルがありますが、どのデータ型のときにどんなプレフィックスをつけるか、Microsoftのサイトを元に一覧にまとめておきます。
'-- ここまで引用------------------------------------------------------
として、
データ型/プレフィックス/変数の例
文字列型 (String)/str/strFName
日付型 (Date)/dtm/dtmStart
のように掲載されています。

 ちなみに、上記ページにある論拠としての「Microsoftのサイト」ですが、リンク切れになっておりますので、こちらをご覧ください。
http://web.archive.org/web/20050309034601/http://www.microsoft.com/japan/developer/library/VBCon98/vbconconstantvariablenamingconventions.htm

 ご質問のカテゴリが [デジタルライフ] - [ソフトウェア] - [Office系ソフト] ですので「VBA(Visual Basic for Applications)」でのお話しとして回答いたします。

 Office 系の解説で有名な「インストラクターのネタ帳」に
●変数のプレフィックス一覧
http://www.relief.jp/itnote/archives/001268.php
というページがありますが、ここに、

'-- ここから引用------------------------------------------------------
対象:Visual Basic for Applications

変数名にデータ型がわかるようなプレフィックス...続きを読む

QBシェルで、1文字づつ読み込む方法を教えてください。(バイナリ)

Bシェルで、1文字づつ読み込む方法を教えてください。(バイナリ)

以前、下記の質問をして、回答を頂きました。
この中の入力ファイル『test.txt』がバイナリ形式だった場合は、
どのようにしたら良いでしょうか。

### 質問 ############################################
次のように文字が並んでいて、
A B C D
E F G H
I J K L
M N O P
それぞれの番地と共に、上記の文字を出力する場合、
どのようにしたら宜しいでしょうか。

入力ファイル:test.txt
A B C D
E F G H
I J K L
M N O P

1 2 3 4
1 A B C D
2 E F G H
3 I J K L
4 M N O P

出力ファイル
A 1 1
B 2 1
C 3 1
D 4 1
E 1 2
F 2 2
G 3 2
H 4 2
I 1 3
J 2 3
K 3 3
L 4 3
M 1 4
N 2 4
O 3 4
P 4 4

### 回答 ############################################
yy=1
while read line; do
xx=1
set -f $line
while [ $# -gt 0 ]; do
echo $1 $xx $yy
shift
xx=`expr $xx + 1`
done
yy=`expr $yy + 1`
done < test.txt
#####################################################

どうぞ宜しくお願い致します。

Bシェルで、1文字づつ読み込む方法を教えてください。(バイナリ)

以前、下記の質問をして、回答を頂きました。
この中の入力ファイル『test.txt』がバイナリ形式だった場合は、
どのようにしたら良いでしょうか。

### 質問 ############################################
次のように文字が並んでいて、
A B C D
E F G H
I J K L
M N O P
それぞれの番地と共に、上記の文字を出力する場合、
どのようにしたら宜しいでしょうか。

入力ファイル:test.txt
A B C D
E F G H
I J K L
M N O P

...続きを読む

Aベストアンサー

od でテキストにするといいかも....

Q変数の型を定義しなかった場合どうなりますか?

現在、VBAを使ってプログラミングを行っているところなのですが、
一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、このように型を定義しなくとも使うことが出来ます。もし定義しなかった場合、その変数の型は何に設定されているのでしょうか?
では型を定義するメリット及び、せずに使った場合のデメリットは何なのでしょうか?

私が使っているのはVBAですが、他の言語では型を定義しなければ、その変数を使うことが出来ないというようなものもあるのでしょうか?

Aベストアンサー

こんばんは。

>一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、

もし、入門者に対して、そのようなことを言う人は、経験のあるインストラクターではないと思います。有名な教本などには、そのようなことは書かれていないはずです。

変数を使う時の問題点をあえて書かせていただきます。

私は、今のところ、VBA専門の回答をしていますが、VBAの入門レベルの人は、変数のデータ型を宣言すると、初心者には分からないエラーが時々出るようになります。入門レベルでは、宣言するというのは、入力間違いを減らすために、モジュールの先頭に、Option Explicit と入れ、プロシージャ内で単に Dim 〇〇 とすればよいです。

データ型が決められていないなら、データ型の宣言しないほうが分かりやすいはずです。無理に入れたところで、初心者は、どうしてエラーが発生したか分かりません。それは、扱うデータ型のサイズなどが分からないからです。

VBAの変数のデータ型には、ほとんど、それしかないというものがあるのですが、そういう変数が分かるようになるまでは、しばらくは、テキストを参考にしたり、自分でトライアンドエラーを繰り返し、VBEditor のローカルウィンドウを確認しながら入れてもらうしかありません。ローカルウィンドウには、Variant/Long とか、本来のデータ型が出てきます。

私は、そういう話は、決まりきったことであっても、説明するのは面倒だと思うことが多いです。私は、あまり入門者に対しては教えることはしませんが、分からなければ、あえて使わなくてもよいと言います。

今のPCのスペックで、変数を宣言しないからといって、言うほどの大きな違いがあるとは思えません。Variant 型やString 型は、2Gまでの余裕があるのですが、VBAでは、それ以前に、アプリケーションがVBAに割付されたメモリの制限があり、そこでトラブってきてしまいます。まず、変数自体で、どうこうなるとは思えないです。

本格的には使いこなしは、建前論ではなく、本来、明示的に入れないと意味がありません。

主に、丸め誤差に対してデータ型のゆらぎが発生します。
'-------------------------------------------
'計算結果はどれも 0 となるはずです

Sub Sample1()
  Dim dbl_A As Double
  Dim sng_B As Single
  Dim cur_C As Currency
  Dim var_D As Variant
'リテラル値は変数型に影響を受けます。
'Variant型にしておいて、リテラル値に型宣言文字を使用するのは関心しません。
  dbl_A = 0.5 - 0.4 - 0.1
  sng_B = 0.5 - 0.4 - 0.1
  cur_C = 0.5 - 0.4 - 0.1
  var_D = 0.5 - 0.4 - 0.1
End Sub
'-------------------------------------------

>私が使っているのはVBAですが、他の言語では型を定義しなければ、その変数を使うことが出来ないというようなものもあるのでしょうか?

プログラミング言語自体は、ほとんどデータ型の宣言をしないといけないと思います。それだけ、前提となる敷居が高いということです。

逆に、VBAの親戚のVBScript の場合は、データ型の宣言が出来ません。それだけに、例えば、文字と数字の比較は、そのまま比較してはならないわけです。VBAの場合も本来は、If 文字 = 数字 Then という比較すること自体が間違いのはずですが、それがまかり通ってしまうのですから、そういう点でデータ型があやふやになってしまっているわけです。だから、そういうアプリケーションの便利な機能に助けられてコードが成り立っているわけですから、厳密に大きな問題にはならないと思います。

'-------------------------------------------
'VBAサンプルプログラム(本来は、間違いのはずです)

Sub Sample2()
Dim i As Long
Dim j As String
i = 1
j = "1"
If i = j Then
 MsgBox "OK"
Else
 MsgBox "different"
End If
End Sub
'-------------------------------------------

こんばんは。

>一般的に、プログラムの最初で変数に対してintegerやlongといった型を定義してから使うというように教わりますが、

もし、入門者に対して、そのようなことを言う人は、経験のあるインストラクターではないと思います。有名な教本などには、そのようなことは書かれていないはずです。

変数を使う時の問題点をあえて書かせていただきます。

私は、今のところ、VBA専門の回答をしていますが、VBAの入門レベルの人は、変数のデータ型を宣言すると、初心者には分からないエラーが時々出るよ...続きを読む

Qシェルで正規表現 YYYY/MM/DD

引数で受け取った文字列が YYYY/MM/DD形式であるかを判定したいのですが、シェルが初めてなのでよくわかりません・・・。

どなたかご教授ください!
よろしくお願いします。

Aベストアンサー

数字とスラッシュの並びであることを判断したいのなら正規表現を使うまでもなくファイルマッチで出来ます。

case "$1" in
[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]) FLAG=true ;;
*) FLAG=false ;;
esac
if $FLAG
then echo YYYY/MM/DD 形式
else echo YYYY/MM/DD 形式でない
fi

日付として正しいかはまた別の話。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報