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)
鱼甚至有布尔?我怀疑不是.但它有false和true命令,我可以man.无论如何,我可能不需要布尔值.我想做的就是拥有一个全局变量,当设置时,这意味着我在fish和vim中使用了浅色配色方案.如果它没有设置我正在使用黑暗的那个.必须有一个更简单的方法,我想要的东西像:
set -U LIGHT_COLORSCHEME (not $LIGHT_COLORSCHEME)
Run Code Online (Sandbox Code Playgroud)
鱼甚至有布尔?
不,实际上它根本没有类型,比如受到启发的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.