Output breaking when returning multiple values


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Output breaking when returning multiple values
# 1  
Old 01-18-2013
Output breaking when returning multiple values

I've been trying to write a command-line function to grab a website's MX records and their ip addresses. The code below works with domains that only have one MX record:

Code:
function kmx { mx=`host -t MX $1 | awk '{ print $7 }'`; 
ip=`host $mx | sed '/IPv6/d;/handled/d' | awk '{ print $4 }'`; 
kdialog --title "KMX" --msgbox "# host -t MX $1
$mx     $ip";}; kmx clone-ozone.com

However, changing the function parameter at the end to google.com or a domain with multiple MX Records breaks the output of the ip addresses.

Tried messing with some arrays and different things to try to get around this but kept getting syntax errors:

Code:
function kmx { mx+=`host -t MX $1 | awk '{ print $7 }'`; 
ip=for i in "${mx[@]}"; do host ${mx[$i]} | sed '/IPv6/d;/handled/d' | awk '{ print $4 }'; done; 
kdialog --title "KMX" --msgbox "# host -t MX $1
bash: syntax error near unexpected token `do'

Perhaps I'm just too tired, but any suggestions would be appreciated.

*Side note, kdialog is KDE only but removing that part should make it runnable from the cli.

Last edited by Azrael; 01-20-2013 at 09:22 AM..
# 2  
Old 01-19-2013
Something like this should work, but it will print only the first name and IP if multiple servers are configured.
If you want them all, you should use ${mxs[@]} ${ips[@]}, instead of ${mxs[0]} ${ips[0]}.
kdialog seem to truncate the text though.

Code:
kmx() {
  mxs=( $( host -t MX "$1" | awk '{ sub(/\.$/, x, $NF); print $NF }' ) )
  ips=( $( for _mx in "${mxs[@]}"; do host "$_mx" | awk '/has address/ { print $NF }'; done ) )
  kdialog --title "KMX" --msgbox "# host -t MX $1 ${mxs[0]} ${ips[0]}"  
}

This User Gave Thanks to radoulov For This Post:
# 3  
Old 01-20-2013
Thank you Radoulov

Kdialog seems to be able to handle the output when given all the specific array elements:

Code:
kmx() {   mxs=( $( host -t MX "$1" | awk '{ sub(/\.$/, x, $NF); print $NF }' ) );   
ips=( $( for _mx in "${mxs[@]}"; do host "$_mx" | awk '/has address/ { print $NF }'; done ) );   
kdialog --title "KMX" --msgbox "# host -t MX $1 
${mxs[0]} ${ips[0]}
${mxs[1]} ${ips[1]}
${mxs[2]} ${ips[2]}
${mxs[3]} ${ips[3]}
${mxs[4]} ${ips[4]}
"  ; }; kmx google.com

Not sure, but I've found that kdialog is white-space specific. Perhaps it broke the output before because it was trying to write a whole array to one line. However, if that was the case it seems it would have not printed all the MX Records with this:

Code:
$ function kmx { mx=`host -t MX $1 | awk '{ print $7 }'`; 
ip=`host $mx | sed '/IPv6/d;/handled/d' | awk '{ print $4 }'`; 
kdialog --title "KMX" --msgbox "# host -t MX $1
$mx $ip";}; kmx google.com

Grant you that breaks the ips, but the $mx should have broken too if that was the case.

I know I could check the length of the array in this function, but I don't know if writing a loop to call each of these elements with kdialog would be possible or not. However, without the code being able to determine the number of MX Records and ip addresses itself would kind of defeat the purpose.

Any further suggestions appreciated.
# 4  
Old 01-20-2013
As I already said, if you want all the array values,
you'll need:

Code:
"# host -t MX $1 ${mx[@]} ${ip[@]}"

Not sure how kdialog will handle all those values.
# 5  
Old 01-20-2013
I did try using "@" to display all the array contents. However, as you suggested that didn't work. That's why I eluded to the use of white space.

It appears my last attempt will work for my purposes, but I would like to understand how to display a full array's contents with kdialog.

Thanks again,
# 6  
Old 01-21-2013
This should work with bash, zsh and ksh93:

Code:
kmx() {
  mxs=( $( host -t MX "$1" | awk '{ sub(/\.$/, x, $NF); print $NF }' ) )
  ips=( $( for _mx in "${mxs[@]}"; do host "$_mx" | awk '/has address/ { print $NF }'; done ) )
  msg=$(
    for ((i = -1; i++ < ${#mxs[@]} - 1;)); do
      printf '%s\t%s\n' "${mxs[i]}" "${ips[i]}"
    done  
    )
  kdialog --title "KMX" --msgbox "# host -t MX $1:
$msg"  
}


Last edited by radoulov; 01-21-2013 at 09:32 AM.. Reason: Corrected.
This User Gave Thanks to radoulov For This Post:
# 7  
Old 01-21-2013
You would think so, but this only seems to return $1 and no mx or ips:

Code:
kmx() {   mxs=( $( host -t MX "$1" | awk '{ sub(/\.$/, x, $NF); print $NF }' ) );   
ips=( $( for _mx in "${mxs[@]}"; do host "$_mx" | awk '/has address/ { print $NF }'; done ) );   
msg=$(
    for ((i = -1; i++ < ${#a[@]} - 1;)); do
      printf '%s\t%s\n' "${mxs[i]}" "${ips[i]}"
    done  
    );   kdialog --title "KMX" --msgbox "# host -t MX $1:
$msg"  ; }; kmx google.com

Good effort on your part though. Just starting to think kdialog may not be all its cracked up to be. Shame as I like the look of it over over APIs bash can use. Perhaps I should research others. Thank you again though.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Read in Multiple log files and output selected variables and values to cvs file

I have several problems with my problems: I hope you can help me. 1) the If else statement I am getting an error message. My syntax must be incorrect because the entire statement is throwing an error. For example in filew.log if these items don't exist Memsize, SASFoundation and also if... (0 Replies)
Discussion started by: dellanicholson
0 Replies

2. Shell Programming and Scripting

Extract multiple values from a tnsping output

Hi all, Can anyone help with the following request? I need to extract HOST value, SERVICE_NAME and msec value from a tnsping output and append to a file. The tnsping output is typically as follows: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS =... (4 Replies)
Discussion started by: jonnyd
4 Replies

3. Shell Programming and Scripting

Returning multiple values in Shell

Hi I have a code as the following #!/usr/bin/ksh set -x row() { a=$1 b=$2 c=$(($a + $b)) d=$(($a * $b)) echo $a $b } e=`row 2 3` set $e echo "The value of c is $c" echo "The value of d is $d" My requirement is I need to pass two arguments to a function and return two values... (5 Replies)
Discussion started by: Priya Amaresh
5 Replies

4. Shell Programming and Scripting

Returning and capturing multiple return values from a function

Hi I am pretty confused in returning and capturing multiple values i have defined a function which should return values "total, difference" i have used as #!/usr/bin/ksh calc() { total=$1+$2 echo "$total" diff=$2-$1 echo "$diff" } I have invoked this function as calc 5 8 Now i... (2 Replies)
Discussion started by: Priya Amaresh
2 Replies

5. UNIX for Dummies Questions & Answers

For loop returning more values

Hi All, Thanks all of you for the help you provide to me. Well, I have one more problem, where I am trying to pull file system information in the loop and display the filesystem percentege. I am using following code to achive this, nut it's giving the weired output. My file system is ... (1 Reply)
Discussion started by: alok.behria
1 Replies

6. Shell Programming and Scripting

Breaking a column's value into multiple rows

Hello Friends, I am trying to implement the following using UNIX. I am getting a sequential file as input which would have two columns, "Name" and "Countries Visited". The "Countries Visisted" field will be multi-valued, each value separated by a space and also the number of values are not... (2 Replies)
Discussion started by: mehimadri
2 Replies

7. Programming

returning multiple values from a function in C

hi how can I return multiple values from a C function. I tried the following: #include <stdio.h> void foo(int id, char *first_name, char *last_name) { /* this is just an example to illustrate my problem... real code makes use of the "id" parameter. */ first_name = (char... (8 Replies)
Discussion started by: Andrewkl
8 Replies

8. Shell Programming and Scripting

awk/nawk returning decimal values?

Hi Running a specific nawk statement over a 17m lines files returns the following: /bin/nawk: not enough args in ..... input record number 1,25955e+06, file test.1 source line number 1 I'd like to report the line number (in bold above) in decimal not floating so that i can spot it out. ... (1 Reply)
Discussion started by: moutaye
1 Replies

9. UNIX for Dummies Questions & Answers

Breaking output for specific pattern

Respected Sirs, I have a text file which is unfortunately unformatted. I have something like 191728/02/06226278 191828/02/06226279 191928/02/06226280 192028/02/06226281 192128/02/06226282 Can some one suggest me the way so that I can store 1917 28/02/06 226278 in different... (2 Replies)
Discussion started by: shoeb_syed
2 Replies

10. Shell Programming and Scripting

Returning Values (shell Script)

I have an application on Informix 4GL, and I am invoking the shell script from the program, but I need to know if the shell script work fine or not, in order to continue the process. I know that we can use $? to get the final status but this is on unix command. How can I return a value from the... (3 Replies)
Discussion started by: jennifer01
3 Replies
Login or Register to Ask a Question