0

我对 shell 编程很陌生,我正在尝试编写一个 shell 脚本来将 grep 或 awk 模式过滤输出分配给 bash shell 中的命令行参数。

    a.sh
    source ./b.sh
    called a function like // a(function name) parameter1 parameter2

    b.sh
    function a{
    $2=grep -ai "some string" a.txt(parameter 1)
    echo "$2"
     }

我想做,但它不会让我这样做。

这甚至可能吗?

4

4 回答 4

0

您不能分配给位置参数,但您可以执行以下操作:

function myf {
   #do something with $1,$2, etc
}

FOO=$(awk command)
BAR=$(other command)

myf $FOO $BAR  #the function will use $FOO and $BAR as $1 and $2 positional parameters

因此,在这种情况下,您可以通过myf使用变量 (FOO和)将这些命令的内容传递给函数。BAR你甚至可以在没有虚拟变量调用的情况下做到这一点,myf $(some command)但我编写它的方式提高了可读性。

于 2013-06-05T14:21:53.710 回答
0

在 bash 中,您不能以调用者可以读取该值的方式设置位置参数。如果要从函数中“返回”字符串,则必须将其写入标准输出,如下所示:

function myfunc()
{
    echo "test"
}

VAR=$(myfunc)

当上面的代码运行时,VAR将包含字符串'test'。

于 2013-06-05T14:18:28.900 回答
0

有关参考问题,请查看man页面;例如,man bashman grep。对于内部 shell 命令,例如,function有一个bash具有类似功能的内置命令help,例如help function

要设置位置参数,您可以使用内置的set. 例如,set -- "a b" "c d"设置$1a b$2to c d

有关bash编程的实用介绍,请参阅Bash wiki。这简直是​​最好的 Bash 资源。

于 2013-06-05T14:20:03.737 回答
0

在尝试功能之前,请先尝试脚本。

#!/bin/sh
arg1=${1?'Missing argument'}
grep -ai "some string"  $arg1

然后将此脚本放在您的 ~/bin 文件夹中(确保您已更改 PATH 目录以包含 ~/bin

然后只需执行脚本。如果你真的需要一个功能,那么做

#!/bin/sh
b() {
    grep -ai "some string" $1
}

b filename
于 2013-06-05T14:58:40.460 回答