6

私は魚の殻の git.fish 補完スクリプト (/usr/local/Cellar/fish/2.1.2/share/fish/completions) を読んでいて、構文の意味を理解するのにいくつかの問題に遭遇しました。

ブロックでは、

function __fish_git_needs_command
  set cmd (commandline -opc)
  if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ]
    return 0
  end
  return 1
end

cmdとして設定されていることを理解していcommandline -opcます。しかし、次のステートメント(count $cmd) -eq 1 -a $cmd[1] = 'git'では、何-eq-a意味するのでしょうか?

私はfish shellを初めて使用し、プログラム用の独自の補完スクリプトを作成して構文を理解しようとしています。助けていただければ幸いです。

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

4

3 に答える 3

9

実際-eq、 and-aは fish 構文の一部ではありません。彼らは普通の議論です!

if [ (count $cmd) -eq 1 -a $cmd[1] = 'git' ]

ここの左角括弧は、実際には cat や grep などのコマンドです。あなたは本当にファイルを持っています/bin/[testコマンドを使用すると理解しやすいかもしれませんが、これは同じことです。

if test (count $cmd) -eq 1 -a $cmd[1] = 'git'

-eqこれで、と-aが に渡される普通の引数でtestあり、fish にとって構文上の意味がないことが簡単にわかります。

testawk や sed のような独自の小さな言語があります。man testそれについて学ぶために参照してください。

于 2015-05-26T01:04:12.677 に答える
2

-eq整数比較関数です。

論理 and-aです。

したがって、論理的に同等のものは次のようになります。

if [ (count $cmd) == 1 && $cmd[1] == 'git' ]

(Java 疑似構文)。

バックグラウンド

が使用される理由-eqは、シェルが通常テキスト処理のみで動作するためです。その結果、数値は「文字列」に格納されます。2 つの数値が等価であっても、文字列が等価でない場合があります。たとえば、次の例:

if [ "01" -eq "1" ]
then
    echo "integer equal"
fi
if [ "01" = "1" ]
then
    echo "string equal"
fi

のみ印刷しますinteger equal

于 2015-05-26T00:29:09.337 に答える
1

のドキュメントから:

  • NUM1 -eq NUM2 は、NUM1 と NUM2 が数値的に等しい場合に true を返します。
  • COND1 -a COND2 は、COND1 と COND2 の両方が true の場合に true を返します。

それはそれとそれをテストし(count $cmd) = 1ます$cmd[1] = 'git'
=ここでは、代入ではなく等価です)。

于 2015-05-26T00:29:57.623 に答える