2012-02-19 12 views
3

私が何を求めているかを何度も試してみましたが、何も動作していないようです。私はいつも2:not foundのようなもので終わります。ZSHで出力コマンドをキャプチャしてテストする

私はそうのように、コマンドの出力をキャプチャし、それが等しいかどうかをテストしたい

「!」:

function test() { 
    local testv=$(command) 2>/dev/null 
    if [ $(#testv) == "!" ]; then 
    echo "Exclamation mark!" 
    else 
    echo "No exclamation mark." 
    fi 
} 

がどのように私はエラー test:2: = not foundを避けるために、上記のコードを書き直す必要がありますか?

答えて

2

これは動作するはずです:

if [ $testv = '!' ]; then 

いくつかの問題がここにありました:

  • $(...)は、コマンドおよび代替を実行しますその出力。可変の値を代入したいので、$varまたは${var}を使用してください。
  • 私は#が何をしているのか分かりません。 ${#var}は$ varの長さを取得しますが、ここではそうではありません。
  • [は同義語です)testコマンドが==を理解するので、(あなたが間違っを見てみましょうCプログラマなら、これはシェルではないCである)=を使用していません。
  • これはスクリプトでは問題ではないと思われますが、対話型入力の場合は"!"は期待したことをしません。私は'!'を使用して感嘆符を履歴オプションとして解釈できないようにしました。

代わりに、それは==を理解(と一般的にはややきれいな構文を持っている)ことから、あなたは、[[ ]]代わりの[ ]を使用することもできます。

if [[ $testv == '!' ]]; then 

はところで、私はこのスクリプトであることをタグから信頼していますzshで動作します。そうでない場合、構文は少し異なります(基本シェルには[[ ]]がなく、二重引用符で囲まれていない限り、$ testvの値に対してzsh以外の構文解析が行われます)。あなたが確かでない場合(またはポータブルにしたい場合)、ここにPOSIX準拠のシェルで動作するバージョンがあります:

if [ "$testv" = '!' ]; then 
2

はこれで試してみてください:

local testv=$(command 2>/dev/null) 

それはあなたがリダイレクトするコマンドの出力だから。

(私はあなたがが$(#testv)によって何を意味するか分からない。)

関連する問題