0

このコマンドがエラーを返す理由を誰か説明してもらえますか (Solaris ksh の場合):

if [ "(" = "(" ]; then echo 1;fi;
ksh: test: argument expected

同じように bash を使用しても問題なく、期待どおり "1" が返され
ます。また、[[ ]] を使用しても問題ありません。

問題は最初の「(」のようです

4

2 に答える 2

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
于 2009-08-19T10:20:34.823 に答える
1

二重引用符を一重引用符に変更すると機能しますか?つまり、

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 です。

于 2009-08-19T11:59:35.730 に答える