if语句

时间:2015-05-26 00:23:26

标签: git shell tab-completion fish completion

我正在阅读鱼壳的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的新手,我试图通过尝试为程序编写自己的完成脚本来理解语法。非常感谢帮助。

谢谢。

3 个答案:

答案 0 :(得分:6)

实际上-eq-a不是鱼语法的一部分。他们是普通的论点!

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的普通参数,对鱼没有任何句法意义。

test有自己的小语言,如awk或sed。请参阅man test了解相关信息。

答案 1 :(得分:2)

-eqinteger comparison function

-alogical and

因此,逻辑等价物将是:

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

答案 2 :(得分:1)

来自Fish documentation

  
      
  • 如果NUM1和NUM2在数值上相等,则NUM1 -eq NUM2返回true。
  •   
  • COND1 -a COND2如果COND1和COND2都为真,则返回true。
  •   

它会测试(count $cmd) = 1$cmd[1] = 'git'  (=这里是平等,而不是任务。)