我正在阅读鱼壳的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的新手,我试图通过尝试为程序编写自己的完成脚本来理解语法。非常感谢帮助。
谢谢。
答案 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)
-eq
是integer comparison function。
-a
是logical 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)
- 如果NUM1和NUM2在数值上相等,则NUM1 -eq NUM2返回true。
- COND1 -a COND2如果COND1和COND2都为真,则返回true。
它会测试(count $cmd) = 1
和$cmd[1] = 'git'
(=
这里是平等,而不是任务。)