为什么计算" arg1 $ @"因为bash函数参数较少?

时间:2017-07-21 06:24:57

标签: bash command-line-arguments

我写了一个bash脚本countArgs.sh如下:

#!/bin/bash
function count
{
    echo $#
}
count "arg1 $@"

我希望脚本的输出应该是它的输入数加1,而结果是这样的:

./countArgs.sh a b c
3

2 个答案:

答案 0 :(得分:0)

你得到了计数3,因为你在这里用双引号括起来的参数列表:

count "arg1 $@"

由于这个count函数只获得这3个参数(在每个单独的行中):

arg1 a
b
c

如果您在printf函数中放置count行,则可以获得相同的输出:

count() {
    printf "%s\n" "$@"
    echo $#
}

请注意第一个位置参数是arg1 a而不是arg1

如果您移除arg1 $@周围的引号并将其命名为:

count arg1 "$@"

然后你会得到4作为输出。

答案 1 :(得分:0)

两点:

首先,你在函数内部回显,这意味着$#会给你数字或参数或你的函数,而不是你的脚本。

其次,您在引号$@之间调用带参数"的函数,但$@默认情况下已经执行此操作,因此在变量扩展之后实际上它将如下所示:< / p>

count "arg1 a" "b" "c"

使用bash -x运行脚本,您将看到它是如何工作的:

#!/bin/bash -x
function count
{
    echo $#
}
count "arg1 $@"