Bash 快把我逼疯了。我不明白为什么以下内容(以及我从示例中复制和粘贴的数十种变体中的任何一个)无法工作:
#!/bin/bash
echo $#
function main {
if (( $# < 1 )); then
usage
fi
echo "good"
}
function usage {
echo "Usage: $0 <outputdir>"
exit 1
}
main
由于某种原因,参数检查每次都会失败,即使我传递了一个参数并且可以清楚地看到$#
它已按预期设置。
答案1
您正在调用main
不带参数的函数。所以$#
在main函数中始终为0。
每个函数实例都有自己的参数。 (“实例”是指如果函数被多次启动(通过递归调用),则每次调用都有自己的参数。)位置参数$1
,$2
等等,以及关联参数$#
,$*
并$@
指的是在函数调用。例如,如果您在函数main foo bar
内调用 then,则main
的值$1
将是foo
, 的值$#
将是 2 等等。
如果要将脚本的参数传递给函数,请使用"$@"
.此构造扩展为传递给脚本(或函数,如果在函数内部调用)的参数列表。请注意,与通常使用双引号发生的情况不同,参数是单独传递的,"$@"
是字符串列表而不是单个字符串。双引号是必需的,否则参数不会按原样传递,而是被视为以空格分隔的文件名模式列表。
function main {
if (( $# < 1 )); then
usage
fi
echo "good"
}
main "$@"
答案2
这应该有效:
#!/bin/bash
set -x
NARGS=$#
function main {
if [ $NARGS -lt 1 ]; then
usage
fi
echo good
}
function usage {
echo "Usage: $0 <outputdir>"
exit 1
}
main
我是set -x
故意离开那里的。调试这些错误很有用。如果您不向main
函数传递任何参数,则$#
函数内部将变为 0(在条件中替换$NARGS
为来查看这一点)。$#
if