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-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 没有语法意义。

test有自己的小语言,如 awk 或 sed。请参阅man test以了解它。

于 2015-05-26T01:04:12.677 回答
2

-eq一个整数比较函数

-a一个逻辑和

所以逻辑等价物是这样的:

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

(在 Java 伪语法中)。

背景

使用的原因-eq是因为 shell 通常只处理文本。结果数字存储在“字符串”中。有时两个数字是等价的,但不是字符串等价的。例如下面的例子:

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 都为真,则返回真。

它测试那个(count $cmd) = 1和那个$cmd[1] = 'git'
=这里是平等,而不是分配)。

于 2015-05-26T00:29:57.623 回答