鱼壳:翻转一个布尔值

1 fish

我疯了吗?我想翻转一个布尔变量.我想出了这个:

function toggle_light_colorscheme
  if eval $LIGHT_COLORSCHEME
    set -U LIGHT_COLORSCHEME false
  else
    set -U LIGHT_COLORSCHEME true
  end
end
Run Code Online (Sandbox Code Playgroud)

鱼甚至有布尔?我怀疑不是.但它有falsetrue命令,我可以man.无论如何,我可能不需要布尔值.我想做的就是拥有一个全局变量,当设置时,这意味着我在fish和vim中使用了浅色配色方案.如果它没有设置我正在使用黑暗的那个.必须有一个更简单的方法,我想要的东西像:

set -U LIGHT_COLORSCHEME (not $LIGHT_COLORSCHEME)
Run Code Online (Sandbox Code Playgroud)

fah*_*aho 6

鱼甚至有布尔?

不,实际上它根本没有类型,比如受到启发的POSIX shell.每个变量都是一个字符串列表.

但它有错误和真实的命令

是.这些命令分别返回1和0.任何返回状态!= 0都被认为是错误代码,因此为假,0为真(在这方面它是C的倒数).

我想做的就是拥有一个全局变量,当设置时,这意味着我在fish和vim中使用了浅色配色方案.如果它没有设置我正在使用黑暗的那个.

当然,这可以成功.有几种不同的方法可以解决这个问题.要么你使用变量一个元素表示它是真的事实,或者你使用它是例如1.

前者会起作用

# Check if variable is "true" by checking if it has an element
if set -q LIGHT_COLORSCHEME[1]
# ...
# Flip the variable
set -q LIGHT_COLORSCHEME[1]; and set -e LIGHT_COLORSCHEME[1]; or set LIGHT_COLORSCHEME 1
Run Code Online (Sandbox Code Playgroud)

(当然你也可以做一个"翻转"功能 - 不幸的是"not"是一个操作命令返回状态的关键字,而不是变量值)

后者看起来像

if test "$LIGHT_COLORSCHEME" = 1 # the "=" here tests string-equality, but that shouldn't matter.
# ...
# Flip the variable
test "$LIGHT_COLORSCHEME" = 1; and set LIGHT_COLORSCHEME 0; or set LIGHT_COLORSCHEME 1
Run Code Online (Sandbox Code Playgroud)

我想出了这个:

函数toggle_light_colorscheme如果eval $ LIGHT_COLORSCHEME

你误解了什么eval.它将参数作为代码运行.即它会尝试将LIGHT_COLORSCHEME的值作为命令执行.所以,如果你在$ PATH中的某个地方有一个名为"1"的命令,它就会运行它!

要测试条件,请使用test.

  • 一个聪明的技巧是使用`test`及其退出值:`["$ LIGHT_COLORSCHEME"-eq 1]; 设置LIGHT_COLORSCHEME $ status;`当boolean为1时,(bool == 1)为"true"(零),当为0时为false. (2认同)