为什么我的函数中 $# 总是 0?

为什么我的函数中 $# 总是 0?

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

相关内容