Define function in unix/linux command line (e.g. BASH)

后端 未结 5 1290
时光说笑
时光说笑 2021-01-04 00:21

Sometimes I have a one-liner that I am repeating many times for a particular task, but will likely never use again in the exact same form. It includes a file name that I am

相关标签:
5条回答
  • 2021-01-04 00:52

    The easiest way maybe is echoing what you want to get back.

    function myfunc()
    {
        local  myresult='some value'
        echo "$myresult"
    }
    
    result=$(myfunc)   # or result=`myfunc`
    echo $result
    

    Anyway here you can find a good how-to for more advanced purposes

    0 讨论(0)
  • 2021-01-04 00:53

    You can get a

    bash: syntax error near unexpected token `('
    

    error if you already have an alias with the same name as the function you're trying to define.

    0 讨论(0)
  • 2021-01-04 01:00

    Quoting my answer for a similar question on Ask Ubuntu:

    Functions in bash are essentially named compound commands (or code blocks). From 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.
    

    There's no reason given, it's just the syntax.

    Try with a semicolon after wc -l:

    numresults(){ ls "$1"/RealignerTargetCreator | wc -l; }
    
    0 讨论(0)
  • 2021-01-04 01:04

    You can also count files without find. Using arrays,

    numresults () { local files=( "$1"/* ); echo "${#files[@]}"; }
    

    or using positional parameters

    numresults () { set -- "$1"/*; echo "$#"; }
    

    To match hidden files as well,

    numresults () { local files=( "$1"/* "$1"/.* ); echo $(("${#files[@]}" - 2)); }
    numresults () { set -- "$1"/* "$1"/.*; echo $(("$#" - 2)); }
    

    (Subtracting 2 from the result compensates for . and ...)

    0 讨论(0)
  • 2021-01-04 01:09

    Don't use ls | wc -l as it may give you wrong results if file names have newlines in it. You can use this function instead:

    numresults() { find "$1" -mindepth 1 -printf '.' | wc -c; }
    
    0 讨论(0)
提交回复
热议问题