このコマンドがエラーを返す理由を誰か説明してもらえますか (Solaris ksh の場合):
if [ "(" = "(" ]; then echo 1;fi;
ksh: test: argument expected
同じように bash を使用しても問題なく、期待どおり "1" が返され
ます。また、[[ ]] を使用しても問題ありません。
問題は最初の「(」のようです
このコマンドがエラーを返す理由を誰か説明してもらえますか (Solaris ksh の場合):
if [ "(" = "(" ]; then echo 1;fi;
ksh: test: argument expected
同じように bash を使用しても問題なく、期待どおり "1" が返され
ます。また、[[ ]] を使用しても問題ありません。
問題は最初の「(」のようです
そのコマンドは私のkshで機能するようです。
ただし、ksh の IIRC では、[ ] の代わりに [[ ]] を使用することをお勧めします。したがって、移植可能なソリューションの場合は、次のように記述することをお勧めします。
if [[ "(" = "(" ]]; then echo 1; fi;
ただし、ワイルドカード展開が行われないという点で、[[]] は [] とは微妙に異なることに注意してください。http://www.bolthole.com/solaris/ksh-builtins.html#testを参照してください。
アップデート
さまざまなシェルへの移植性を高めるために、ksh では [[]] とまったく同じ効果を持つ組み込みのtestコマンドを使用する傾向があります。
if test "(" = "("; then echo 1; fi
二重引用符を一重引用符に変更すると機能しますか?つまり、
if [ '(' = '(' ]; then echo 1;fi;
追加するために編集: Digital UNIX ksh で問題を再現できました。このプラットフォームでは一重引用符も機能しませんが、括弧のエスケープは機能します。
if [ '\(' = '\(' ]; then echo 1;fi;
ksh の man ページによると、次のように記載されています。
次の文字は、シェルにとって特別な意味を持ち、引用されていない限り単語を終了させます。
; & ( ) | ^ < > <newline> <space> <tab>
...さらに解析ルールを定義します。( は ( 奇妙なことに) 引用されている場合でも特殊文字として解釈されているようです。そのため、エスケープが必要です。ifset -x
を試す前にコマンド ラインで " " と入力すると、シェルが何をしようとしているのかが正確にわかります。 '+' 記号を前に付けて stderr に送信すると、トレースに役立つ場合があります。例:
$ set -x
$ if [ '(' = '(' ]; then echo 1;fi;
+ [ ( = ( ]
ksh: test: argument expected
$
$ if [ '\(' = '\(' ]; then echo 1;fi;
+ [ \( = \( ]
+ echo 1
1
$
ksh の実装にも依存している可能性があります。たとえば、ksh-88 と ksh-93 以降などです。Digital UNIX では、実装は ksh-88 です。