在unix / linux命令行中定义函数(例如BASH)

时间:2016-02-17 19:24:21

标签: linux bash shell unix

有时我会为一项特定任务重复多次,但很可能永远不会再使用完全相同的形式。它包含我从目录列表中粘贴的文件名。在介于两者之间并创建一个bash脚本我想也许我可以在命令行创建一个单行函数,如:

numresults(){ ls "$1"/RealignerTargetCreator | wc -l }

我尝试过使用numresults=function...之类的东西,比如使用eval,但是却没有发现正确的语法,到目前为止还没有在网上找到任何内容。 (所有内容都只是关于bash函数的教程)。

5 个答案:

答案 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你可以找到一个更好的方法来实现更高级的目的