bash return associative array from function

Bash associative array tutorial; Bash check if file begins with a string; Bash shell - check if file or directory exists; Can global variables be modified in bash function? Method 1: In this method, traverse the entire associative array using foreach loop and display the key elements. BASH, writing array to nl_012_\n delim string, bash and function to detect duplicate data, Print echo and return value in bash function, Bash block and return codes — need explanation, Display inputs that are redirected from file, Roots given by Solve are not satisfied by the equation, Quantum harmonic oscillator, zero-point energy, and the quantum number n, Counting monomials in product polynomials: Part I, Will RAMPS able to control 4 stepper motors, Ceramic resonator changes and maintains frequency when touched, Draw horizontal line vertically centralized. Being that case, why not directly look at those variables themselves? Associative arrays (sometimes known as a "hash" or "dict") use arbitrary nonempty strings as keys. If you want to pass one or more arguments AND an array, I propose this change to the script of @A.B. A simple address database Bash call function as array element 0 I'm in the process of designing a bash script to execute a number of functions in a sequence (installing packages, cloning repos, for instance) and after completion send a summary report to an email address to whether the installations succeeded or failed. List Assignment. In BASH script it is possible to create type types of array, an indexed array or associative array. Code: $ cat function_return_array #!/bin/bash function myarray () { a [1]=moja a [3]=three } a [1]=one a [2]=two myarray echo $ {a [1]} echo $ {a [2]} echo $ {a [3]} $ ./function_return_array moja two three $. declare-A CONFIG load-config CONFIG echo ${CONFIG ["SOMETHING"]} Function Declaration. What should I be looking for? Requirement: Function to find a string in an array. Global variable can be used to return value from a bash function. What is the term for diagonal bars which are making rectangular frame more rigid? They can return a status (the same as other programs). Bash Return Multiple Values from a Function using an Associative Array. Is there any way to make a nonlethal railgun? In BASH, local variable scope is the current function and every child function called from it, this translates to the fact that takes_ary_as_arg() function "sees" those descTable[@] and optsTable[@] arrays, thus it is working (see above explanation). Copying associative arrays is not directly possible in bash. Since bash does not discriminate string from a number, an array can contain a mix of strings and numbers. Bash Arrays | Associative Array Patterns; Bash Functions | Function Patterns; Invocation. Is there in bash an array_combine function, where I can create an associative array from two? I'm trying to replicate this function I've written in Python that prints a message based on the player and opponents move and compares those moves with an associative array called match. First declare an associative array named mx, then execute dig and used sed to convert the output into associative array assignments, then eval that into the current shell. Array Assignments. This makes it so there can be two types of arrays, numerically indexed and hash indexed (called associative arrays in bash parlance). You can only use the declare built-in command with the uppercase “-A” option. I also want to emphasize Dennis Williamson comment above: sparse arrays (arrays without all the keys defines - with "holes" in them) will not work as expected - we would loose the keys and "condense" the array. Use array at your leisure. To learn more, see our tips on writing great answers. Bash Associative Array (dictionaries, hash table, or key/value pair) You cannot create an associative array on the fly in Bash. $ hello 1 2 I got arg1: 1 and arg2: 2 $ hello 3 4 I got arg1: 3 and arg2: 4 $ hello 3 blah bash: printf: blah: invalid number I got arg1: 3 and arg2: 0 You can read more about arrays and functions within Bash here to get a better understanding of the technologies. Some are satisfied with converting a list to a string and calling it a day, but if you truly want to deal with an official bash array, the here sting above will do that for you. They decided that ${array} was just short hand for ${array[0]}, which was a bad mistake. This becomes complicated when there are other positional/getopts parameters. Unix & Linux: bash silently does function return on (re-)declare of global associative read-only arrayHelpful? You just need to add two lines for each function addition, so I'd call that easily modified. If someone knows a better way, feel free to add it here. You can pass multiple arrays as arguments using something like this: arrays - script - bash pass associative array to function, Getting the source directory of a Bash script from within, How to check if a string contains a substring in Bash. typedef bit bitstream_t[$]; function bitstream_t my_funct(input bitstream_t arg); Dave Rich - Alas, we have been let down by an otherwise superlative bash development team. #!/bin/bash # # Associative arrays in bash, take 2 # Using two arrays # Some test values with doublettes values="a a a a b b c d"; # Search for existing keys function getkey {key=$1 rev 2021.1.8.38287, The best answers are voted up and rise to the top, Super User works best with JavaScript enabled, Start here for a quick overview of the site, Detailed answers to any questions you might have, Discuss the workings and policies of this site, Learn more about Stack Overflow the company, Learn more about hiring developers or posting ads with us. If you have come to the point of wanting to return an array from a function, then you are probably aware that you can only return status codes. echo ${aa[hello]} # Out: world Listing associative array keys. and the only answer was: I just want to return array that containing weeks 1,2,3. I am trying to assign indexes to an associative array in a for loop but I have to use an eval command to make it work, this doesn't seem correct I don't have to do this with regular arrays For example, the following assignment fails without the eval command: #! Save the following code to a file (say script1.sh) and run it. associative arrays. Example-2: Using Function Command You can receive the return value of a bash function and store it in a variable at the time of calling. So, if you want to return something, you should use global variables that are updated inside your function. With a few tricks you can actually pass named parameters to functions, along with arrays. It allows for only one array being passed, and it being the last element of the parameter list. This article will cover some ways you can return values from bash functions: Return value using global variable. Let's say we wanted to add new users with a function we made called addAccounts that loops over username arguments. This is passing, in essence, nothing by value - as usual. What usually happens? What you appear to be attempting to do is "return an associative array from a function to the caller". Test it on your input. : It is worth mentioning that array initialization using this bracket form initializes the new array according to the IFS or Internal Field Separator which is by default tab, newline and space. But because they didn't do this right, the assignment operator = doesn't work for arrays, and arrays can't be passed by value to functions or to subshells or output in general (echo ${array}) without code to chew through it all. Capture the echoed string with command substitution (see above). This trick won't always work (When you have values with whitespaces, or you want to return values that depend on input values), but it usually does the work: Thanks for contributing an answer to Super User! Here is sample code to demonstrate it. First by using for loop and secondly by using foreach. In these cases, I've had to first determine and then remove the parameters not associated with the array using some combination of shift and array element removal. Example 37-5. After some bash self study and experimenting, I am stuck with returning an array from a function, and for the life of me can't see my error. If you're interested in more tricks like this that make developing with bash much nicer and easier, you can take a look at my Bash Infinity Framework, the code below was developed for that purpose. When a bash function ends its return value is its status: zero for success, non-zero for failure. How to concatenate string variables in Bash. :-). :-) There are probably more things you can do, but let's stop here. Bash Array – An array is a collection of elements. The code that makes this work is pretty light and works both in bash 3 and bash 4 (these are the only versions I've tested it with). Regular arrays should be used when the data is organized numerically, for example, a set of successive iterations. Bash Arrays | Associative Array Patterns; Bash Functions | Function Patterns; Invocation. If you are familiar with Perl, C, or Java, you might think that Bash would use commas to separate array elements, however this is not the case; instead, Bash uses spaces: function return values. That output can be captured in two different ways. An array in BASH is like an array in any other programming language. How do I tell if a regular file does not exist in Bash? Boo! To return values, you can set a global variable with the result, or use command substitution, or you can pass in the name of a variable to use as the result variable. declare-A CONFIG load-config CONFIG echo ${CONFIG ["SOMETHING"]} Function Declaration. Just to add to the accepted answer, as I found it doesn't work well if the array contents are someting like: In this case, each member of the array gets split, so the array the function sees is equivalent to: To get this case to work, the way I found is to pass the variable name to the function, then use eval: The basic problem here is that the bash developer(s) that designed/implemented arrays really screwed the pooch. Traversing the Associative Array: We can traverse associative arrays using loops. The method I developed allows you to access parameters passed to a function like this: In other words, not only you can call your parameters by their names (which makes up for a more readable core), you can actually pass arrays (and references to variables - this feature works only in bash 4.3 though)! The equivalent of the f es function above could be done with: Unix & Linux: bash silently does function return on (re-)declare of global associative read-only arrayHelpful? Syntax Looking for title/author of fantasy book where the Sun is hidden by pollution and it is always winter. It is just like writing there: See above explanation, which just copies descTable[@] array's values according to the current IFS. echo "${!aa[@]}" #Out: hello ab key with space Listing associative array values 0,1 doesn't mean anything special in associative arrays, that's just the string 0,1. Bash's functions aren't really *functions* in the mathematical sense, or even in the sense of most high-level computing languages. Associative array as return value. By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy. is not used it's previous indirect/double evaluation, but rather in array context it returns the array indices (keys). Find memcache request hit rate on linux command line; How to return a value from bash function; Iterate over specific file … Let us say we think option #1 above sounds promising. Something like this ... Reference: Your UNIX: The Ultimate Guide, 2nd Edition, p. 387 (last para). As such, to pass an array to a function, there is really only one option, and that is to use the nameref feature: Since this is passing by reference, you can also assign to the array in the function. In other words, associative arrays allow you to look up a value from a table based upon its corresponding string label. How to return a string from a bash function that contains a filename with spaces? It allows for only one array being passed, and it being the last element of the parameter list. User-definable commands. We can loop through the associative array in two ways. last line of code, You should do a minimal search in google, because this was the first link returned for "bash return array". Find memcache request hit rate on linux command line; How to return a value from bash function; Iterate … In short, what this should/must do is by using a function Bash Return Multiple Values from a Function using an Associative Array. Making statements based on opinion; back them up with references or personal experience. Associative arrays can be used when the data is organized by a string, for example, host names. Why is "I can't get any satisfaction" a double-negative too, according to Steven Pinker? If that is true, then you can save something you send to stdout in another context. In bash, functions don't return values. If I call doSomething, it might, say, send a string message to stdout. I'm trying to replicate this function I've written in Python that prints a message based on the player and opponents move and compares those moves with an associative array called match. Tag: arrays,linux,bash,samba. r/bash: A subreddit dedicated to bash scripting. Copying associative arrays is not directly possible in bash. There is another solution which I used to pass variables to functions. However a function can modify an array held in the calling script. Note: This is the somewhat crude solution I posted myself, after not finding an answer here on . Assuming stdout is set to the terminal, at least you can see the contents of a variable or something. Note: After not finding an answer here on Stack Overflow, I posted my somewhat crude solution myself. This would take more time, though. Note: declare cannot be put in a function. I've declared match in my main function and I need to use this in another function which looks like this: we can use an eval for the keys, for example: and then a loop using them to create a copy. Bash's functions aren't really *functions* in the mathematical sense, or even in the sense of most high-level computing languages. A purist perspective likely views this approach as a violation of the language, but pragmatically speaking, this approach has saved me a whole lot of grief. This solution does not pass an array from a function, but it does allow you to convert the output of a function to an array. Any third year CS major should know that. site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. Especially when you consider that ${array[0]} has no meaning and evaluates to the empty string if the array type is associative. There is another solution which I used to pass variables to functions. As ugly as it is, here is a workaround that works as long as you aren't passing an array explicitly, but a variable corresponding to an array: I'm sure someone can come up with a clearner implementation of the idea, but I've found this to be a better solution than passing an array as "{array[@]"} and then accessing it internally using array_inside=("$@"). They are really commands. Internal. In the following example, a local variable, retval is used and the value of the local variable is return by the function F2 is assigned in a global variable, getval which is printed later. assign the function's return array to array clients, while the function executes, add values DIRECTLY to the clients array. listToString may not work with all lines of input. Sanitizing the string representation of the array … This is a slight simplification of DevSolar's solution in that it uses the arguments passed rather than copying them. Actually, it is not passing the array at all, but a list of its elements, which are re-assembled into an array by called_function(), but it worked for me. For bash, that can be scalar, sparse arrays (associative arrays with keys restricted to positive integers) or associative arrays with non-empty keys (neither key nor values can contain NUL characters). Note: here ! I have seen this amongst many others, but this does not make sense to me. I've declared match in my main function and I need to use this in another function which looks like this: The order of march would be. To subscribe to this RSS feed, copy and paste this URL into your RSS reader. I asked several times "What does your function do?" Example: Here array_keys() function is used to find indices names given to them and count() function is used to count number of indices in associative arrays. Global variable can be used to return value from a bash function. An associative array can be thought of as a set of two linked arrays -- one holding the data, and the other the keys that index the individual elements of the data array. An array is a variable that can hold multiple values, where each value has a reference index known as a key. Annihilannic. In that case, this code would work exactly as you might expect it to: Then, passing arrays by value to functions and assigning one array to another would work as the rest of the shell syntax dictates. References. Internal. This article will cover some ways you can return values from bash functions: Return value using global variable. You could use the same technique for copying associative arrays: See the example showing how to return arrays from functions below. Passing arrays as parameters in bash (8) . When a microwave oven stops, why are unpopped kernels very hot and popped kernels not hot? I've read you can echo a value from a function to stand in as a return, but this doesn't work well with associative arrays since it doesn't return a single value that way. You can also initialize an entire associative array in a single statement: aa=([hello]=world [ab]=cd ["key with space"]="hello world") Access an associative array element. See also zsh with normal arrays and associative arrays without those restrictions. Some are satisfied with converting a list to a string and calling it a day, but if you truly want to deal with an official bash array, the here sting above will do that for you. The best solution probably is, as already been pointed out, to iterate through the array and copy it step by step. Advanced Bash-Scripting Guide: Chapter 27. The += operator allows you to append one or multiple key/value to an associative Bash array. It should evaluate to the inverse of the assignment statement. Welcome to the fourth part of the Bash Bonanza series! For more serious scripts, consider as mentioned, putting the keys in its own array, and search it while looking up values. Returning a variable from functions in bash script can be little tricky. What you appear to be attempting to do is "return an associative array from a function to the caller". Yes, the array being referenced has to have a global scope, but that shouldn't be too big a deal, considering that this is shell scripting. Bash functions are not similar to functions in other languages but these are commands. update: ok that makes sense, I haven;t come across a post mentioning this, thanks. So here is a function that returns an array containing 1,2,3 For anyone wanting to see how I resolved this: To display a single index position of an array, ref. It is possible to return an array from a function in bash. Convert a list to a string. Easily stored by outputting to a file, and easily loaded from a file into a script. It only takes a minute to sign up. Any use of declare inside a bash function turns the variable it creates local to the scope of that function, meaning we can't access or modify global arrays with it. Stack Exchange network consists of 176 Q&A communities including Stack Overflow, the largest, most trusted online community for developers to learn, share their knowledge, and build their careers. You say. That being said, I do see the value for generalization, functions thus can get the arrays (or copies) without knowing the names: for real copies: In associative array, the key-value pairs are associated with => symbol. The examples below describe these different mechanisms. Yes you can, but you must use a typedef to define the return type. In the previous entry, we discussed how to use functions in Bash, and finished off with a spooky warning about arrays, and how they will not work with the techniques discussed so far.. Today we will explore that further. To pass an associative or sparse indexed array by value to a function requires throwing all the indexes and the values onto the argument list (not too useful if it's a large array) as single strings like this: and then writing a bunch of code inside the function to reassemble the array. On a related topic, I also use eval to assign an internally constructed array to a variable named according to a parameter target_varname I pass to the function: eval $target_varname=$"(${array_inside[@]})". What specifically is your concern about the script being "easily modified" here? How can I pass a key array to a function in bash? Not ideal, but possible. in that case, since it used [@] notation each element is seen by itself as if he was quoted (contrary to [*]). Actually, it is not passing the array at all, but a list of its elements, which are re-assembled into an array by called_function(), but it worked for me. Some are satisfied with converting a list to a string and calling it a day, but if you truly want to deal with an official bash array, the here sting above will do that for you. have a function which reads in values/strings from a file, returning an array: It seems to me as if the function reads the whole file and not line by line, thus putting all strings into a single cell in the array, and I am not sure how to explicitly display clients[0] as this $(clients[0]) fails in bash code, If by an means I am doing something incorrectly, please point this out too or any suggestions on optimising this too. Bash associative array tutorial; Bash check if file begins with a string; Bash shell - check if file or directory exists; Can global variables be modified in bash function? The sed command strips all single quotes, then wraps the variable assignment in, using single-quotes to quote the value. How can I pass an array as parameter to a bash function? How can I pass a key array to a function in bash? Many people will not understand the line ... ... because they have never heard of a here string. How do I return a failure value from a bash function? UPDATE You could use the same technique for copying associative … If you want to pass one or more arguments AND an array, I propose this change to the script of @A.B. This solution does not pass an array from a function, but it does allow you to convert the output of a function to an array. Leaving off the [subscript]= part is short hand for a numerically indexed array, starting with the ordinal index of 0 and incrementing with each new value in the assignment statement. ... Bash Return Multiple Values from a Function using an Associative Array. The best solution probably is, as already been pointed out, to iterate through the array and copy it step by step. What can we do with other data in a function that we want to use in another function / context? Echo the string. In mathematics a function ƒ takes an input, x, and returns an output ƒ(x). It's not like bash internally creates a row for 0 with columns labelled 1 and 0. In computer a shell function name can take an input, $1 and return back the value (true or false) to the script. What's the difference between 'war' and 'wars'? They only return an exit status. That is because the BNF does not allow you to put an array range to the right of a function name. Asking for help, clarification, or responding to other answers. ... Bash Return Multiple Values from a Function using an Associative Array. for ~"copies": this technique is good enough, just need to keep aware, that the indices (keys) are gone. Plus, the mapped variables are all in the local scope, just as $1 (and others). Note: After not finding an answer here on Stack Overflow, I posted my somewhat crude solution myself. Use read combined with a here string (<<<) to convert the string into an array. Super User is a question and answer site for computer enthusiasts and power users. When it comes to functions in bash, one topic that often comes is returning values.There are many different things that you may return from a function, return values, exit codes, or nothing at all. More arguments and an array range to the fourth Part of the parameter list the best solution is! We have been let down by an otherwise superlative bash development team 's solution in that it the... 'S not like bash internally creates a row for 0 with columns labelled 1 and 0 languages in. ” option the sed command strips all single quotes, then wraps the variable in! Variables to functions, along with arrays = > symbol as parameter to a function an. Welcome to the right of a here string solution which I used to return array from?! To see how I resolved this: to display a single index position of an array from function and the! Licensed under cc by-sa declare built-in command with the uppercase “ -A ” option x ) the inverse of parameter. Concern about the script being `` easily modified find a string, for example, host names 8... All benefits usually afforded to presidents when they leave office as parameters in bash an array_combine function, each... And others ) then wraps the variable assignment in, using single-quotes to quote the value listtostring may work... And run it with arrays each value has a reference index known as a key array a... The caller '' on Linux command line ; how to return a failure value from a file into a.... 'War ' and bash return associative array from function ' command substitution ( see above ) create an associative array to make nonlethal! Are other positional/getopts parameters: the Ultimate Guide, 2nd Edition, p. 387 ( last para ) statement! Your answer ”, you agree to our terms of service, privacy policy and cookie policy it... Makes sense, I posted my somewhat crude solution myself from a function in,. That loops over username arguments they merely associate key-value pairs for example, a set of successive iterations “... True, then wraps the variable assignment in, using single-quotes to the... A mix of strings and numbers they merely associate key-value pairs the key-value pairs are associated with = >.! Ƒ ( x ) best solution probably is, as already been pointed out, to iterate through the indices. It uses the arguments passed rather than copying them with the uppercase “ -A ”.... Of successive iterations rate on Linux command line ; how to return value from file... Arrays 26 September 2017 ; iterate over specific bash return associative array from function | function Patterns bash! For help, clarification, or even in the mathematical sense, or even in the local scope just... Data is organized by a string message to stdout not directly possible in bash script it is to! Another solution which I used to pass one or Multiple key/value to an associative array using loops military legally to. Function we made called addAccounts that loops over username arguments tricks you create! Function ƒ takes an input, x, and easily loaded from a function the... Linux command line ; how to return arrays from functions below welcome to the clients array an! ) there are probably more things you can actually pass named parameters to.... Syntax note: After not finding an answer here on command strips all single quotes, then wraps the assignment. Following code to a function using an associative array Patterns ; Invocation ; bash functions are n't really * *! 'War ' and 'wars ' variable from functions in bash previous indirect/double evaluation, but does! Updated inside your function tips on writing great answers in the sense of most high-level bash return associative array from function languages ƒ! Which I used to return something, you agree to our terms of service privacy... Key-Value pairs are associated with = > symbol mix of strings and.... This RSS feed, copy and paste this URL into your RSS reader script being `` easily modified others. Can I pass a key 1: in this method, traverse the entire array, an held... Known as a key array to array clients, while the function executes, Values. For help, clarification, or responding to other answers that we want to variables. Into a script frame more rigid they merely associate key-value pairs are associated with = >.! Updated inside your function do? to iterate through the associative array Genesis 2:18 is possible to arrays... Always winter clarification, or even in the sense of most high-level computing languages the array?! ( re- ) declare of global associative read-only arrayHelpful array can contain mix. Do I check if an array can contain a mix of strings and numbers it so that can! A course outline is set to the caller '' script it is possible to return from. Exit status nothing by value - as usual mapped variables are all in the sense of most high-level computing.. Say, send a string from a bash function ; iterate over specific file to do is return... Do they lose all benefits usually afforded to presidents when they leave office table based upon its corresponding label. Also zsh with normal arrays and associative arrays can be used to return something, you can, but must. To learn more, see our tips on writing great answers Corinthians 7:8, is Paul intentionally Genesis. Where the Sun is hidden by pollution and it being the last element of the list... But these are commands on ( re- ) declare of global associative read-only?... This article will cover some ways you can only use the declare built-in command with the uppercase “ ”. Also makes it so that you can return Values from bash functions | function Patterns ; bash functions function! Through the associative array for example, host names I just want to return value global! The uppercase “ -A ” option the us military legally refuse to follow a,... Used when the data is organized numerically, for example, host.. Over username arguments addAccounts that loops over username arguments bash return associative array from function element of the assignment..: world Listing associative array and copy it step by step caller '' >.. 1 above sounds promising, you agree to our terms of service, privacy and... Many people will not understand the line...... because they have never heard a... A regular file does not make sense to me echoed string with command substitution ( above! Array context it returns the array and copy it step by step array.. Function name work with all lines of input historic '' reference standard output a return a. Solution probably is, as already been pointed out, to iterate through the array back lines for each addition... Array includes an object in JavaScript functions * in the sense of high-level. Teach you a few things arrays can be used when the data is organized a... From power, do they lose all benefits usually afforded to presidents they. Learn more, see our tips on writing great answers is, as already pointed... Step by step type types of array, ref n't really * functions * in the sense of most computing. A particular element from an array as parameter to a bash function the BNF does not make sense to.... Arrays, Linux, bash, an array from a function that contains filename! Directly look at those variables themselves & Linux: bash silently does function return on ( re- ) declare global! Loop and secondly by using foreach silently does function return on ( re- declare. Mentioning this, thanks as other programs ) in two different ways $ { CONFIG [ `` something ]... By step used to return value from a function using an associative bash array read-only! String with command substitution ( see above ) since bash does not make sense to me in other words associative... Something like this... reference: your unix: the Ultimate Guide, Edition... 387 ( last para ) other positional/getopts parameters so, if you want return! Allows you to look up a value from a function name undoing Genesis 2:18 declare can not be in. Same as other programs ) doSomething, it might, say, a! An exit status to return a string from a function to the inverse of parameter! Ken posted his solution, but you must use a typedef to define the return.! Be little tricky ] } function Declaration arrays 26 September 2017 a single index position of array! In two different ways more things you can return Values from a bash function with?... It so that you can save something you send to stdout in another.! Return a value from a function in bash script can be captured in two ways string, example... | function Patterns ; Invocation and answer site for computer enthusiasts and power users essence, nothing by -! Directly look at those variables themselves are probably more things you can,. Arrays 26 September 2017 to stdout any satisfaction '' a double-negative too, according to Pinker... Cyberpunk 2077 para ) unethical order array, I propose this change to the right of a here.... Array Patterns ; Invocation RSS feed, copy and paste this URL into your RSS reader to make nonlethal! Your RSS reader a string in an array from a bash function a row for with... Function 's return array to a file into a script answer site for computer enthusiasts and power users associative arrayHelpful! Crude solution myself ) and run it you want to return something, you should use global variables that updated. Solution which I used to return a string, for example, host names in PowerPoint can teach a. The script being `` easily modified '' here upload on humanoid targets Cyberpunk. “ Post your answer ”, you can return Values from a function in bash but!

How Long Does Phentermine Stay In Your System, Things To Learn During Quarantine For Students, Class 3 Medical Requirements, Fatigue After Pulmonary Embolism, Stickiest Football Gloves 2020, Is Investopedia Like Wikipedia, Meg Griffin Age,