我正在使用Fish shell .... 基本上,做这样的事情:
if (first argument == --r) {
do something
} else {
Do something
if (first argument == --n) {
do more
}
}
为了实现我尝试的第一个if语句:
if test (count $argv) -eq 1 -a $argv[1] = '--r'
但是这给了一个信息: test:缺少索引6处的参数
答案 0 :(得分:2)
Fish中的函数不需要在定义函数时指定其参数。用户发送给函数的任何参数都会自动存储在名为argv
的数组中。为了确定是否发送了参数,您可以计算数组中的元素数,或者将数组的长度确定为字符串。我做后者:
function my_func
if [ -z "$argv" ]; # No arguments
echo "No arguments supplied"
return
else # At least one argument
if [ "$argv[1]" = "--r" ];
echo "Excellent!"
return
end
end
end
如果您更喜欢使用count
,那么它看起来会更像这样:
function my_func
if [ (count $argv) -eq 1 -a "$argv[1]" = "--r" ];
# Exactly one argument with specified value "--r"
echo "Excellent!"
return
else # May have arguments, but none equal to "--r"
echo "Give me the right arguments"
return
end
end
您对set -q argv[1]
的使用也是一个不错的选择。但是,当您检查字符串相等性时,请不要忘记用引号括起变量,例如:test "$argv[1]" = "--r"
。
这是另一种方法,使用switch...case
条件测试:
function my_func
# No arguments
if [ -z "$argv" ]; and return
# At least one argument
switch $argv[1];
case --r;
# do some stuff
return
case "*";
# Any other arguments passed
return
end
end
end
答案 1 :(得分:0)
这对我有用:
if set -q argv[1] ;and test $argv[1] = "--r"
答案 2 :(得分:0)
让我们从执行此操作时出现的错误开始:
if test (count $argv) -eq 1 -a $argv[1] = '--r'
这是因为鱼首先展开$argv[1]
然后执行test
。如果argv没有值,则该语句变为
if test 0 -eq 1 -a = '--r'
test
命令的有效语法是什么。由于test
在评估之前解析整个表达式,因此第一个子表达式的计算结果为false并不重要。
而不是test (count $argv) -eq 1
只做set -q argv[1]
来测试argv是否至少有一个参数。请注意缺少美元符号。
如果您正在使用2.7.0或更高版本的鱼,我建议使用新的argparse
内置来处理参数。有鱼的几个标准函数使用它,因此您可以查看它们,以及man argparse
,以获取如何使用它的示例。使用argparse
几乎总是更安全,不太可能导致错误,因为使用手写鱼脚本进行粗略的参数解析,并且将提供与包括所有fish builtins在内的大多数命令相同的参数解析语义。包括正确处理短旗和长旗。
答案 3 :(得分:-1)
如果参数是可选的,那么你可以通过以下方式完成:
//check if variable exists
if (typeof variable === 'undefined'){
}
else{
if(typeof variable){}
}