了解函数中的参数

时间:2011-09-08 22:06:14

标签: bash syntax command

我发现了这个功能:

findsit()
{
    OPTIND=1
    local case=""
    local usage="findsit: find string in files.
Usage: fstr [-i] \"pattern\" [\"filename pattern\"] "
    while getopts :it opt
    do
        case "$opt" in
        i) case="-i " ;;
        *) echo "$usage"; return;;
        esac
    done
    shift $(( $OPTIND - 1 ))
    if [ "$#" -lt 1 ]; then
        echo "$usage"
        return;
    fi
    find . -type f -name "${2:-*}" -print0 | \
    xargs -0 egrep --color=always -sn ${case} "$1" 2>&- | more 
}

我理解输出及其作用,但有些术语我仍然不明白,并且发现很难找到参考,但相信它们对我的编程学习很有用。有人能快速解释一下吗?有些人没有手册页。

本地

getopts的

情况下

$#

$ {2: - *}

2 - ;&安培; -

谢谢。

2 个答案:

答案 0 :(得分:3)

  • 本地:本地变量。假设您的程序中有一个名为foo的变量。您调用的函数也具有变量foo。假设该函数更改了foo的值。

试试这个程序:

testme()
{
    foo="barfoo"
    echo "In function: $foo"
}

foo="bar"
echo "In program: $foo"
testme
echo "After function in program: $foo"

请注意,即使函数完成,函数也会更改$foo的值。通过声明local foo="barfoo"而非foo="barfoo",我们可以防止这种情况发生。

  • 案例:案例陈述是一种指定选项列表以及您希望如何处理这些选项的方法。它有点像if / then / else语句。

这两个或多或少是等同的:

if [[ "$foo" == "bar" ]]
then
   echo "He said 'bar'!"
elif [[ "$foo" == "foo" ]]
then
  echo "Don't repeat yourself!"
elif [[ "$foo" == "foobar" ]]
then
  echo "Shouldn't it be 'fubar'?"
else
   echo "You didn't put anything I understand"
fi

case $foo in
    bar)
        echo "He said 'bar'!"
        ;;
    foo)
        echo "Don't repeat yourself!"
        ;;
    foobar)
        echo "Shouldn't it be 'fubar'?"
        ;;
    *)
        echo "You didn't put anything I understand"
        ;;
esac

;;结束case选项。否则,它将下拉到下一个并执行这些行。我有三行中的每个选项,但它们通常合并为

foobar) echo "Shouldn't it be 'fubar'?";;
  • shift :命令行参数放在名为$*的变量中。当您说shift时,它会获取该$*变量中的第一个值,并将其删除。

  • getopts :Getopts是一个相当复杂的命令。它用于解析$@变量中的单个字母选项的值(包含命令行中的参数和参数)。通常,您在while循环中使用getopts并使用case语句来解析输出。格式为getopts <options> varvar是一次包含每个选项的变量。指定单个字母参数以及哪些参数需要参数。解释它的最佳方式是向您显示simple example

  • $#:命令行中的参数/参数数量。

  • $ {var:-alternative} :这表示使用环境变量$var的值。但是,如果未设置此环境变量或为null,请改为使用值alternative。在此程序中,使用$ {2: - *}代替。 $2表示由于shift命令导致所有内容移出后,命令行参数/参数中剩余内容的第二个参数。

  • 2&gt;&amp; - :这会将标准错误移至标准输出。标准错误是放置错误消息的位置。通常,它们就像标准输出一样放在终端屏幕上。但是,如果将输出重定向到文件中,错误消息仍会打印到终端窗口。在这种情况下,将输出重定向到文件也会重定向任何错误消息。

答案 1 :(得分:2)

那些是bash内置插件。您应该阅读bash手册页,或者对于getopts,请尝试帮助getopts

一次一个(在ipad上打字因此切换到笔记本电脑真的很烦人):

local允许您定义局部变量(在函数范围内)

getopts是一个bash内置函数,它实现了getopt样式的参数处理(-a-b ...类型参数)

case是switch语句的bash表单。语法是

case: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac

shift将所有参数移位1(使第二个参数成为第一个,第三个变为第二个,......)类似于perl shift。如果您指定一个参数,它将移动那么多索引(因此shift 2将分配$3 -> $1, $4 -> $2, ...

$#是传递给函数的参数数量

${2:-*}是默认参数形式。基本上,它会查看第二个参数($2是第二个参数),如果未分配,则会将其替换为*

2>&-是输出重定向(在本例中为标准错误)