我是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"
}
我想做,但它不会让我这样做。
这甚至可能吗?
答案 0 :(得分:0)
在bash中,您无法以调用者可以读取该值的方式设置位置参数。如果要从函数中“返回”一个字符串,则必须将其写入stdout,如下所示:
function myfunc()
{
echo "test"
}
VAR=$(myfunc)
运行上述代码时,VAR
将包含字符串'test'。
答案 1 :(得分:0)
有关参考问题,请查看man
页面;例如,man bash
,man grep
等。对于像function
这样的内部shell命令,内置bash
具有类似功能的help
,例如help function
,例如set
1}}。
要设置位置参数,您可以使用内置set -- "a b" "c d"
。例如,$1
将a b
设置为$2
,将c d
设置为bash
。
有关{{1}}编程的实用介绍,请参阅Bash wiki。它只是那里最好的Bash资源。
答案 2 :(得分: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)
的虚拟变量的情况下执行此操作,但我编写它的方式可以提高可读性。
答案 3 :(得分: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