Fish shell: 检查是否为函数提供了参数
Fish shell: Check if argument is provided for function
我正在创建一个函数(如下所示),您可以使用它提供一个参数,一个目录。我测试 $argv
是否是带有 -d
选项的目录,但这似乎不起作用,即使没有提供参数,它也总是 return true。我也试过 test -n $argv -a -d $argv
测试是 $argv
是空刺,但是 returns test: Missing argument at index 1
错误。我应该如何测试函数是否提供了任何参数?为什么 test -d $argv
不起作用,根据我的理解,当没有提供参数时它应该是 false,因为空字符串不是目录。
function fcd
if test -d $argv
open $argv
else
open $PWD
end
end
感谢您的帮助。
$argv
是一个 list,所以你要查看第一个元素,如果该列表中有元素:
if begin; test (count $argv) -gt 0; and test -d $argv[1]; end
open $argv[1]
else
open $PWD
end
count
是正确的方法。对于检查是否有任何参数的常见情况,您可以使用其退出状态:
function fcd
if count $argv > /dev/null
open $argv
else
open $PWD
end
end
回答你的第二个问题,如果 $argv
为空,test -d $argv
returns 为真,因为 POSIX 要求当 test
传递一个参数时,它必须 "Exit true (0) if is not null; otherwise, exit false"。所以当 $argv 为空时,test -d $argv
意味着 test -d
必须退出 true 因为 -d
不为空!啊!
编辑 添加了一个遗漏的 end
,感谢 Ismail 的关注
至少在 fish 2.1+ 中,您可以命名您的参数,然后允许可以说是更多的语义代码:
function fcd --argument-names 'filename'
if test -n "$filename"
open $filename
else
open $PWD
end
end
可能不相关,但我想为这个问题添加另一个角度。
我想将洞察力扩大到更广泛的范围,即使用 fisherman 组开发的库测试 shell 代码的范围。
使用 mock 您可以检查打开命令是否安全无副作用地调用。
示例:
function fcd
if count $argv > /dev/null
open $argv
else
open $PWD
end
end
mock open 0 "echo $args"
fcd "cool" # echoes cool
mock open 0 "echo $args"
fcd # echoes $PWD
是最近的图书馆,但它可以帮助测试可能有危险的东西,例如 rm
mock rm 0 "echo nothing would happen on $args"
rm "some file" # simply echoes the message with a list of the files that would been affected
希望能给出更开箱即用的观点
P.S.: 很抱歉公然宣传,但我认为这是一个很酷的想法,很高兴被 shell 脚本编写者采纳,以测试和增加 [=32] 的可持续性=] 脚本是疯了。 :P
编辑:我最近注意到有关我发布的示例的错误。请不要使用 rm *,因为星号不被视为参数,fish shell 将星号扩展到找到的文件列表并且该命令仅模拟第一个调用,这意味着第一个文件将被忽略通过模拟,但所有后续文件都将被 擦除 因此,如果尝试示例并使用单个文件而不是通配符,请小心。
if not set -q argv[1]
echo 'none'
else
echo 'yes'
end
来自 man set
页面:
set ( -q | --query ) [SCOPE_OPTIONS] VARIABLE_NAMES...
o -q 或 --query 测试指定的变量名称是否已定义。不输出任何东西,但内置退出状态是指定的变量数
未定义。
我正在创建一个函数(如下所示),您可以使用它提供一个参数,一个目录。我测试 $argv
是否是带有 -d
选项的目录,但这似乎不起作用,即使没有提供参数,它也总是 return true。我也试过 test -n $argv -a -d $argv
测试是 $argv
是空刺,但是 returns test: Missing argument at index 1
错误。我应该如何测试函数是否提供了任何参数?为什么 test -d $argv
不起作用,根据我的理解,当没有提供参数时它应该是 false,因为空字符串不是目录。
function fcd
if test -d $argv
open $argv
else
open $PWD
end
end
感谢您的帮助。
$argv
是一个 list,所以你要查看第一个元素,如果该列表中有元素:
if begin; test (count $argv) -gt 0; and test -d $argv[1]; end
open $argv[1]
else
open $PWD
end
count
是正确的方法。对于检查是否有任何参数的常见情况,您可以使用其退出状态:
function fcd
if count $argv > /dev/null
open $argv
else
open $PWD
end
end
回答你的第二个问题,如果 $argv
为空,test -d $argv
returns 为真,因为 POSIX 要求当 test
传递一个参数时,它必须 "Exit true (0) if is not null; otherwise, exit false"。所以当 $argv 为空时,test -d $argv
意味着 test -d
必须退出 true 因为 -d
不为空!啊!
编辑 添加了一个遗漏的 end
,感谢 Ismail 的关注
至少在 fish 2.1+ 中,您可以命名您的参数,然后允许可以说是更多的语义代码:
function fcd --argument-names 'filename'
if test -n "$filename"
open $filename
else
open $PWD
end
end
可能不相关,但我想为这个问题添加另一个角度。
我想将洞察力扩大到更广泛的范围,即使用 fisherman 组开发的库测试 shell 代码的范围。
使用 mock 您可以检查打开命令是否安全无副作用地调用。
示例:
function fcd
if count $argv > /dev/null
open $argv
else
open $PWD
end
end
mock open 0 "echo $args"
fcd "cool" # echoes cool
mock open 0 "echo $args"
fcd # echoes $PWD
是最近的图书馆,但它可以帮助测试可能有危险的东西,例如 rm
mock rm 0 "echo nothing would happen on $args"
rm "some file" # simply echoes the message with a list of the files that would been affected
希望能给出更开箱即用的观点
P.S.: 很抱歉公然宣传,但我认为这是一个很酷的想法,很高兴被 shell 脚本编写者采纳,以测试和增加 [=32] 的可持续性=] 脚本是疯了。 :P
编辑:我最近注意到有关我发布的示例的错误。请不要使用 rm *,因为星号不被视为参数,fish shell 将星号扩展到找到的文件列表并且该命令仅模拟第一个调用,这意味着第一个文件将被忽略通过模拟,但所有后续文件都将被 擦除 因此,如果尝试示例并使用单个文件而不是通配符,请小心。
if not set -q argv[1]
echo 'none'
else
echo 'yes'
end
来自 man set
页面:
set ( -q | --query ) [SCOPE_OPTIONS] VARIABLE_NAMES...
o -q 或 --query 测试指定的变量名称是否已定义。不输出任何东西,但内置退出状态是指定的变量数 未定义。