有时我会为一项特定任务重复多次,但很可能永远不会再使用完全相同的形式。它包含我从目录列表中粘贴的文件名。在介于两者之间并创建一个bash脚本我想也许我可以在命令行创建一个单行函数,如:
numresults(){ ls "$1"/RealignerTargetCreator | wc -l }
我尝试过使用numresults=function...
之类的东西,比如使用eval,但是却没有发现正确的语法,到目前为止还没有在网上找到任何内容。 (所有内容都只是关于bash函数的教程)。
答案 0 :(得分:18)
在Ask Ubuntu上提出类似问题的引用my answer:
bash
中的函数基本上被命名为复合命令(或代码 块)。来自man bash
:Compound Commands A compound command is one of the following: ... { list; } list is simply executed in the current shell environment. list must be terminated with a newline or semicolon. This is known as a group command. ... Shell Function Definitions A shell function is an object that is called like a simple command and executes a compound command with a new set of positional parameters. ... [C]ommand is usually a list of commands between { and }, but may be any command listed under Compound Commands above.
没有给出任何理由,它只是语法。
在wc -l
之后使用分号:
numresults(){ ls "$1"/RealignerTargetCreator | wc -l; }
答案 1 :(得分:4)
不要使用ls | wc -l
,因为如果文件名中包含换行符,可能会给您错误的结果。您可以改为使用此功能:
numresults() { find "$1" -mindepth 1 -printf '.' | wc -c; }
答案 2 :(得分:2)
您还可以计算没有find
的文件。使用数组
numresults () { local files=( "$1"/* ); echo "${#files[@]}"; }
或使用位置参数
numresults () { set -- "$1"/*; echo "$#"; }
要匹配隐藏文件,
numresults () { local files=( "$1"/* "$1"/.* ); echo $(("${#files[@]}" - 2)); }
numresults () { set -- "$1"/* "$1"/.*; echo $(("$#" - 2)); }
(从结果中减去2会补偿.
和..
。)
答案 3 :(得分:0)
您可以获得
bash: syntax error near unexpected token `('
如果您已经有一个alias
与您要定义的函数同名的错误。
答案 4 :(得分:-2)
最简单的方法可能是回应你想要回来的东西。
function myfunc()
{
local myresult='some value'
echo "$myresult"
}
result=$(myfunc) # or result=`myfunc`
echo $result
无论如何here你可以找到一个更好的方法来实现更高级的目的