krypted.com

Tiny Deathstars of Foulness

According to @johnkitzmiller, you can’t spell function without fun. So let’s have some fun! What’s a function? Think of it as a script inside a script. Define functions at the beginning of the script instead of making repeated calls to the same task within a script. The other nice thing about functions is that the act of compartmentalization makes them simple to insert into a number of different scripts. For example, if you do a lot of curl commands to pull down something in a lot of different scripts, having the grabbing of the data as a function, then the parsing of it into an array as a function and ultimately the writing of it or dealing with an stderr as another might make it simpler to then port it into the next script and the next. Functions are simple to define. Just use (yes, you guessed it) the function command. So let’s look at the most basic function. Here, we’ll wrap a simple echo line inside curly brackets. So the syntax is function followed by the name of the function, followed by a curly bracket to introduce it. Then, I like to put a curly bracket on a line at the end of the function. Then I have a line where I just call the function. Note, there’s no special indicator, like a $ in front of the name of it or anything like that (unless you maybe variabalized it): #!/bin/bash function hellokitzy { echo "Hello Kitzy" } hellokitzy OK, so when you call it, it says hellokitzy. Obviously it could have nested if/thens, whiles, cases, etc. Now, let’s have two functions. In this example, we’ll basically just split the single echo statement into two; then call them in separate lines: #!/bin/bash function hello { echo "Hello" } function kitzy { echo "Kitzy" } hello kitzy As with shell scripts, you can also push a positional parameter into the function. Here, we pass a positional parameter into the script and it echos a hello to that parameter. You know, making our scripts a bit more personal and all… Then we call the function twice. In the first instance, we just pass the same parameter, but in the second, we actually replace it. We do this to show that the function overwrites the $1 inside that function, but if we did another call to the function we’d just get the original $1 as it doesn’t persist outside of the function: #!/bin/bash function term { exit } function hello { echo "Hello" $1 } hello $1 hello all echo "bye" term When run with a parameter of Kitzy, the above would simply output:
Hello Kitzy Hello all bye
That’s just for positional parameters that you’re feeding into a script though. If you have a variable (let’s call it a) and you update it in a function, then it will be the updated variable after the function. So in the following example, a echos out as two in the end: #!/bin/bash a=1 function quit { a=2 exit } echo $a Overall, functions are easy to use and make your code more modular. The only things that get a little complicated is that unless you know functions, you aren’t sure what’s going on in the beginning and when you are editing variables throughout the script you wanna’ make sure you know what changed things and when. OK, now you – have fun with functions, and feel free to use the comments to post some you wrote!

February 28th, 2017

Posted In: Mac OS X, Mac OS X Server, Mac Security, Unix

Tags: , , , ,

  • Ben Goodstein

    Worth noting that you can put functions in your ~/.bashrc so that they’re executed at every login shell – useful because aliases can’t take arguments, but a function can. For instance I’ve got:

    hex() {

    python -c “print hex($1)”

    }

    in my .bashrc so I can convert decimals to hex like so:
    $ hex 1001
    0x3e9

    Note that there are two ways of declaring a function in bash, with and without the function keyword, with an explanation as to why here: http://stackoverflow.com/questions/7917018/what-is-the-function-keyword-used-in-some-bash-scripts (basically if you’re not stomping on an alias, omitting the function keyword is fine)

  • Dave Myers

    Pretty sure the last example is incorrect. Since the function ‘quit’ is never invoked, the output (and contents of ‘a’) should still be 1.

    If you did add a call to ‘quit’ before ‘echo $a’, you’d never actually return to execute the echo statement due to the exit command within ‘quit’.